2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
19 * @file FMedia_CameraCoordinator.cpp
20 * @brief This file contains the implementation of the %FMedia_CameraCoordinator class.
23 #include <FBaseSysLog.h>
24 #include "FMedia_CameraManager.h"
25 #include "FMedia_RecorderManager.h"
26 #include "FMedia_CameraCoordinator.h"
27 #include "FMedia_ICameraCoordinatorListener.h"
28 #include "FMedia_CameraUtil.h"
29 #include "FMedia_RecorderUtil.h"
31 using namespace Tizen::Base;
32 using namespace Tizen::Base::Collection;
34 namespace Tizen { namespace Media
36 static const int _ORIENTATION_FOR_RECORDING = 0x1;
37 static const int _ORIENTATION_FOR_CAMERA = 0x1 << 1;
39 typedef int (*_CameraFunc)(_CameraHandle mmHandle);
43 camera_state_e prevState;
44 camera_state_e postState;
46 }_CameraStateTransitTable;
48 static const _CameraStateTransitTable _CAMERA_STATE_TRANSIT[] =
50 {::CAMERA_STATE_CREATED, ::CAMERA_STATE_PREVIEW, camera_start_preview },
51 {::CAMERA_STATE_CAPTURED, ::CAMERA_STATE_PREVIEW, camera_start_preview },
52 {::CAMERA_STATE_CAPTURED, ::CAMERA_STATE_CREATED, camera_stop_preview },
53 {::CAMERA_STATE_PREVIEW, ::CAMERA_STATE_CREATED, camera_stop_preview },
56 typedef int (*_RecorderFunc)(_RecorderHandle mmHandle);
60 recorder_state_e prevState;
61 recorder_state_e postState;
63 }_RecorderStateTransitTable;
65 static const _RecorderStateTransitTable _RECORDER_STATE_TRANSIT[] =
67 {::RECORDER_STATE_CREATED, ::RECORDER_STATE_READY, recorder_prepare },
68 {::RECORDER_STATE_READY, ::RECORDER_STATE_RECORDING, recorder_start },
69 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_PAUSED, recorder_pause },
70 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, recorder_commit },
71 // {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, recorder_cancel },
72 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, recorder_commit },
73 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, recorder_cancel },
74 {::RECORDER_STATE_READY, ::RECORDER_STATE_CREATED, recorder_unprepare },
77 _CameraCoordinatorSafeHashMapT* _CameraCoordinator::__pMap = null;
79 _CameraCoordinatorSafeHashMapT::_CameraCoordinatorSafeHashMapT(void)
83 _CameraCoordinatorSafeHashMapT::~_CameraCoordinatorSafeHashMapT(void)
86 _CameraCoordinator::__pMap = null;
90 _CameraCoordinatorSafeHashMapT::RemoveItems(void)
92 _CameraCoordinator* pCoordinator = null;
95 std::unique_ptr <IListT <_CameraDeviceType>, _ListPtrUtil::Remover> pList (GetKeysN(), _ListPtrUtil::remover);
96 SysTryReturnVoidResult(NID_MEDIA, pList.get() != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] There is no instance.");
97 for (int i = 0; i < GetCount(); i++)
99 _CameraDeviceType deviceType = _CAMERA_DEVICE_NONE;
100 r = pList->GetAt(i, deviceType);
101 if (IsFailed(r) && deviceType == _CAMERA_DEVICE_NONE)
106 r = GetValue(deviceType, pCoordinator);
107 if (IsFailed(r) && pCoordinator == null)
115 _CameraCoordinator::_CameraCoordinator()
116 : __cameraDevice(_CAMERA_DEVICE_NONE)
117 , __cameraHandle(MM_INVALID_HANDLE)
118 , __recorderHandle(MM_INVALID_HANDLE)
119 , __mode(_CAMERA_MODE_NONE)
120 , __pListenerList(null, _ListPtrUtil::remover)
121 , __reloadCameraPreviewFormat(::CAMERA_PIXEL_FORMAT_I420)
125 _CameraCoordinator::~_CameraCoordinator()
127 _CameraManager::Release(__cameraDevice);
128 SysLog(NID_MEDIA, "Camera manager released");
132 _CameraCoordinator::Construct(_CameraDeviceType cameraDevice)
134 result r = E_SUCCESS;
135 _CameraManager* pCameraManager = null;
136 SysLog(NID_MEDIA, "Enter. camera device:%d", cameraDevice);
138 pCameraManager = _CameraManager::AddInstance(cameraDevice);
140 SysTryReturn(NID_MEDIA, pCameraManager !=null && r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
142 __cameraHandle = pCameraManager->GetHandle();
144 __pListenerList.reset(new (std::nothrow) LinkedListT <_ICameraCoordinatorListener*>());
145 SysTryReturn(NID_MEDIA, __pListenerList.get() !=null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
147 __cameraDevice = cameraDevice;
148 __mode = _CAMERA_MODE_IMAGE;
154 _CameraCoordinator::AddRecorder(_RecorderDeviceType recorderDevice)
156 result r = E_SUCCESS;
157 _RecorderManager* pRecorderManager = null;
158 SysLog(NID_MEDIA, "Enter. recorder device:%d", recorderDevice);
160 pRecorderManager = _RecorderManager::AddInstance(recorderDevice);
162 SysTryCatch(NID_MEDIA, pRecorderManager !=null && r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
164 __recorderHandle = pRecorderManager->GetHandle(); // new recorder handle
173 _CameraCoordinator::RemoveRecorder(_RecorderDeviceType recorderDevice)
175 SysLog(NID_MEDIA, "Enter. recorder device:%d", recorderDevice);
176 _RecorderManager::Release(recorderDevice);
177 if (_RecorderManager::HasInstance(recorderDevice) == null)
179 __recorderHandle = MM_INVALID_HANDLE;
184 _CameraCoordinator::AddInstance(_CameraDeviceType cameraDevice)
186 result r = E_SUCCESS;
190 static bool isMapConstructed = false;
191 static _CameraCoordinatorSafeHashMapT map;
192 _CameraCoordinator* pCoordinator = null;
194 SysTryReturn(NID_MEDIA, cameraDevice > _CAMERA_DEVICE_NONE && cameraDevice < _CAMERA_DEVICE_MAX,
195 null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(camderDevice) is used. camderDevice:%d is wrong.", cameraDevice);
197 if (!isMapConstructed)
200 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
201 isMapConstructed = true;
205 r = map.ContainsKey(cameraDevice, out);
206 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
210 r = map.GetValue(cameraDevice, pCoordinator);
211 SysTryReturn(NID_MEDIA, r == E_SUCCESS && pCoordinator != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
215 std::unique_ptr <_CameraCoordinator> pCoord (new (std::nothrow) _CameraCoordinator());
216 SysTryReturn(NID_MEDIA, pCoord.get() !=null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
218 r = pCoord->Construct(cameraDevice);
219 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
221 r = map.Add(cameraDevice, pCoord.get());
222 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
224 pCoordinator = pCoord.release();
227 pCoordinator->AddRefCount();
232 _CameraCoordinator::AddInstance(_RecorderDeviceType recorderDevice)
234 _CameraCoordinator* pCoordinator = null;
235 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
238 switch (recorderDevice)
240 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
241 cameraDevice = _CAMERA_DEVICE_PRIMARY;
244 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
245 cameraDevice = _CAMERA_DEVICE_SECONDARY;
252 if (cameraDevice == _CAMERA_DEVICE_NONE)
254 SysLogException(NID_MEDIA, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(recorderDevice) is used. recorderDevice :%d is wrong.", recorderDevice);
258 pCoordinator = AddInstance(cameraDevice);
259 if (pCoordinator == null)
261 SysLogException(NID_MEDIA, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The camera device(%d)'s coordinator is not available.", cameraDevice);
268 _CameraCoordinator::Release(_CameraDeviceType cameraDevice)
270 result r = E_SUCCESS;
274 _CameraCoordinator* pCoordinator = null;
275 r = __pMap->GetValue(cameraDevice, pCoordinator);
276 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
278 if (pCoordinator->ReleaseRefCount() == 0)
281 r = __pMap->Remove(cameraDevice);
282 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
288 _CameraCoordinator::Release(_RecorderDeviceType recorderDevice)
292 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
294 switch (recorderDevice)
296 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
297 cameraDevice = _CAMERA_DEVICE_PRIMARY;
299 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
300 cameraDevice = _CAMERA_DEVICE_SECONDARY;
306 Release(cameraDevice);
311 _CameraCoordinator::HasInstance(_CameraDeviceType cameraDevice)
313 result r = E_SUCCESS;
314 _CameraCoordinator* pCoordinator = null;
318 SysTryReturn(NID_MEDIA, cameraDevice > _CAMERA_DEVICE_NONE && cameraDevice < _CAMERA_DEVICE_MAX,
319 null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(camderDevice) is used. camderDevice:%d is wrong.", cameraDevice);
320 SysTryReturn(NID_MEDIA, __pMap != null, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] No coordinator was created.");
322 r = __pMap->ContainsKey(cameraDevice, out);
323 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
324 SysTryCatch(NID_MEDIA, out == true, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Camera device(%d) was not created.", cameraDevice);
326 r = __pMap->GetValue(cameraDevice, pCoordinator);
327 SysTryCatch(NID_MEDIA, r == E_SUCCESS && pCoordinator != null, , r, "[%s] Propagating.", GetErrorMessage(r));
336 _CameraCoordinator::HasInstance(_RecorderDeviceType recorderDevice)
338 _CameraCoordinator* pCoordinator = null;
339 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
342 switch (recorderDevice)
344 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
345 cameraDevice = _CAMERA_DEVICE_PRIMARY;
348 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
349 cameraDevice = _CAMERA_DEVICE_SECONDARY;
356 if (cameraDevice == _CAMERA_DEVICE_NONE)
358 SysLogException(NID_MEDIA, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(recorderDevice) is used. recorderDevice :%d is wrong.", recorderDevice);
362 pCoordinator = HasInstance(cameraDevice);
363 if (pCoordinator == null)
365 SysLogException(NID_MEDIA, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The camera device(%d)'s coordinator is not available.", cameraDevice);
372 _CameraCoordinator::AddCameraCoordinatorListener(_ICameraCoordinatorListener& listener)
374 result r = E_SUCCESS;
375 r = __pListenerList->Add(&listener);
376 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
381 _CameraCoordinator::RemoveCameraCoordinatorListener(_ICameraCoordinatorListener& listener)
383 result r = E_SUCCESS;
384 r = __pListenerList->Remove(&listener);
385 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
387 r = NotifyOtherRemoved();
388 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
393 _CameraCoordinator::GetMode(void) const
399 _CameraCoordinator::GetCameraHandle(void) const
401 return __cameraHandle;
405 _CameraCoordinator::GetRecorderHandle(void) const
407 return __recorderHandle;
411 _CameraCoordinator::NotifyModeChangePrepared(_CameraMode mode)
413 result r = E_SUCCESS;
414 _ICameraCoordinatorListener* pListener = null;
415 SysLog(NID_MEDIA, "mode:%d", mode);
417 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
418 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
420 while (pEnum->MoveNext() == E_SUCCESS)
422 r = pEnum->GetCurrent(pListener);
423 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
424 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
426 r = pListener->OnCameraCoordinatorModeChangePrepared(mode);
427 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
433 _CameraCoordinator::NotifyModeChanged(_CameraMode mode)
435 result r = E_SUCCESS;
436 _ICameraCoordinatorListener* pListener = null;
437 SysLog(NID_MEDIA, "mode:%d", mode);
439 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
440 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
442 while (pEnum->MoveNext() == E_SUCCESS)
444 r = pEnum->GetCurrent(pListener);
445 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
446 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
448 r = pListener->OnCameraCoordinatorModeChanged(mode);
449 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
455 _CameraCoordinator::NotifyOtherRemoved(void)
457 result r = E_SUCCESS;
458 _ICameraCoordinatorListener* pListener = null;
459 SysLog(NID_MEDIA, "Enter");
461 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
462 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
464 while (pEnum->MoveNext() == E_SUCCESS)
466 r = pEnum->GetCurrent(pListener);
467 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
468 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
470 r = pListener->OnCameraCoordinatorOtherRemoved();
471 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
477 _CameraCoordinator::StartMmPreview(void)
479 result r = E_SUCCESS;
480 SysLog(NID_MEDIA, "Enter. mode:%d", __mode);
484 case _CAMERA_MODE_IMAGE:
485 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
486 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
489 case _CAMERA_MODE_VIDEO:
490 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
491 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
495 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] Camera is in an invalid state. Camcorder mode :%d is wrong", __mode);
505 _CameraCoordinator::StopMmPreview(void)
507 result r = E_SUCCESS;
508 SysLog(NID_MEDIA, "Enter.");
510 if (__mode == _CAMERA_MODE_IMAGE)
512 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
513 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
515 else if (__mode == _CAMERA_MODE_VIDEO)
517 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
518 recorderState = GetRecorderState();
520 switch (recorderState)
522 case ::RECORDER_STATE_RECORDING:
523 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
524 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
526 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
527 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
530 case ::RECORDER_STATE_READY:
531 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
532 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
537 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] recorderState is in an invalid state. recorderState:%d", recorderState);
544 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] CamcorderMode is in an invalid state. mode :%d", __mode);
552 _CameraCoordinator::CreateVideoRecorder(void)
554 result r = E_SUCCESS;
555 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
556 SysLog(NID_MEDIA, "enter.");
559 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
560 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
561 r = AddRecorder(recorderDevice); // recorder_create() will be called.
562 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
563 __mode = _CAMERA_MODE_VIDEO;
571 _CameraCoordinator::DestroyVideoRecorder(void)
573 result r = E_SUCCESS;
574 int err = MM_SUCCESS;
575 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
576 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
577 SysLog(NID_MEDIA, "enter.");
579 if ( __recorderHandle != MM_INVALID_HANDLE )
581 recorderState = GetRecorderState();
583 switch (recorderState)
585 case ::RECORDER_STATE_NONE:
588 case ::RECORDER_STATE_CREATED:
590 case ::RECORDER_STATE_READY:
591 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
592 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
593 RemoveRecorder(recorderDevice);
594 __mode = _CAMERA_MODE_IMAGE;
597 case ::RECORDER_STATE_RECORDING:
599 case ::RECORDER_STATE_PAUSED:
600 err = recorder_cancel(__recorderHandle);
601 r = ConvertResult(err);
602 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
603 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
604 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
605 RemoveRecorder(recorderDevice);
606 __mode = _CAMERA_MODE_IMAGE;
621 _CameraCoordinator::ChangeFormat(_CameraMode mode, bool callback, camera_pixel_format_e reloadCameraPreviewFormat)
623 result r = E_SUCCESS;
624 int err = MM_SUCCESS;
625 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
626 camera_state_e cameraState = ::CAMERA_STATE_NONE;
627 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
628 SysLog(NID_MEDIA, "enter. mode:%d, callback:%d, reloadCameraPreviewFormat:%d", mode, callback, reloadCameraPreviewFormat);
630 if (mode == _CAMERA_MODE_VIDEO)
632 cameraState = GetCameraState();
636 case ::CAMERA_STATE_CREATED:
638 case ::CAMERA_STATE_NONE:
641 case ::CAMERA_STATE_PREVIEW:
643 case ::CAMERA_STATE_CAPTURED:
644 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
645 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
648 case ::CAMERA_STATE_CAPTURING:
650 SysLogException(NID_MEDIA, r, "[E_INVALID_STATE] cameraState(%d) is in an invalid state. While the camera is capturing, the mode cannot be changed.", cameraState);
658 __mode = _CAMERA_MODE_VIDEO;
659 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
662 r = NotifyModeChangePrepared(mode);
663 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
668 case ::CAMERA_STATE_NONE:
670 case ::CAMERA_STATE_CREATED:
673 case ::CAMERA_STATE_PREVIEW:
674 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
675 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
678 case ::CAMERA_STATE_CAPTURED:
683 else if ( mode == _CAMERA_MODE_IMAGE )
685 recorderState = GetRecorderState();
687 switch (recorderState)
689 case ::RECORDER_STATE_NONE:
691 case ::RECORDER_STATE_CREATED:
692 __mode = _CAMERA_MODE_IMAGE;
693 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
696 r = NotifyModeChangePrepared(mode);
697 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
701 case ::RECORDER_STATE_READY:
702 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
703 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
705 __mode = _CAMERA_MODE_IMAGE;
706 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
709 r = NotifyModeChangePrepared(mode);
710 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
712 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
713 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
716 case ::RECORDER_STATE_RECORDING:
718 case ::RECORDER_STATE_PAUSED:
719 err = recorder_cancel(__recorderHandle); // TODO
720 r = ConvertResult(err);
721 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
723 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
724 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
725 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
726 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
728 __mode = _CAMERA_MODE_IMAGE;
729 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
732 r = NotifyModeChangePrepared(mode);
733 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
735 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
736 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
746 // Notify that the mode is changed to callback camera and video recorder's configurations.
747 r = NotifyModeChanged(mode);
748 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
756 _CameraCoordinator::ChangeMode(_CameraMode mode, bool callback)
758 result r = E_SUCCESS;
759 camera_state_e cameraState = ::CAMERA_STATE_NONE;
760 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
761 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
762 int err = MM_SUCCESS;
764 SysLog(NID_MEDIA, "Mode should be changed. mode:%d", mode);
765 if (mode == _CAMERA_MODE_VIDEO)
767 cameraState = GetCameraState();
771 case ::CAMERA_STATE_CREATED:
773 case ::CAMERA_STATE_NONE:
776 case ::CAMERA_STATE_PREVIEW:
778 case ::CAMERA_STATE_CAPTURED:
779 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
780 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
783 case ::CAMERA_STATE_CAPTURING:
785 SysLogException(NID_MEDIA, r, "[E_INVALID_STATE] cameraState(%d) is in an invalid state. While the camera is capturing, the mode cannot be changed.", cameraState);
794 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
795 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
796 r = AddRecorder(recorderDevice); // recorder_create() will be called.
797 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
798 __mode = _CAMERA_MODE_VIDEO;
802 r = NotifyModeChangePrepared(mode);
803 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
808 case ::CAMERA_STATE_NONE:
810 case ::CAMERA_STATE_CREATED:
813 case ::CAMERA_STATE_PREVIEW:
814 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
815 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
818 case ::CAMERA_STATE_CAPTURED:
823 else if ( mode == _CAMERA_MODE_IMAGE )
825 recorderState = GetRecorderState();
828 switch (recorderState)
830 case ::RECORDER_STATE_NONE:
833 case ::RECORDER_STATE_CREATED:
834 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
835 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
836 RemoveRecorder(recorderDevice); // the mode will be changed to IMAGE.
837 __mode = _CAMERA_MODE_IMAGE;
840 case ::RECORDER_STATE_READY:
841 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
842 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
844 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
845 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
846 RemoveRecorder(recorderDevice);
847 __mode = _CAMERA_MODE_IMAGE;
850 r = NotifyModeChangePrepared(mode);
851 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
853 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
854 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
857 case ::RECORDER_STATE_RECORDING:
859 case ::RECORDER_STATE_PAUSED:
860 err = recorder_cancel(__recorderHandle); // TODO
861 r = ConvertResult(err);
862 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
864 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
865 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
866 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
867 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
869 RemoveRecorder(recorderDevice);
870 __mode = _CAMERA_MODE_IMAGE;
873 r = NotifyModeChangePrepared(mode);
874 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
876 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
877 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
887 // Notify that the mode is changed to callback camera and video recorder's configurations.
888 r = NotifyModeChanged(mode);
889 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
899 _CameraCoordinator::IsCalmChangeMode(_CameraMode mode)
901 camera_state_e cameraState = ::CAMERA_STATE_NONE;
902 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
903 bool calmChange = false;
905 if (mode == _CAMERA_MODE_VIDEO)
907 cameraState = GetCameraState();
911 case ::CAMERA_STATE_CREATED:
913 case ::CAMERA_STATE_NONE:
917 case ::CAMERA_STATE_PREVIEW:
919 case ::CAMERA_STATE_CAPTURED:
921 case ::CAMERA_STATE_CAPTURING:
929 else if ( mode == _CAMERA_MODE_IMAGE )
931 recorderState = GetRecorderState();
934 switch (recorderState)
936 case ::RECORDER_STATE_NONE:
938 case ::RECORDER_STATE_CREATED:
942 case ::RECORDER_STATE_READY:
944 case ::RECORDER_STATE_RECORDING:
946 case ::RECORDER_STATE_PAUSED:
955 SysLog(NID_MEDIA, "mode:%d, calm:%d", mode, calmChange);
961 _CameraCoordinator::GetCameraDevice(void) const
963 return __cameraDevice;
967 _CameraCoordinator::GetCameraState(void) const
969 result r = E_SUCCESS;
970 int err = MM_SUCCESS;
971 camera_state_e state = ::CAMERA_STATE_NONE;
973 err = camera_get_state(__cameraHandle, &state);
974 r = ConvertResult(err);
975 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
980 return ::CAMERA_STATE_NONE;
984 _CameraCoordinator::GetRecorderState(void) const
986 result r = E_SUCCESS;
987 int err = MM_SUCCESS;
988 recorder_state_e state = ::RECORDER_STATE_NONE;
990 err = recorder_get_state(__recorderHandle, &state);
991 r = ConvertResult(err);
992 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
997 return ::RECORDER_STATE_NONE;
1001 _CameraCoordinator::ConvertResult(int err) const
1003 result r = E_SYSTEM;
1004 if (err != CAMERA_ERROR_NONE)
1006 SysLog(NID_MEDIA, "MM Err:0x%x", err);
1010 if (err == CAMERA_ERROR_NONE || err == RECORDER_ERROR_NONE)
1014 else if (err == CAMERA_ERROR_INVALID_PARAMETER || err == RECORDER_ERROR_INVALID_PARAMETER)
1018 else if (err == CAMERA_ERROR_INVALID_STATE || err == RECORDER_ERROR_INVALID_STATE)
1020 r = E_INVALID_STATE;
1022 else if (err == CAMERA_ERROR_OUT_OF_MEMORY || err == RECORDER_ERROR_OUT_OF_MEMORY)
1024 r = E_OUT_OF_MEMORY;
1026 else if (err == CAMERA_ERROR_DEVICE || err == RECORDER_ERROR_DEVICE)
1028 r = E_DEVICE_FAILED;
1030 else if (err == CAMERA_ERROR_INVALID_OPERATION
1031 || err == CAMERA_ERROR_SECURITY_RESTRICTED
1032 || err == RECORDER_ERROR_INVALID_OPERATION
1033 || err == RECORDER_ERROR_SECURITY_RESTRICTED)
1037 else if (err == CAMERA_ERROR_DEVICE_BUSY
1038 || err == CAMERA_ERROR_SOUND_POLICY
1039 || err == RECORDER_ERROR_SOUND_POLICY)
1043 else if (err == CAMERA_ERROR_DEVICE_NOT_FOUND)
1045 r = E_DEVICE_UNAVAILABLE;
1057 _CameraCoordinator::ChangeCameraStateTo(camera_state_e destState)
1059 result r = E_SUCCESS;
1060 int tableTotalCount = 0;
1062 int err = MM_SUCCESS;
1063 camera_state_e preState = ::CAMERA_STATE_NONE;
1064 camera_state_e postState = ::CAMERA_STATE_NONE;
1066 preState = GetCameraState();
1067 tableTotalCount = sizeof(_CAMERA_STATE_TRANSIT) / sizeof(_CAMERA_STATE_TRANSIT[0]);
1068 SysLog(NID_MEDIA, " PreState:%d, destState:%d, tableTotalCount:%d", preState, destState, tableTotalCount);
1070 for (i = 0; i < tableTotalCount; i++)
1072 if (preState == _CAMERA_STATE_TRANSIT[i].prevState && destState == _CAMERA_STATE_TRANSIT[i].postState)
1074 if (_CAMERA_STATE_TRANSIT[i].pFunc != null)
1077 "Exist the matching state field. loop i:%d, current state:%d, destState:%d", i,
1078 preState, destState);
1079 err = _CAMERA_STATE_TRANSIT[i].pFunc(__cameraHandle);
1080 r = ConvertResult(err);
1081 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1083 // Check whether the retuned states are destinationed states.
1084 postState = GetCameraState();
1085 SysTryCatch(NID_MEDIA, destState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1086 "[E_INVALID_STATE] camera_state_e of C-API is in an invalid state. result preState:%d, is different from the desired state:%d", postState,
1088 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result postState:%d, param destState:%d", postState,
1095 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1099 SysLog(NID_MEDIA, "[%s] Real preState:%d, param destState:%d", GetErrorMessage(r), preState, destState);
1104 _CameraCoordinator::ChangeRecorderStateTo(recorder_state_e destState)
1106 result r = E_SUCCESS;
1107 int tableTotalCount = 0;
1109 int err = MM_SUCCESS;
1110 recorder_state_e preState = ::RECORDER_STATE_NONE;
1111 recorder_state_e postState = ::RECORDER_STATE_NONE;
1113 preState = GetRecorderState();
1114 tableTotalCount = sizeof(_RECORDER_STATE_TRANSIT) / sizeof(_RECORDER_STATE_TRANSIT[0]);
1115 SysLog(NID_MEDIA, " PreState:%d, destState:%d, tableTotalCount:%d", preState, destState, tableTotalCount);
1117 for (i = 0; i < tableTotalCount; i++)
1119 if (preState == _RECORDER_STATE_TRANSIT[i].prevState && destState == _RECORDER_STATE_TRANSIT[i].postState)
1121 if (_RECORDER_STATE_TRANSIT[i].pFunc != null)
1124 "Exist the matching state field. loop i:%d, current state:%d, destState:%d", i,
1125 preState, destState);
1126 err = _RECORDER_STATE_TRANSIT[i].pFunc(__recorderHandle);
1127 r = ConvertResult(err);
1128 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1130 // Check whether the retuned states are destinationed states.
1131 postState = GetRecorderState();
1132 SysTryCatch(NID_MEDIA, destState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1133 "[E_INVALID_STATE] recorder_state_e of C-API is in an invalid state. result preState:%d, is different from the desired state:%d", postState,
1135 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result preState:%d, param destState:%d", postState,
1142 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1146 SysLog(NID_MEDIA, "[%s] Real preState:%d, param destState:%d", GetErrorMessage(r), preState, destState);
1151 _CameraCoordinator::SetCameraSourceFormat(camera_pixel_format_e pixelFormat)
1153 result r = E_SUCCESS;
1154 int err = MM_SUCCESS;
1155 SysLog(NID_MEDIA, "Camera_pixel_format_e is :%d", pixelFormat);
1157 err = camera_set_preview_format(__cameraHandle, pixelFormat);
1158 r = ConvertResult(err);
1159 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating, pixelFormat:%d", GetErrorMessage(r), pixelFormat);
1167 camera_pixel_format_e
1168 _CameraCoordinator::GetCameraSourceFormat(void) const
1170 result r = E_SUCCESS;
1171 int err = MM_SUCCESS;
1172 camera_pixel_format_e pixelFormat = CAMERA_PIXEL_FORMAT_INVALID;
1174 err = camera_get_preview_format(__cameraHandle, &pixelFormat);
1175 r = ConvertResult(err);
1176 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
1185 _CameraCoordinator::StartCapture(camera_capturing_cb capturingCb , camera_capture_completed_cb completedCb , void *pUserData)
1187 result r = E_SUCCESS;
1188 int err = MM_SUCCESS;
1190 __mode = _CAMERA_MODE_IMAGE;
1191 err = camera_start_capture(__cameraHandle, capturingCb, completedCb, pUserData);
1192 r = ConvertResult(err);
1193 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camera capture failed.", GetErrorMessage(r));
1199 _CameraCoordinator::StartRecord(void)
1201 result r = E_SUCCESS;
1202 int err = MM_SUCCESS;
1204 __mode = _CAMERA_MODE_VIDEO;
1205 err = recorder_start(__recorderHandle);
1206 r = ConvertResult(err);
1207 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Recorder record failed.", GetErrorMessage(r));
1212 camera_pixel_format_e
1213 _CameraCoordinator::GetReloadPreviewFormat(void) const
1215 SysLog(NID_MEDIA, "reloadCameraPreviewFormat is :%d", __reloadCameraPreviewFormat);
1216 return __reloadCameraPreviewFormat;