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);
383 _CameraCoordinator::RemoveCameraCoordinatorListener(_ICameraCoordinatorListener& listener)
385 result r = E_SUCCESS;
386 r = __pListenerList->Remove(&listener);
391 _CameraCoordinator::GetMode(void) const
397 _CameraCoordinator::GetCameraHandle(void) const
399 return __cameraHandle;
403 _CameraCoordinator::GetRecorderHandle(void) const
405 return __recorderHandle;
409 _CameraCoordinator::NotifyModeChangePrepared(_CameraMode mode)
411 result r = E_SUCCESS;
412 _ICameraCoordinatorListener* pListener = null;
413 SysLog(NID_MEDIA, "mode:%d", mode);
415 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
416 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
418 while (pEnum->MoveNext() == E_SUCCESS)
420 r = pEnum->GetCurrent(pListener);
421 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
422 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
424 r = pListener->OnCameraCoordinatorModeChangePrepared(mode);
425 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
431 _CameraCoordinator::NotifyModeChanged(_CameraMode mode)
433 result r = E_SUCCESS;
434 _ICameraCoordinatorListener* pListener = null;
435 SysLog(NID_MEDIA, "mode:%d", mode);
437 std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
438 SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
440 while (pEnum->MoveNext() == E_SUCCESS)
442 r = pEnum->GetCurrent(pListener);
443 SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
444 "[E_SYSTEM] A system error has been occurred. The listener is not proper");
446 r = pListener->OnCameraCoordinatorModeChanged(mode);
447 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
453 _CameraCoordinator::StartMmPreview(void)
455 result r = E_SUCCESS;
456 SysLog(NID_MEDIA, "Enter. mode:%d", __mode);
460 case _CAMERA_MODE_IMAGE:
461 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
462 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
465 case _CAMERA_MODE_VIDEO:
466 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
467 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
471 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] Camera is in an invalid state. Camcorder mode :%d is wrong", __mode);
481 _CameraCoordinator::StopMmPreview(void)
483 result r = E_SUCCESS;
484 SysLog(NID_MEDIA, "Enter.");
486 if (__mode == _CAMERA_MODE_IMAGE)
488 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
489 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
491 else if (__mode == _CAMERA_MODE_VIDEO)
493 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
494 recorderState = GetRecorderState();
496 switch (recorderState)
498 case ::RECORDER_STATE_RECORDING:
499 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
500 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
502 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
503 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
506 case ::RECORDER_STATE_READY:
507 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
508 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
513 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] recorderState is in an invalid state. recorderState:%d", recorderState);
520 SysLogException(NID_MEDIA, E_INVALID_STATE, "[E_INVALID_STATE] CamcorderMode is in an invalid state. mode :%d", __mode);
528 _CameraCoordinator::CreateVideoRecorder(void)
530 result r = E_SUCCESS;
531 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
532 SysLog(NID_MEDIA, "enter.");
535 if ( __recorderHandle == MM_INVALID_HANDLE )
537 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
538 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
539 r = AddRecorder(recorderDevice); // recorder_create() will be called.
540 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
541 __mode = _CAMERA_MODE_VIDEO;
549 _CameraCoordinator::DestroyVideoRecorder(void)
551 result r = E_SUCCESS;
552 int err = MM_SUCCESS;
553 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
554 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
555 SysLog(NID_MEDIA, "enter.");
557 if ( __recorderHandle != MM_INVALID_HANDLE )
559 recorderState = GetRecorderState();
561 switch (recorderState)
563 case ::RECORDER_STATE_NONE:
566 case ::RECORDER_STATE_CREATED:
568 case ::RECORDER_STATE_READY:
569 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
570 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
571 RemoveRecorder(recorderDevice);
572 __mode = _CAMERA_MODE_IMAGE;
575 case ::RECORDER_STATE_RECORDING:
577 case ::RECORDER_STATE_PAUSED:
578 err = recorder_cancel(__recorderHandle);
579 r = ConvertResult(err);
580 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
581 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
582 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
583 RemoveRecorder(recorderDevice);
584 __mode = _CAMERA_MODE_IMAGE;
599 _CameraCoordinator::ChangeFormat(_CameraMode mode, bool callback, camera_pixel_format_e reloadCameraPreviewFormat)
601 result r = E_SUCCESS;
602 int err = MM_SUCCESS;
603 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
604 camera_state_e cameraState = ::CAMERA_STATE_NONE;
605 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
606 SysLog(NID_MEDIA, "enter. mode:%d, callback:%d, reloadCameraPreviewFormat:%d", mode, callback, reloadCameraPreviewFormat);
608 if (mode == _CAMERA_MODE_VIDEO)
610 cameraState = GetCameraState();
614 case ::CAMERA_STATE_CREATED:
616 case ::CAMERA_STATE_NONE:
619 case ::CAMERA_STATE_PREVIEW:
621 case ::CAMERA_STATE_CAPTURED:
622 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
623 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
626 case ::CAMERA_STATE_CAPTURING:
628 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);
636 __mode = _CAMERA_MODE_VIDEO;
637 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
640 r = NotifyModeChangePrepared(mode);
641 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
646 case ::CAMERA_STATE_NONE:
648 case ::CAMERA_STATE_CREATED:
651 case ::CAMERA_STATE_PREVIEW:
652 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
653 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
656 case ::CAMERA_STATE_CAPTURED:
661 else if ( mode == _CAMERA_MODE_IMAGE )
663 recorderState = GetRecorderState();
665 switch (recorderState)
667 case ::RECORDER_STATE_NONE:
669 case ::RECORDER_STATE_CREATED:
670 __mode = _CAMERA_MODE_IMAGE;
671 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
674 r = NotifyModeChangePrepared(mode);
675 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
679 case ::RECORDER_STATE_READY:
680 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
681 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
683 __mode = _CAMERA_MODE_IMAGE;
684 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
687 r = NotifyModeChangePrepared(mode);
688 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
690 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
691 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
694 case ::RECORDER_STATE_RECORDING:
696 case ::RECORDER_STATE_PAUSED:
697 err = recorder_cancel(__recorderHandle); // TODO
698 r = ConvertResult(err);
699 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
701 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
702 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
703 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
704 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
706 __mode = _CAMERA_MODE_IMAGE;
707 __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
710 r = NotifyModeChangePrepared(mode);
711 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
713 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
714 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
724 // Notify that the mode is changed to callback camera and video recorder's configurations.
725 r = NotifyModeChanged(mode);
726 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
734 _CameraCoordinator::ChangeMode(_CameraMode mode, bool callback)
736 result r = E_SUCCESS;
737 camera_state_e cameraState = ::CAMERA_STATE_NONE;
738 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
739 _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
740 int err = MM_SUCCESS;
742 SysLog(NID_MEDIA, "Mode should be changed. mode:%d", mode);
743 if (mode == _CAMERA_MODE_VIDEO)
745 cameraState = GetCameraState();
749 case ::CAMERA_STATE_CREATED:
751 case ::CAMERA_STATE_NONE:
754 case ::CAMERA_STATE_PREVIEW:
756 case ::CAMERA_STATE_CAPTURED:
757 r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
758 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
761 case ::CAMERA_STATE_CAPTURING:
763 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);
772 if ( __recorderHandle == MM_INVALID_HANDLE )
774 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
775 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
776 r = AddRecorder(recorderDevice); // recorder_create() will be called.
777 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
778 __mode = _CAMERA_MODE_VIDEO;
783 r = NotifyModeChangePrepared(mode);
784 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
789 case ::CAMERA_STATE_NONE:
791 case ::CAMERA_STATE_CREATED:
794 case ::CAMERA_STATE_PREVIEW:
795 r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
796 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
799 case ::CAMERA_STATE_CAPTURED:
804 else if ( mode == _CAMERA_MODE_IMAGE )
806 recorderState = GetRecorderState();
809 switch (recorderState)
811 case ::RECORDER_STATE_NONE:
814 case ::RECORDER_STATE_CREATED:
815 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
816 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
817 RemoveRecorder(recorderDevice); // the mode will be changed to IMAGE.
818 __mode = _CAMERA_MODE_IMAGE;
821 case ::RECORDER_STATE_READY:
822 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
823 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
825 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
826 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
827 RemoveRecorder(recorderDevice);
828 __mode = _CAMERA_MODE_IMAGE;
831 r = NotifyModeChangePrepared(mode);
832 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
834 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
835 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
838 case ::RECORDER_STATE_RECORDING:
840 case ::RECORDER_STATE_PAUSED:
841 err = recorder_cancel(__recorderHandle); // TODO
842 r = ConvertResult(err);
843 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
845 r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
846 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
847 recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
848 _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
850 RemoveRecorder(recorderDevice);
851 __mode = _CAMERA_MODE_IMAGE;
854 r = NotifyModeChangePrepared(mode);
855 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
857 r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
858 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
868 // Notify that the mode is changed to callback camera and video recorder's configurations.
869 r = NotifyModeChanged(mode);
870 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
880 _CameraCoordinator::IsCalmChangeMode(_CameraMode mode)
882 camera_state_e cameraState = ::CAMERA_STATE_NONE;
883 recorder_state_e recorderState = ::RECORDER_STATE_NONE;
884 bool calmChange = false;
886 if (mode == _CAMERA_MODE_VIDEO)
888 cameraState = GetCameraState();
892 case ::CAMERA_STATE_CREATED:
894 case ::CAMERA_STATE_NONE:
898 case ::CAMERA_STATE_PREVIEW:
900 case ::CAMERA_STATE_CAPTURED:
902 case ::CAMERA_STATE_CAPTURING:
910 else if ( mode == _CAMERA_MODE_IMAGE )
912 recorderState = GetRecorderState();
915 switch (recorderState)
917 case ::RECORDER_STATE_NONE:
919 case ::RECORDER_STATE_CREATED:
923 case ::RECORDER_STATE_READY:
925 case ::RECORDER_STATE_RECORDING:
927 case ::RECORDER_STATE_PAUSED:
936 SysLog(NID_MEDIA, "mode:%d, calm:%d", mode, calmChange);
942 _CameraCoordinator::GetCameraDevice(void) const
944 return __cameraDevice;
948 _CameraCoordinator::GetCameraState(void) const
950 result r = E_SUCCESS;
951 int err = MM_SUCCESS;
952 camera_state_e state = ::CAMERA_STATE_NONE;
954 err = camera_get_state(__cameraHandle, &state);
955 r = ConvertResult(err);
956 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
961 return ::CAMERA_STATE_NONE;
965 _CameraCoordinator::GetRecorderState(void) const
967 result r = E_SUCCESS;
968 int err = MM_SUCCESS;
969 recorder_state_e state = ::RECORDER_STATE_NONE;
971 err = recorder_get_state(__recorderHandle, &state);
972 r = ConvertResult(err);
973 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
978 return ::RECORDER_STATE_NONE;
982 _CameraCoordinator::ConvertResult(int err) const
985 if (err != CAMERA_ERROR_NONE)
987 SysLog(NID_MEDIA, "MM Err:0x%x", err);
991 if (err == CAMERA_ERROR_NONE || err == RECORDER_ERROR_NONE)
995 else if (err == CAMERA_ERROR_INVALID_PARAMETER || err == RECORDER_ERROR_INVALID_PARAMETER)
999 else if (err == CAMERA_ERROR_INVALID_STATE || err == RECORDER_ERROR_INVALID_STATE)
1001 r = E_INVALID_STATE;
1003 else if (err == CAMERA_ERROR_OUT_OF_MEMORY || err == RECORDER_ERROR_OUT_OF_MEMORY)
1005 r = E_OUT_OF_MEMORY;
1007 else if (err == CAMERA_ERROR_DEVICE || err == RECORDER_ERROR_DEVICE)
1009 r = E_DEVICE_FAILED;
1011 else if (err == CAMERA_ERROR_INVALID_OPERATION
1012 || err == CAMERA_ERROR_SECURITY_RESTRICTED
1013 || err == RECORDER_ERROR_INVALID_OPERATION
1014 || err == RECORDER_ERROR_SECURITY_RESTRICTED)
1018 else if (err == CAMERA_ERROR_DEVICE_BUSY
1019 || err == CAMERA_ERROR_SOUND_POLICY
1020 || err == RECORDER_ERROR_SOUND_POLICY)
1024 else if (err == CAMERA_ERROR_DEVICE_NOT_FOUND)
1026 r = E_DEVICE_UNAVAILABLE;
1038 _CameraCoordinator::ChangeCameraStateTo(camera_state_e destState)
1040 result r = E_SUCCESS;
1041 int tableTotalCount = 0;
1043 int err = MM_SUCCESS;
1044 camera_state_e preState = ::CAMERA_STATE_NONE;
1045 camera_state_e postState = ::CAMERA_STATE_NONE;
1047 preState = GetCameraState();
1048 tableTotalCount = sizeof(_CAMERA_STATE_TRANSIT) / sizeof(_CAMERA_STATE_TRANSIT[0]);
1049 SysLog(NID_MEDIA, " PreState:%d, destState:%d, tableTotalCount:%d", preState, destState, tableTotalCount);
1051 for (i = 0; i < tableTotalCount; i++)
1053 if (preState == _CAMERA_STATE_TRANSIT[i].prevState && destState == _CAMERA_STATE_TRANSIT[i].postState)
1055 if (_CAMERA_STATE_TRANSIT[i].pFunc != null)
1058 "Exist the matching state field. loop i:%d, current state:%d, destState:%d", i,
1059 preState, destState);
1060 err = _CAMERA_STATE_TRANSIT[i].pFunc(__cameraHandle);
1061 r = ConvertResult(err);
1062 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1064 // Check whether the retuned states are destinationed states.
1065 postState = GetCameraState();
1066 SysTryCatch(NID_MEDIA, destState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1067 "[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,
1069 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result postState:%d, param destState:%d", postState,
1076 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1080 SysLog(NID_MEDIA, "[%s] Real preState:%d, param destState:%d", GetErrorMessage(r), preState, destState);
1085 _CameraCoordinator::ChangeRecorderStateTo(recorder_state_e destState)
1087 result r = E_SUCCESS;
1088 int tableTotalCount = 0;
1090 int err = MM_SUCCESS;
1091 recorder_state_e preState = ::RECORDER_STATE_NONE;
1092 recorder_state_e postState = ::RECORDER_STATE_NONE;
1094 preState = GetRecorderState();
1095 tableTotalCount = sizeof(_RECORDER_STATE_TRANSIT) / sizeof(_RECORDER_STATE_TRANSIT[0]);
1096 SysLog(NID_MEDIA, " PreState:%d, destState:%d, tableTotalCount:%d", preState, destState, tableTotalCount);
1098 for (i = 0; i < tableTotalCount; i++)
1100 if (preState == _RECORDER_STATE_TRANSIT[i].prevState && destState == _RECORDER_STATE_TRANSIT[i].postState)
1102 if (_RECORDER_STATE_TRANSIT[i].pFunc != null)
1105 "Exist the matching state field. loop i:%d, current state:%d, destState:%d", i,
1106 preState, destState);
1107 err = _RECORDER_STATE_TRANSIT[i].pFunc(__recorderHandle);
1108 r = ConvertResult(err);
1109 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1111 // Check whether the retuned states are destinationed states.
1112 postState = GetRecorderState();
1113 SysTryCatch(NID_MEDIA, destState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1114 "[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,
1116 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result preState:%d, param destState:%d", postState,
1123 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1127 SysLog(NID_MEDIA, "[%s] Real preState:%d, param destState:%d", GetErrorMessage(r), preState, destState);
1132 _CameraCoordinator::SetCameraSourceFormat(camera_pixel_format_e pixelFormat)
1134 result r = E_SUCCESS;
1135 int err = MM_SUCCESS;
1136 SysLog(NID_MEDIA, "Camera_pixel_format_e is :%d", pixelFormat);
1138 err = camera_set_preview_format(__cameraHandle, pixelFormat);
1139 r = ConvertResult(err);
1140 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating, pixelFormat:%d", GetErrorMessage(r), pixelFormat);
1148 camera_pixel_format_e
1149 _CameraCoordinator::GetCameraSourceFormat(void) const
1151 result r = E_SUCCESS;
1152 int err = MM_SUCCESS;
1153 camera_pixel_format_e pixelFormat = CAMERA_PIXEL_FORMAT_INVALID;
1155 err = camera_get_preview_format(__cameraHandle, &pixelFormat);
1156 r = ConvertResult(err);
1157 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
1166 _CameraCoordinator::StartCapture(camera_capturing_cb capturingCb , camera_capture_completed_cb completedCb , void *pUserData)
1168 result r = E_SUCCESS;
1169 int err = MM_SUCCESS;
1171 if (__orientationFlag & _ORIENTATION_FOR_CAMERA)
1173 r = SetCameraOrientationAttr(__cameraOrientation);
1174 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1176 else if (__orientationFlag & _ORIENTATION_FOR_RECORDING) // If recorder setting is remained.
1178 r = SetCameraOrientationAttr(CAMERA_EXIF_ORIENTATION_TOP_LEFT); // To set the init value
1179 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1182 __mode = _CAMERA_MODE_IMAGE;
1183 err = camera_start_capture(__cameraHandle, capturingCb, completedCb, pUserData);
1184 r = ConvertResult(err);
1185 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camera capture failed.", GetErrorMessage(r));
1191 _CameraCoordinator::StartRecord(void)
1193 result r = E_SUCCESS;
1194 int err = MM_SUCCESS;
1196 if (__orientationFlag & _ORIENTATION_FOR_RECORDING)
1198 r = SetRecordingOrientationAttr(__recordingRotation);
1199 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1201 else if (__orientationFlag & _ORIENTATION_FOR_CAMERA) // If recorder setting is remained.
1203 r = SetRecordingOrientationAttr(RECORDING_ROTATION_NONE); // To set the init value
1204 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1207 __mode = _CAMERA_MODE_VIDEO;
1208 err = recorder_start(__recorderHandle);
1209 r = ConvertResult(err);
1210 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Recorder record failed.", GetErrorMessage(r));
1216 _CameraCoordinator::SetRecordingOrientation(RecordingRotation rotation)
1218 __orientationFlag = __orientationFlag | _ORIENTATION_FOR_RECORDING;
1219 __recordingRotation = rotation;
1223 _CameraCoordinator::SetCameraOrientation(CameraExifOrientation orientation)
1225 __orientationFlag = __orientationFlag | _ORIENTATION_FOR_CAMERA;
1226 __cameraOrientation = orientation;
1230 _CameraCoordinator::SetRecordingOrientationAttr(RecordingRotation rotation)
1232 result r = E_SUCCESS;
1233 int err = MM_SUCCESS;
1234 #if _VIDEO_RECORDER_ROTATION_
1235 recorder_rotation_e mmAttr = ::RECORDER_ROTATION_NONE;
1236 r = _RecorderUtil::GetMmRotation(rotation, mmAttr);
1237 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. rotation:%d", GetErrorMessage(r), rotation);
1239 err = recorder_attr_set_recording_orientation(__recorderHandle, mmAttr);
1240 r = ConvertResult(err);
1241 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camcorder set attribute failed. rotation:%d", GetErrorMessage(r), rotation);
1243 CameraRotation cameraRotation = CAMERA_ROTATION_NONE;
1244 r = _RecorderUtil::GetCameraRotation(rotation, cameraRotation);
1245 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. rotation:%d", GetErrorMessage(r), rotation);
1247 camera_attr_tag_orientation_e mmOrientationAttr = CAMERA_ATTR_TAG_ORIENTATION_TOP_LEFT;
1248 r = _CameraUtil::GetMmExifOrientation(cameraRotation, mmOrientationAttr);
1249 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. rotation:%d", GetErrorMessage(r), rotation);
1251 err = camera_attr_set_tag_orientation(__cameraHandle, mmOrientationAttr);
1252 r = ConvertResult(err);
1253 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camcorder set attribute failed. Mm orientation:%d", GetErrorMessage(r), mmOrientationAttr);
1260 _CameraCoordinator::SetCameraOrientationAttr(CameraExifOrientation orientation)
1262 result r = E_SUCCESS;
1263 int err = MM_SUCCESS;
1264 camera_attr_tag_orientation_e attr = ::CAMERA_ATTR_TAG_ORIENTATION_TOP_LEFT;
1266 r = _CameraUtil::GetMmExifOrientation(orientation, attr);
1267 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. orientation:%d", GetErrorMessage(r), orientation);
1269 err = camera_attr_set_tag_orientation(__cameraHandle, attr);
1270 r = ConvertResult(err);
1271 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. orientation:%d", GetErrorMessage(r), orientation);
1276 camera_pixel_format_e
1277 _CameraCoordinator::GetReloadPreviewFormat(void) const
1279 SysLog(NID_MEDIA, "reloadCameraPreviewFormat is :%d", __reloadCameraPreviewFormat);
1280 return __reloadCameraPreviewFormat;