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 //#define _VIDEO_RECORDER_ROTATION_
33 using namespace Tizen::Base;
34 using namespace Tizen::Base::Collection;
36 namespace Tizen { namespace Media
38 static const int _ORIENTATION_FOR_RECORDING = 0x1;
39 static const int _ORIENTATION_FOR_CAMERA = 0x1 << 1;
41 typedef int (*_CameraFunc)(_CameraHandle mmHandle);
45 camera_state_e prevState;
46 camera_state_e postState;
48 }_CameraStateTransitTable;
50 static const _CameraStateTransitTable _CAMERA_STATE_TRANSIT[] =
52 {::CAMERA_STATE_CREATED, ::CAMERA_STATE_PREVIEW, camera_start_preview },
53 {::CAMERA_STATE_CAPTURED, ::CAMERA_STATE_PREVIEW, camera_start_preview },
54 {::CAMERA_STATE_CAPTURED, ::CAMERA_STATE_CREATED, camera_stop_preview },
55 {::CAMERA_STATE_PREVIEW, ::CAMERA_STATE_CREATED, camera_stop_preview },
58 typedef int (*_RecorderFunc)(_RecorderHandle mmHandle);
62 recorder_state_e prevState;
63 recorder_state_e postState;
65 }_RecorderStateTransitTable;
67 static const _RecorderStateTransitTable _RECORDER_STATE_TRANSIT[] =
69 {::RECORDER_STATE_CREATED, ::RECORDER_STATE_READY, recorder_prepare },
70 {::RECORDER_STATE_READY, ::RECORDER_STATE_RECORDING, recorder_start },
71 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_PAUSED, recorder_pause },
72 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, recorder_commit },
73 // {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, recorder_cancel },
74 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, recorder_commit },
75 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, recorder_cancel },
76 {::RECORDER_STATE_READY, ::RECORDER_STATE_CREATED, recorder_unprepare },
79 _CameraCoordinatorSafeHashMapT* _CameraCoordinator::__pMap = null;
81 _CameraCoordinatorSafeHashMapT::_CameraCoordinatorSafeHashMapT(void)
85 _CameraCoordinatorSafeHashMapT::~_CameraCoordinatorSafeHashMapT(void)
88 _CameraCoordinator::__pMap = null;
92 _CameraCoordinatorSafeHashMapT::RemoveItems(void)
94 _CameraCoordinator* pCoordinator = null;
97 std::unique_ptr <IListT <_CameraDeviceType>, _ListPtrUtil::Remover> pList (GetKeysN(), _ListPtrUtil::remover);
98 SysTryReturnVoidResult(NID_MEDIA, pList.get() != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] There is no instance.");
99 for (int i = 0; i < GetCount(); i++)
101 _CameraDeviceType deviceType = _CAMERA_DEVICE_NONE;
102 r = pList->GetAt(i, deviceType);
103 if (IsFailed(r) && deviceType == _CAMERA_DEVICE_NONE)
108 r = GetValue(deviceType, pCoordinator);
109 if (IsFailed(r) && pCoordinator == null)
117 _CameraCoordinator::_CameraCoordinator()
118 : __cameraDevice(_CAMERA_DEVICE_NONE)
119 , __cameraHandle(MM_INVALID_HANDLE)
120 , __recorderHandle(MM_INVALID_HANDLE)
121 , __mode(_CAMERA_MODE_NONE)
122 , __pListenerList(null, _ListPtrUtil::remover)
123 , __orientationFlag(0)
124 , __cameraOrientation(CAMERA_EXIF_ORIENTATION_TOP_LEFT)
125 , __recordingRotation(RECORDING_ROTATION_NONE)
126 , __reloadCameraPreviewFormat(::CAMERA_PIXEL_FORMAT_I420)
130 _CameraCoordinator::~_CameraCoordinator()
132 _CameraManager::Release(__cameraDevice);
133 SysLog(NID_MEDIA, "Camera manager released");
137 _CameraCoordinator::Construct(_CameraDeviceType cameraDevice)
139 result r = E_SUCCESS;
140 _CameraManager* pCameraManager = null;
141 SysLog(NID_MEDIA, "Enter. camera device:%d", cameraDevice);
143 pCameraManager = _CameraManager::AddInstance(cameraDevice);
145 SysTryReturn(NID_MEDIA, pCameraManager !=null && r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
147 __cameraHandle = pCameraManager->GetHandle();
149 __pListenerList.reset(new (std::nothrow) LinkedListT <_ICameraCoordinatorListener*>());
150 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.");
152 __cameraDevice = cameraDevice;
153 __mode = _CAMERA_MODE_IMAGE;
159 _CameraCoordinator::AddRecorder(_RecorderDeviceType recorderDevice)
161 result r = E_SUCCESS;
162 _RecorderManager* pRecorderManager = null;
163 SysLog(NID_MEDIA, "Enter. recorder device:%d", recorderDevice);
165 pRecorderManager = _RecorderManager::AddInstance(recorderDevice);
167 SysTryCatch(NID_MEDIA, pRecorderManager !=null && r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
169 __recorderHandle = pRecorderManager->GetHandle(); // new recorder handle
178 _CameraCoordinator::RemoveRecorder(_RecorderDeviceType recorderDevice)
180 SysLog(NID_MEDIA, "Enter. recorder device:%d", recorderDevice);
181 _RecorderManager::Release(recorderDevice);
182 __recorderHandle = MM_INVALID_HANDLE;
183 __orientationFlag = __orientationFlag & (~_ORIENTATION_FOR_RECORDING);
187 _CameraCoordinator::AddInstance(_CameraDeviceType cameraDevice)
189 result r = E_SUCCESS;
193 static bool isMapConstructed = false;
194 static _CameraCoordinatorSafeHashMapT map;
195 _CameraCoordinator* pCoordinator = null;
197 SysTryReturn(NID_MEDIA, cameraDevice > _CAMERA_DEVICE_NONE && cameraDevice < _CAMERA_DEVICE_MAX,
198 null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(camderDevice) is used. camderDevice:%d is wrong.", cameraDevice);
200 if (!isMapConstructed)
203 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
204 isMapConstructed = true;
208 r = map.ContainsKey(cameraDevice, out);
209 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
213 r = map.GetValue(cameraDevice, pCoordinator);
214 SysTryReturn(NID_MEDIA, r == E_SUCCESS && pCoordinator != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
218 std::unique_ptr <_CameraCoordinator> pCoord (new (std::nothrow) _CameraCoordinator());
219 SysTryReturn(NID_MEDIA, pCoord.get() !=null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
221 r = pCoord->Construct(cameraDevice);
222 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
224 r = map.Add(cameraDevice, pCoord.get());
225 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
227 pCoordinator = pCoord.release();
230 pCoordinator->AddRefCount();
235 _CameraCoordinator::AddInstance(_RecorderDeviceType recorderDevice)
237 _CameraCoordinator* pCoordinator = null;
238 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
241 switch (recorderDevice)
243 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
244 cameraDevice = _CAMERA_DEVICE_PRIMARY;
247 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
248 cameraDevice = _CAMERA_DEVICE_SECONDARY;
255 if (cameraDevice == _CAMERA_DEVICE_NONE)
257 SysLogException(NID_MEDIA, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(recorderDevice) is used. recorderDevice :%d is wrong.", recorderDevice);
261 pCoordinator = AddInstance(cameraDevice);
262 if (pCoordinator == null)
264 SysLogException(NID_MEDIA, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The camera device(%d)'s coordinator is not available.", cameraDevice);
271 _CameraCoordinator::Release(_CameraDeviceType cameraDevice)
273 result r = E_SUCCESS;
277 _CameraCoordinator* pCoordinator = null;
278 r = __pMap->GetValue(cameraDevice, pCoordinator);
279 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
281 if (pCoordinator->ReleaseRefCount() == 0)
284 r = __pMap->Remove(cameraDevice);
285 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
291 _CameraCoordinator::Release(_RecorderDeviceType recorderDevice)
295 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
297 switch (recorderDevice)
299 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
300 cameraDevice = _CAMERA_DEVICE_PRIMARY;
302 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
303 cameraDevice = _CAMERA_DEVICE_SECONDARY;
309 Release(cameraDevice);
314 _CameraCoordinator::HasInstance(_CameraDeviceType cameraDevice)
316 result r = E_SUCCESS;
317 _CameraCoordinator* pCoordinator = null;
321 SysTryReturn(NID_MEDIA, cameraDevice > _CAMERA_DEVICE_NONE && cameraDevice < _CAMERA_DEVICE_MAX,
322 null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(camderDevice) is used. camderDevice:%d is wrong.", cameraDevice);
323 SysTryReturn(NID_MEDIA, __pMap != null, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] No coordinator was created.");
325 r = __pMap->ContainsKey(cameraDevice, out);
326 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
327 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);
329 r = __pMap->GetValue(cameraDevice, pCoordinator);
330 SysTryCatch(NID_MEDIA, r == E_SUCCESS && pCoordinator != null, , r, "[%s] Propagating.", GetErrorMessage(r));
339 _CameraCoordinator::HasInstance(_RecorderDeviceType recorderDevice)
341 _CameraCoordinator* pCoordinator = null;
342 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
345 switch (recorderDevice)
347 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
348 cameraDevice = _CAMERA_DEVICE_PRIMARY;
351 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
352 cameraDevice = _CAMERA_DEVICE_SECONDARY;
359 if (cameraDevice == _CAMERA_DEVICE_NONE)
361 SysLogException(NID_MEDIA, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(recorderDevice) is used. recorderDevice :%d is wrong.", recorderDevice);
365 pCoordinator = HasInstance(cameraDevice);
366 if (pCoordinator == null)
368 SysLogException(NID_MEDIA, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The camera device(%d)'s coordinator is not available.", cameraDevice);
375 _CameraCoordinator::AddCameraCoordinatorListener(_ICameraCoordinatorListener& listener)
377 result r = E_SUCCESS;
378 r = __pListenerList->Add(&listener);
379 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
384 _CameraCoordinator::RemoveCameraCoordinatorListener(_ICameraCoordinatorListener& listener)
386 result r = E_SUCCESS;
387 r = __pListenerList->Remove(&listener);
388 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
390 r = NotifyOtherRemoved();
391 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
396 _CameraCoordinator::GetMode(void) const
402 _CameraCoordinator::GetCameraHandle(void) const
404 return __cameraHandle;
408 _CameraCoordinator::GetRecorderHandle(void) const
410 return __recorderHandle;
414 _CameraCoordinator::NotifyModeChangePrepared(_CameraMode mode)
416 result r = E_SUCCESS;
417 _ICameraCoordinatorListener* pListener = null;
418 SysLog(NID_MEDIA, "mode:%d", mode);
420 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
421 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
423 while (pEnum->MoveNext() == E_SUCCESS)
425 r = pEnum->GetCurrent(pListener);
426 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
427 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
429 r = pListener->OnCameraCoordinatorModeChangePrepared(mode);
430 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
436 _CameraCoordinator::NotifyModeChanged(_CameraMode mode)
438 result r = E_SUCCESS;
439 _ICameraCoordinatorListener* pListener = null;
440 SysLog(NID_MEDIA, "mode:%d", mode);
442 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
443 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
445 while (pEnum->MoveNext() == E_SUCCESS)
447 r = pEnum->GetCurrent(pListener);
448 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
449 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
451 r = pListener->OnCameraCoordinatorModeChanged(mode);
452 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
458 _CameraCoordinator::NotifyOtherRemoved(void)
460 result r = E_SUCCESS;
461 _ICameraCoordinatorListener* pListener = null;
462 SysLog(NID_MEDIA, "Enter");
464 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
465 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
467 while (pEnum->MoveNext() == E_SUCCESS)
469 r = pEnum->GetCurrent(pListener);
470 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
471 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
473 r = pListener->OnCameraCoordinatorOtherRemoved();
474 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
480 _CameraCoordinator::StartMmPreview(void)
482 result r = E_SUCCESS;
483 SysLog(NID_MEDIA, "Enter. mode:%d", __mode);
487 case _CAMERA_MODE_IMAGE:
488 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
489 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
492 case _CAMERA_MODE_VIDEO:
493 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
494 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
498 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] Camera is in an invalid state. Camcorder mode :%d is wrong", __mode);
508 _CameraCoordinator::StopMmPreview(void)
510 result r = E_SUCCESS;
511 SysLog(NID_MEDIA, "Enter.");
513 if (__mode == _CAMERA_MODE_IMAGE)
515 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
516 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
518 else if (__mode == _CAMERA_MODE_VIDEO)
520 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
521 recorderState = GetRecorderState();
523 switch (recorderState)
525 case ::RECORDER_STATE_RECORDING:
526 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
527 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
529 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
530 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
533 case ::RECORDER_STATE_READY:
534 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
535 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
540 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] recorderState is in an invalid state. recorderState:%d", recorderState);
547 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] CamcorderMode is in an invalid state. mode :%d", __mode);
555 _CameraCoordinator::CreateVideoRecorder(void)
557 result r = E_SUCCESS;
558 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
559 SysLog(NID_MEDIA, "enter.");
562 if ( __recorderHandle == MM_INVALID_HANDLE )
564 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
565 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
566 r = AddRecorder(recorderDevice); // recorder_create() will be called.
567 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
568 __mode = _CAMERA_MODE_VIDEO;
576 _CameraCoordinator::DestroyVideoRecorder(void)
578 result r = E_SUCCESS;
579 int err = MM_SUCCESS;
580 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
581 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
582 SysLog(NID_MEDIA, "enter.");
584 if ( __recorderHandle != MM_INVALID_HANDLE )
586 recorderState = GetRecorderState();
588 switch (recorderState)
590 case ::RECORDER_STATE_NONE:
593 case ::RECORDER_STATE_CREATED:
595 case ::RECORDER_STATE_READY:
596 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
597 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
598 RemoveRecorder(recorderDevice);
599 __mode = _CAMERA_MODE_IMAGE;
602 case ::RECORDER_STATE_RECORDING:
604 case ::RECORDER_STATE_PAUSED:
605 err = recorder_cancel(__recorderHandle);
606 r = ConvertResult(err);
607 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
608 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
609 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
610 RemoveRecorder(recorderDevice);
611 __mode = _CAMERA_MODE_IMAGE;
626 _CameraCoordinator::ChangeFormat(_CameraMode mode, bool callback, camera_pixel_format_e reloadCameraPreviewFormat)
628 result r = E_SUCCESS;
629 int err = MM_SUCCESS;
630 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
631 camera_state_e cameraState = ::CAMERA_STATE_NONE;
632 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
633 SysLog(NID_MEDIA, "enter. mode:%d, callback:%d, reloadCameraPreviewFormat:%d", mode, callback, reloadCameraPreviewFormat);
635 if (mode == _CAMERA_MODE_VIDEO)
637 cameraState = GetCameraState();
641 case ::CAMERA_STATE_CREATED:
643 case ::CAMERA_STATE_NONE:
646 case ::CAMERA_STATE_PREVIEW:
648 case ::CAMERA_STATE_CAPTURED:
649 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
650 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
653 case ::CAMERA_STATE_CAPTURING:
655 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);
663 __mode = _CAMERA_MODE_VIDEO;
664 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
667 r = NotifyModeChangePrepared(mode);
668 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
673 case ::CAMERA_STATE_NONE:
675 case ::CAMERA_STATE_CREATED:
678 case ::CAMERA_STATE_PREVIEW:
679 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
680 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
683 case ::CAMERA_STATE_CAPTURED:
688 else if ( mode == _CAMERA_MODE_IMAGE )
690 recorderState = GetRecorderState();
692 switch (recorderState)
694 case ::RECORDER_STATE_NONE:
696 case ::RECORDER_STATE_CREATED:
697 __mode = _CAMERA_MODE_IMAGE;
698 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
701 r = NotifyModeChangePrepared(mode);
702 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
706 case ::RECORDER_STATE_READY:
707 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
708 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
710 __mode = _CAMERA_MODE_IMAGE;
711 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
714 r = NotifyModeChangePrepared(mode);
715 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
717 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
718 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
721 case ::RECORDER_STATE_RECORDING:
723 case ::RECORDER_STATE_PAUSED:
724 err = recorder_cancel(__recorderHandle); // TODO
725 r = ConvertResult(err);
726 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
728 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
729 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
730 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
731 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
733 __mode = _CAMERA_MODE_IMAGE;
734 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
737 r = NotifyModeChangePrepared(mode);
738 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
740 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
741 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
751 // Notify that the mode is changed to callback camera and video recorder's configurations.
752 r = NotifyModeChanged(mode);
753 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
761 _CameraCoordinator::ChangeMode(_CameraMode mode, bool callback)
763 result r = E_SUCCESS;
764 camera_state_e cameraState = ::CAMERA_STATE_NONE;
765 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
766 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
767 int err = MM_SUCCESS;
769 SysLog(NID_MEDIA, "Mode should be changed. mode:%d", mode);
770 if (mode == _CAMERA_MODE_VIDEO)
772 cameraState = GetCameraState();
776 case ::CAMERA_STATE_CREATED:
778 case ::CAMERA_STATE_NONE:
781 case ::CAMERA_STATE_PREVIEW:
783 case ::CAMERA_STATE_CAPTURED:
784 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
785 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
788 case ::CAMERA_STATE_CAPTURING:
790 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);
799 if ( __recorderHandle == MM_INVALID_HANDLE )
801 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
802 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
803 r = AddRecorder(recorderDevice); // recorder_create() will be called.
804 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
805 __mode = _CAMERA_MODE_VIDEO;
810 r = NotifyModeChangePrepared(mode);
811 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
816 case ::CAMERA_STATE_NONE:
818 case ::CAMERA_STATE_CREATED:
821 case ::CAMERA_STATE_PREVIEW:
822 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
823 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
826 case ::CAMERA_STATE_CAPTURED:
831 else if ( mode == _CAMERA_MODE_IMAGE )
833 recorderState = GetRecorderState();
836 switch (recorderState)
838 case ::RECORDER_STATE_NONE:
841 case ::RECORDER_STATE_CREATED:
842 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
843 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
844 RemoveRecorder(recorderDevice); // the mode will be changed to IMAGE.
845 __mode = _CAMERA_MODE_IMAGE;
848 case ::RECORDER_STATE_READY:
849 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
850 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
852 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
853 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
854 RemoveRecorder(recorderDevice);
855 __mode = _CAMERA_MODE_IMAGE;
858 r = NotifyModeChangePrepared(mode);
859 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
861 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
862 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
865 case ::RECORDER_STATE_RECORDING:
867 case ::RECORDER_STATE_PAUSED:
868 err = recorder_cancel(__recorderHandle); // TODO
869 r = ConvertResult(err);
870 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
872 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
873 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
874 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
875 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
877 RemoveRecorder(recorderDevice);
878 __mode = _CAMERA_MODE_IMAGE;
881 r = NotifyModeChangePrepared(mode);
882 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
884 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
885 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
895 // Notify that the mode is changed to callback camera and video recorder's configurations.
896 r = NotifyModeChanged(mode);
897 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
907 _CameraCoordinator::IsCalmChangeMode(_CameraMode mode)
909 camera_state_e cameraState = ::CAMERA_STATE_NONE;
910 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
911 bool calmChange = false;
913 if (mode == _CAMERA_MODE_VIDEO)
915 cameraState = GetCameraState();
919 case ::CAMERA_STATE_CREATED:
921 case ::CAMERA_STATE_NONE:
925 case ::CAMERA_STATE_PREVIEW:
927 case ::CAMERA_STATE_CAPTURED:
929 case ::CAMERA_STATE_CAPTURING:
937 else if ( mode == _CAMERA_MODE_IMAGE )
939 recorderState = GetRecorderState();
942 switch (recorderState)
944 case ::RECORDER_STATE_NONE:
946 case ::RECORDER_STATE_CREATED:
950 case ::RECORDER_STATE_READY:
952 case ::RECORDER_STATE_RECORDING:
954 case ::RECORDER_STATE_PAUSED:
963 SysLog(NID_MEDIA, "mode:%d, calm:%d", mode, calmChange);
969 _CameraCoordinator::GetCameraDevice(void) const
971 return __cameraDevice;
975 _CameraCoordinator::GetCameraState(void) const
977 result r = E_SUCCESS;
978 int err = MM_SUCCESS;
979 camera_state_e state = ::CAMERA_STATE_NONE;
981 err = camera_get_state(__cameraHandle, &state);
982 r = ConvertResult(err);
983 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
988 return ::CAMERA_STATE_NONE;
992 _CameraCoordinator::GetRecorderState(void) const
994 result r = E_SUCCESS;
995 int err = MM_SUCCESS;
996 recorder_state_e state = ::RECORDER_STATE_NONE;
998 err = recorder_get_state(__recorderHandle, &state);
999 r = ConvertResult(err);
1000 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1005 return ::RECORDER_STATE_NONE;
1009 _CameraCoordinator::ConvertResult(int err) const
1011 result r = E_SYSTEM;
1012 if (err != CAMERA_ERROR_NONE)
1014 SysLog(NID_MEDIA, "MM Err:0x%x", err);
1018 if (err == CAMERA_ERROR_NONE || err == RECORDER_ERROR_NONE)
1022 else if (err == CAMERA_ERROR_INVALID_PARAMETER || err == RECORDER_ERROR_INVALID_PARAMETER)
1026 else if (err == CAMERA_ERROR_INVALID_STATE || err == RECORDER_ERROR_INVALID_STATE)
1028 r = E_INVALID_STATE;
1030 else if (err == CAMERA_ERROR_OUT_OF_MEMORY || err == RECORDER_ERROR_OUT_OF_MEMORY)
1032 r = E_OUT_OF_MEMORY;
1034 else if (err == CAMERA_ERROR_DEVICE || err == RECORDER_ERROR_DEVICE)
1036 r = E_DEVICE_FAILED;
1038 else if (err == CAMERA_ERROR_INVALID_OPERATION
1039 || err == CAMERA_ERROR_SECURITY_RESTRICTED
1040 || err == RECORDER_ERROR_INVALID_OPERATION
1041 || err == RECORDER_ERROR_SECURITY_RESTRICTED)
1045 else if (err == CAMERA_ERROR_DEVICE_BUSY
1046 || err == CAMERA_ERROR_SOUND_POLICY
1047 || err == RECORDER_ERROR_SOUND_POLICY)
1051 else if (err == CAMERA_ERROR_DEVICE_NOT_FOUND)
1053 r = E_DEVICE_UNAVAILABLE;
1065 _CameraCoordinator::ChangeCameraStateTo(camera_state_e destState)
1067 result r = E_SUCCESS;
1068 int tableTotalCount = 0;
1070 int err = MM_SUCCESS;
1071 camera_state_e preState = ::CAMERA_STATE_NONE;
1072 camera_state_e postState = ::CAMERA_STATE_NONE;
1074 preState = GetCameraState();
1075 tableTotalCount = sizeof(_CAMERA_STATE_TRANSIT) / sizeof(_CAMERA_STATE_TRANSIT[0]);
1076 SysLog(NID_MEDIA, " PreState:%d, destState:%d, tableTotalCount:%d", preState, destState, tableTotalCount);
1078 for (i = 0; i < tableTotalCount; i++)
1080 if (preState == _CAMERA_STATE_TRANSIT[i].prevState && destState == _CAMERA_STATE_TRANSIT[i].postState)
1082 if (_CAMERA_STATE_TRANSIT[i].pFunc != null)
1085 "Exist the matching state field. loop i:%d, current state:%d, destState:%d", i,
1086 preState, destState);
1087 err = _CAMERA_STATE_TRANSIT[i].pFunc(__cameraHandle);
1088 r = ConvertResult(err);
1089 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1091 // Check whether the retuned states are destinationed states.
1092 postState = GetCameraState();
1093 SysTryCatch(NID_MEDIA, destState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1094 "[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,
1096 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result postState:%d, param destState:%d", postState,
1103 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1107 SysLog(NID_MEDIA, "[%s] Real preState:%d, param destState:%d", GetErrorMessage(r), preState, destState);
1112 _CameraCoordinator::ChangeRecorderStateTo(recorder_state_e destState)
1114 result r = E_SUCCESS;
1115 int tableTotalCount = 0;
1117 int err = MM_SUCCESS;
1118 recorder_state_e preState = ::RECORDER_STATE_NONE;
1119 recorder_state_e postState = ::RECORDER_STATE_NONE;
1121 preState = GetRecorderState();
1122 tableTotalCount = sizeof(_RECORDER_STATE_TRANSIT) / sizeof(_RECORDER_STATE_TRANSIT[0]);
1123 SysLog(NID_MEDIA, " PreState:%d, destState:%d, tableTotalCount:%d", preState, destState, tableTotalCount);
1125 for (i = 0; i < tableTotalCount; i++)
1127 if (preState == _RECORDER_STATE_TRANSIT[i].prevState && destState == _RECORDER_STATE_TRANSIT[i].postState)
1129 if (_RECORDER_STATE_TRANSIT[i].pFunc != null)
1132 "Exist the matching state field. loop i:%d, current state:%d, destState:%d", i,
1133 preState, destState);
1134 err = _RECORDER_STATE_TRANSIT[i].pFunc(__recorderHandle);
1135 r = ConvertResult(err);
1136 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1138 // Check whether the retuned states are destinationed states.
1139 postState = GetRecorderState();
1140 SysTryCatch(NID_MEDIA, destState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1141 "[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,
1143 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result preState:%d, param destState:%d", postState,
1150 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1154 SysLog(NID_MEDIA, "[%s] Real preState:%d, param destState:%d", GetErrorMessage(r), preState, destState);
1159 _CameraCoordinator::SetCameraSourceFormat(camera_pixel_format_e pixelFormat)
1161 result r = E_SUCCESS;
1162 int err = MM_SUCCESS;
1163 SysLog(NID_MEDIA, "Camera_pixel_format_e is :%d", pixelFormat);
1165 err = camera_set_preview_format(__cameraHandle, pixelFormat);
1166 r = ConvertResult(err);
1167 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating, pixelFormat:%d", GetErrorMessage(r), pixelFormat);
1175 camera_pixel_format_e
1176 _CameraCoordinator::GetCameraSourceFormat(void) const
1178 result r = E_SUCCESS;
1179 int err = MM_SUCCESS;
1180 camera_pixel_format_e pixelFormat = CAMERA_PIXEL_FORMAT_INVALID;
1182 err = camera_get_preview_format(__cameraHandle, &pixelFormat);
1183 r = ConvertResult(err);
1184 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
1193 _CameraCoordinator::StartCapture(camera_capturing_cb capturingCb , camera_capture_completed_cb completedCb , void *pUserData)
1195 result r = E_SUCCESS;
1196 int err = MM_SUCCESS;
1198 if (__orientationFlag & _ORIENTATION_FOR_CAMERA)
1200 r = SetCameraOrientationAttr(__cameraOrientation);
1201 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1203 else if (__orientationFlag & _ORIENTATION_FOR_RECORDING) // If recorder setting is remained.
1205 r = SetCameraOrientationAttr(CAMERA_EXIF_ORIENTATION_TOP_LEFT); // To set the init value
1206 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1209 __mode = _CAMERA_MODE_IMAGE;
1210 err = camera_start_capture(__cameraHandle, capturingCb, completedCb, pUserData);
1211 r = ConvertResult(err);
1212 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camera capture failed.", GetErrorMessage(r));
1218 _CameraCoordinator::StartRecord(void)
1220 result r = E_SUCCESS;
1221 int err = MM_SUCCESS;
1223 if (__orientationFlag & _ORIENTATION_FOR_RECORDING)
1225 r = SetRecordingOrientationAttr(__recordingRotation);
1226 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1228 else if (__orientationFlag & _ORIENTATION_FOR_CAMERA) // If recorder setting is remained.
1230 r = SetRecordingOrientationAttr(RECORDING_ROTATION_NONE); // To set the init value
1231 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1234 __mode = _CAMERA_MODE_VIDEO;
1235 err = recorder_start(__recorderHandle);
1236 r = ConvertResult(err);
1237 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Recorder record failed.", GetErrorMessage(r));
1243 _CameraCoordinator::SetRecordingOrientation(RecordingRotation rotation)
1245 __orientationFlag = __orientationFlag | _ORIENTATION_FOR_RECORDING;
1246 __recordingRotation = rotation;
1250 _CameraCoordinator::SetCameraOrientation(CameraExifOrientation orientation)
1252 __orientationFlag = __orientationFlag | _ORIENTATION_FOR_CAMERA;
1253 __cameraOrientation = orientation;
1257 _CameraCoordinator::SetRecordingOrientationAttr(RecordingRotation rotation)
1259 result r = E_SUCCESS;
1260 int err = MM_SUCCESS;
1261 #if _VIDEO_RECORDER_ROTATION_
1262 recorder_rotation_e mmAttr = ::RECORDER_ROTATION_NONE;
1263 r = _RecorderUtil::GetMmRotation(rotation, mmAttr);
1264 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. rotation:%d", GetErrorMessage(r), rotation);
1266 err = recorder_attr_set_recording_orientation(__recorderHandle, mmAttr);
1267 r = ConvertResult(err);
1268 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camcorder set attribute failed. rotation:%d", GetErrorMessage(r), rotation);
1270 CameraRotation cameraRotation = CAMERA_ROTATION_NONE;
1271 r = _RecorderUtil::GetCameraRotation(rotation, cameraRotation);
1272 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. rotation:%d", GetErrorMessage(r), rotation);
1274 camera_attr_tag_orientation_e mmOrientationAttr = CAMERA_ATTR_TAG_ORIENTATION_TOP_LEFT;
1275 r = _CameraUtil::GetMmExifOrientation(cameraRotation, mmOrientationAttr);
1276 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. rotation:%d", GetErrorMessage(r), rotation);
1278 err = camera_attr_set_tag_orientation(__cameraHandle, mmOrientationAttr);
1279 r = ConvertResult(err);
1280 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camcorder set attribute failed. Mm orientation:%d", GetErrorMessage(r), mmOrientationAttr);
1287 _CameraCoordinator::SetCameraOrientationAttr(CameraExifOrientation orientation)
1289 result r = E_SUCCESS;
1290 int err = MM_SUCCESS;
1291 camera_attr_tag_orientation_e attr = ::CAMERA_ATTR_TAG_ORIENTATION_TOP_LEFT;
1293 r = _CameraUtil::GetMmExifOrientation(orientation, attr);
1294 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. orientation:%d", GetErrorMessage(r), orientation);
1296 err = camera_attr_set_tag_orientation(__cameraHandle, attr);
1297 r = ConvertResult(err);
1298 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. orientation:%d", GetErrorMessage(r), orientation);
1303 camera_pixel_format_e
1304 _CameraCoordinator::GetReloadPreviewFormat(void) const
1306 SysLog(NID_MEDIA, "reloadCameraPreviewFormat is :%d", __reloadCameraPreviewFormat);
1307 return __reloadCameraPreviewFormat;