merge commits of 2.2.1 to public
[platform/framework/native/media.git] / src / FMedia_VideoRecorderImpl.cpp
index 99f9322..b99628a 100755 (executable)
@@ -110,7 +110,7 @@ static const _VideoCallbackEventTable _VIDEO_CALLBACK_EVENT[] =
 
 typedef struct
 {
-       const char* pCodecName;
+       const wchar_t* pCodecName;
        CodecType audioCodec;
        CodecType videoCodec;
        MediaContainerType container;
@@ -118,11 +118,11 @@ typedef struct
 
 static const _CodecValTable _CODEC_VAL_TABLE[] =
 {
-       {"VIDEO_CODEC_NONE",            CODEC_NONE,     CODEC_NONE,     MEDIA_CONTAINER_NONE},
-       {"VIDEO_CODEC_H263",            CODEC_AMR_NB, CODEC_H263,       MEDIA_CONTAINER_3GP},           //TODO bug reported
-//     {"VIDEO_CODEC_H263",            CODEC_AAC,      CODEC_H263,     MEDIA_CONTAINER_3GP},
-       {"VIDEO_CODEC_MPEG4SP",         CODEC_AAC,      CODEC_MPEG4,    MEDIA_CONTAINER_MP4},
-       {"VIDEO_CODEC_H264",            CODEC_AAC,      CODEC_H264,     MEDIA_CONTAINER_MP4},
+       {L"VIDEO_CODEC_NONE",           CODEC_NONE,     CODEC_NONE,     MEDIA_CONTAINER_NONE},
+       {L"VIDEO_CODEC_H263",           CODEC_AMR_NB, CODEC_H263,       MEDIA_CONTAINER_3GP},           //TODO bug reported
+//     {L"VIDEO_CODEC_H263",           CODEC_AAC,      CODEC_H263,     MEDIA_CONTAINER_3GP},
+       {L"VIDEO_CODEC_MPEG4SP",        CODEC_AAC,      CODEC_MPEG4,    MEDIA_CONTAINER_MP4},
+       {L"VIDEO_CODEC_H264",           CODEC_AAC,      CODEC_H264,     MEDIA_CONTAINER_MP4},
        {null,                                          CODEC_NONE,     CODEC_NONE,     MEDIA_CONTAINER_NONE}
 };
 
@@ -165,7 +165,7 @@ _VideoRecorderImpl::_VideoRecorderImpl(void)
        , __stateChangeReason(_RECORDER_STATE_REASON_NORMAL)
        , __pAudioStreamCoordinator(null)
        , __audioStreamTimeDuration(0)
-       , __audioStreamCallback(false)
+       , __audioStreamFilterState(_AUDIO_STREAM_FILTER_OFF)
 {
        __recordingResolution.width = 0;
        __recordingResolution.height = 0;
@@ -183,6 +183,10 @@ _VideoRecorderImpl::~_VideoRecorderImpl(void)
                err = recorder_unset_error_cb(__handle);
                err = recorder_unset_recording_status_cb(__handle);
                err = recorder_unset_interrupted_cb(__handle);
+               if (__audioStreamFilterState != _AUDIO_STREAM_FILTER_OFF)
+               {
+                       err = recorder_unset_audio_stream_cb(__handle);
+               }
                __handle = MM_INVALID_HANDLE;
        }
        if (__pCoordinator != null)
@@ -327,22 +331,59 @@ CATCH:
 }
 
 result
-_VideoRecorderImpl::AddAudioStreamFilter(IAudioStreamFilter& filter)
+_VideoRecorderImpl::ChangeAudioStreamFilterState(_AudioStreamFilterState nextState)
 {
        result r = E_SUCCESS;
+       int err = ::RECORDER_ERROR_NONE;
+       _AudioStreamFilterState currentState = __audioStreamFilterState;
 
-       r = __pAudioStreamCoordinator->AddAudioStreamFilter(filter);
-       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       SysTryReturn(NID_MEDIA, nextState >= _AUDIO_STREAM_FILTER_OFF && nextState <= _AUDIO_STREAM_FILTER_PLAYING, E_INVALID_ARG, E_INVALID_ARG
+                  , "[E_INVALID_ARG] Invalid argument(AudioStreamFilterState) is used. nextState=%d.", nextState);
 
-       if (__audioStreamCallback != true)
+       if (currentState == nextState)
        {
-               int err = ::RECORDER_ERROR_NONE;
-               err = recorder_set_audio_stream_cb(__handle, AudioStreamCb, this);
+               SysLog(NID_MEDIA, "Current state(%d) is same next state(%d).", __audioStreamFilterState, nextState);
+               return r;
+       }
+
+       switch (nextState)
+       {
+       case _AUDIO_STREAM_FILTER_OFF:
+               err = recorder_unset_audio_stream_cb(__handle);
                r = ConvertResult(err);
-               SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] audio recorder set audio stream callback failed.", GetErrorMessage(r));
-               __audioStreamCallback  = true;
+               SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] video recorder unset recording status callback failed.", GetErrorMessage(r));
+               break;
+
+       case _AUDIO_STREAM_FILTER_HIBERNATION:
+               //fall through
+       case _AUDIO_STREAM_FILTER_PLAYING:
+               if (currentState == _AUDIO_STREAM_FILTER_OFF)
+               {
+                       err = recorder_set_audio_stream_cb(__handle, AudioStreamCb, this);
+                       r = ConvertResult(err);
+                       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] video recorder set audio stream callback failed.", GetErrorMessage(r));
+               }
+               break;
        }
 
+       SysLog(NID_MEDIA, "current state : %d, next state : %d", __audioStreamFilterState, nextState);
+       __audioStreamFilterState = nextState;
+
+       return r;
+}
+
+result
+_VideoRecorderImpl::AddAudioStreamFilter(IAudioStreamFilter& filter)
+{
+       result r = E_SUCCESS;
+       SysLog(NID_MEDIA, "video recorder AddAudioStreamFilter");
+
+       r = __pAudioStreamCoordinator->AddAudioStreamFilter(filter);
+       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       r = ChangeAudioStreamFilterState(_AUDIO_STREAM_FILTER_PLAYING);
+       SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] video recorder set audio stream callback failed.", GetErrorMessage(r));
+
        return r;
 }
 
@@ -350,17 +391,16 @@ result
 _VideoRecorderImpl::RemoveAudioStreamFilter(IAudioStreamFilter& filter)
 {
        result r = E_SUCCESS;
+       SysLog(NID_MEDIA, "video recorder RemoveAudioStreamFilter");
 
        r = __pAudioStreamCoordinator->RemoveAudioStreamFilter(filter);
        SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
        if (__pAudioStreamCoordinator->GetFilterListCount() == 0)
        {
-               int err = ::RECORDER_ERROR_NONE;
-               err = recorder_unset_audio_stream_cb(__handle);
-               r = ConvertResult(err);
-               SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] audio recorder unset recording status callback failed.", GetErrorMessage(r));
-               __audioStreamCallback = false;
+               _AudioStreamFilterState state = (GetMmState() == ::RECORDER_STATE_RECORDING ? _AUDIO_STREAM_FILTER_HIBERNATION : _AUDIO_STREAM_FILTER_OFF);
+               r = ChangeAudioStreamFilterState(state);
+               SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] video recorder unset audio stream callback failed.", GetErrorMessage(r));
        }
 
        return r;
@@ -472,6 +512,12 @@ _VideoRecorderImpl::Record(void)
                SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
        }
 
+       if (__audioStreamFilterState == _AUDIO_STREAM_FILTER_HIBERNATION)
+       {
+               r = ChangeAudioStreamFilterState(_AUDIO_STREAM_FILTER_OFF);
+               SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder unset audio stream callback failed.", GetErrorMessage(r));
+       }
+
        mmState = GetMmState();
        switch (mmState)
        {
@@ -1362,7 +1408,7 @@ _VideoRecorderImpl::AudioStreamCb(void* pStream, int size, audio_sample_type_e f
        SysTryReturnVoidResult(NID_MEDIA, _CamRef::IsAlive(*pImpl), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
        SysTryReturnVoidResult(NID_MEDIA, pStream != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] void instance is not available. pStream is null.");
 
-       if (pImpl->__audioStreamCallback == true)
+       if (pImpl->__audioStreamFilterState == _AUDIO_STREAM_FILTER_PLAYING)
        {
                samplingRate = _RecorderUtil::CalculateSampleRate(size, channel, pImpl->__audioStreamTimeDuration, _RecorderUtil::GetOspSampleType(format));
                (pImpl->__pAudioStreamCoordinator)->ProcessAudioStreamData((byte*)pStream, size, samplingRate, _RecorderUtil::GetOspChannelType(channel), _RecorderUtil::GetOspSampleType(format));
@@ -1496,7 +1542,9 @@ _VideoRecorderImpl::ConvertResult(int err) const
        {
                r = E_SYSTEM;
        }
-       else if (err == ::RECORDER_ERROR_SOUND_POLICY)
+       else if (err == ::RECORDER_ERROR_SOUND_POLICY
+               || err == ::RECORDER_ERROR_SOUND_POLICY_BY_CALL
+               || err == ::RECORDER_ERROR_SOUND_POLICY_BY_ALARM)
        {
                r = E_DEVICE_BUSY;
        }
@@ -1668,11 +1716,9 @@ void
 _VideoRecorderImpl::GetMediaType(const Base::String& codec, CodecType& audioCodec, CodecType& videoCodec, MediaContainerType& container) const
 {
        int i = 0;
-       std::unique_ptr<char[]> pCodecChars (Tizen::Base::_StringConverter::CopyToCharArrayN(codec));
-
        while (_CODEC_VAL_TABLE[i].pCodecName != null)
        {
-               if (strcmp(_CODEC_VAL_TABLE[i].pCodecName, pCodecChars.get()) == 0)
+               if (String(_CODEC_VAL_TABLE[i].pCodecName).Equals(codec))
                {
                        videoCodec = _CODEC_VAL_TABLE[i].videoCodec;
                        audioCodec = _CODEC_VAL_TABLE[i].audioCodec;