Merge "Fix the bug in GetActiveBluetoothA2dpName()" into tizen_2.1
[platform/framework/native/media.git] / src / FMedia_CameraCoordinator.cpp
index 8cbe446..9002c68 100755 (executable)
@@ -123,6 +123,7 @@ _CameraCoordinator::_CameraCoordinator()
        , __orientationFlag(0)
        , __cameraOrientation(CAMERA_EXIF_ORIENTATION_TOP_LEFT)
        , __recordingRotation(RECORDING_ROTATION_NONE)
+       , __reloadCameraPreviewFormat(::CAMERA_PIXEL_FORMAT_I420)
 {
 }
 
@@ -375,6 +376,7 @@ _CameraCoordinator::AddCameraCoordinatorListener(_ICameraCoordinatorListener& li
 {
        result r = E_SUCCESS;
        r = __pListenerList->Add(&listener);
+       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
        return r;
 }
 
@@ -383,6 +385,10 @@ _CameraCoordinator::RemoveCameraCoordinatorListener(_ICameraCoordinatorListener&
 {
        result r = E_SUCCESS;
        r = __pListenerList->Remove(&listener);
+       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       r = NotifyOtherRemoved();
+       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
        return r;
 }
 
@@ -449,6 +455,28 @@ _CameraCoordinator::NotifyModeChanged(_CameraMode mode)
 }
 
 result
+_CameraCoordinator::NotifyOtherRemoved(void)
+{
+       result r = E_SUCCESS;
+       _ICameraCoordinatorListener* pListener = null;
+       SysLog(NID_MEDIA, "Enter");
+
+       std::unique_ptr <IEnumeratorT <_ICameraCoordinatorListener*> > pEnum (__pListenerList->GetEnumeratorN());
+       SysTryReturn(NID_MEDIA, pEnum.get() != null, GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+
+       while (pEnum->MoveNext() == E_SUCCESS)
+       {
+               r = pEnum->GetCurrent(pListener);
+               SysTryReturn(NID_MEDIA, pListener != null && r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+                                  "[E_SYSTEM] A system error has been occurred.  The listener is not proper");
+
+               r = pListener->OnCameraCoordinatorOtherRemoved();
+               SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       }
+       return r;
+}
+
+result
 _CameraCoordinator::StartMmPreview(void)
 {
        result r = E_SUCCESS;
@@ -524,6 +552,212 @@ CATCH:
 }
 
 result
+_CameraCoordinator::CreateVideoRecorder(void)
+{
+       result r = E_SUCCESS;
+       _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
+       SysLog(NID_MEDIA, "enter.");
+
+       // Start recorder
+       if ( __recorderHandle == MM_INVALID_HANDLE )
+       {
+               recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
+               _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
+               r = AddRecorder(recorderDevice);                // recorder_create() will be called.
+               SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+               __mode = _CAMERA_MODE_VIDEO;
+       }
+       return r;
+CATCH:
+       return r;
+}
+
+result
+_CameraCoordinator::DestroyVideoRecorder(void)
+{
+       result r = E_SUCCESS;
+       int err = MM_SUCCESS;
+       recorder_state_e recorderState = ::RECORDER_STATE_NONE;
+       _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
+       SysLog(NID_MEDIA, "enter.");
+
+       if ( __recorderHandle != MM_INVALID_HANDLE )
+       {
+               recorderState = GetRecorderState();
+               // Stop the recorder
+               switch (recorderState)
+               {
+               case ::RECORDER_STATE_NONE:
+                       break;
+
+               case ::RECORDER_STATE_CREATED:
+                       //fall through
+               case ::RECORDER_STATE_READY:
+                       recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
+                               _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
+                       RemoveRecorder(recorderDevice);
+                       __mode = _CAMERA_MODE_IMAGE;
+                       break;
+
+               case ::RECORDER_STATE_RECORDING:
+                       //fall through
+               case ::RECORDER_STATE_PAUSED:
+                       err = recorder_cancel(__recorderHandle);
+                       r = ConvertResult(err);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
+                               _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
+                       RemoveRecorder(recorderDevice);
+                       __mode = _CAMERA_MODE_IMAGE;
+                       break;
+
+               default:
+                       break;
+               }
+       }
+
+       return r;
+CATCH:
+       return r;
+}
+
+
+result
+_CameraCoordinator::ChangeFormat(_CameraMode mode, bool callback, camera_pixel_format_e reloadCameraPreviewFormat)
+{
+       result r = E_SUCCESS;
+       int err = MM_SUCCESS;
+       _RecorderDeviceType recorderDevice = _RECORDER_DEVICE_NONE;
+       camera_state_e cameraState = ::CAMERA_STATE_NONE;
+       recorder_state_e recorderState = ::RECORDER_STATE_NONE;
+       SysLog(NID_MEDIA, "enter. mode:%d, callback:%d,         reloadCameraPreviewFormat:%d", mode, callback, reloadCameraPreviewFormat);
+
+       if (mode == _CAMERA_MODE_VIDEO)
+       {
+               cameraState = GetCameraState();
+
+               switch (cameraState)
+               {
+               case ::CAMERA_STATE_CREATED:
+                       //fall through
+               case ::CAMERA_STATE_NONE:
+                       break;
+
+               case ::CAMERA_STATE_PREVIEW:
+                       //fall through
+               case ::CAMERA_STATE_CAPTURED:
+                       r = ChangeCameraStateTo(::CAMERA_STATE_CREATED);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       break;
+
+               case ::CAMERA_STATE_CAPTURING:
+                       r = E_INVALID_STATE;
+                       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);
+                       goto CATCH;
+                       break;
+
+               default:
+                       break;
+               }
+
+               __mode = _CAMERA_MODE_VIDEO;
+               __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
+               if (callback)
+               {
+                       r = NotifyModeChangePrepared(mode);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+               }
+
+               switch (cameraState)
+               {
+               case ::CAMERA_STATE_NONE:
+                       //fall through
+               case ::CAMERA_STATE_CREATED:
+                       break;
+
+               case ::CAMERA_STATE_PREVIEW:
+                       r = ChangeRecorderStateTo(::RECORDER_STATE_READY);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       break;
+
+               case ::CAMERA_STATE_CAPTURED:
+               default:
+                       break;
+               }
+       }
+       else if ( mode == _CAMERA_MODE_IMAGE )
+       {
+               recorderState = GetRecorderState();
+
+               switch (recorderState)
+               {
+               case ::RECORDER_STATE_NONE:
+                       break;
+               case ::RECORDER_STATE_CREATED:
+                       __mode = _CAMERA_MODE_IMAGE;
+                       __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
+                       if (callback)
+                       {
+                               r = NotifyModeChangePrepared(mode);
+                               SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       }
+                       break;
+
+               case ::RECORDER_STATE_READY:
+                       r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+
+                       __mode = _CAMERA_MODE_IMAGE;
+                       __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
+                       if (callback)
+                       {
+                               r = NotifyModeChangePrepared(mode);
+                               SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       }
+                       r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       break;
+
+               case ::RECORDER_STATE_RECORDING:
+                       //fall through
+               case ::RECORDER_STATE_PAUSED:
+                       err = recorder_cancel(__recorderHandle);                // TODO
+                       r = ConvertResult(err);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+
+                       r = ChangeRecorderStateTo(::RECORDER_STATE_CREATED);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       recorderDevice = __cameraDevice == _CAMERA_DEVICE_PRIMARY ?
+                               _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA;
+
+                       __mode = _CAMERA_MODE_IMAGE;
+                       __reloadCameraPreviewFormat = reloadCameraPreviewFormat;
+                       if (callback)
+                       {
+                               r = NotifyModeChangePrepared(mode);
+                               SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       }
+                       r = ChangeCameraStateTo(::CAMERA_STATE_PREVIEW);
+                       SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+                       break;
+
+               default:
+                       break;
+               }
+       }
+
+       if (callback)
+       {
+               // Notify that the mode is changed to callback camera and video recorder's configurations.
+               r = NotifyModeChanged(mode);
+               SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+       }
+       return r;
+CATCH:
+       return r;
+}
+
+result
 _CameraCoordinator::ChangeMode(_CameraMode mode, bool callback)
 {
        result r = E_SUCCESS;
@@ -972,6 +1206,7 @@ _CameraCoordinator::StartCapture(camera_capturing_cb capturingCb , camera_captur
                SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
        }
 
+       __mode = _CAMERA_MODE_IMAGE;
        err = camera_start_capture(__cameraHandle, capturingCb, completedCb, pUserData);
        r = ConvertResult(err);
        SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Camera capture failed.", GetErrorMessage(r));
@@ -996,6 +1231,7 @@ _CameraCoordinator::StartRecord(void)
                SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
        }
 
+       __mode = _CAMERA_MODE_VIDEO;
        err = recorder_start(__recorderHandle);
        r = ConvertResult(err);
        SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Recorder record failed.", GetErrorMessage(r));
@@ -1064,4 +1300,10 @@ _CameraCoordinator::SetCameraOrientationAttr(CameraExifOrientation orientation)
        return r;
 }
 
+camera_pixel_format_e
+_CameraCoordinator::GetReloadPreviewFormat(void) const
+{
+       SysLog(NID_MEDIA, "reloadCameraPreviewFormat is :%d", __reloadCameraPreviewFormat);
+       return __reloadCameraPreviewFormat;
+}
 }}