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_VideoRecorderImpl.cpp
20 * @brief This is the implementation file for the %_VideoRecorderImpl class.
23 #include <unique_ptr.h>
26 #include <FBaseInteger.h>
27 #include <FBaseSysLog.h>
28 #include <FBase_StringConverter.h>
29 #include <FMediaVideoRecorder.h>
30 #include "FMedia_CameraImpl.h"
31 #include "FMedia_CapabilityImpl.h"
32 #include "FMedia_CameraCoordinator.h"
33 #include "FMedia_VideoRecorderImpl.h"
34 #include "FMedia_VideoRecorderEvent.h"
35 #include "FMedia_VideoSourceAdapter.h"
36 #include "FMedia_CameraUtil.h"
37 #include "FMedia_RecorderUtil.h"
38 #include "FMedia_RecorderCapability.h"
39 #include "FMedia_CamPtrUtil.h"
40 #include "FMedia_AudioStreamCoordinator.h"
42 using namespace Tizen::Base;
43 using namespace Tizen::Base::Collection;
44 using namespace Tizen::Graphics;
46 namespace Tizen { namespace Media
48 static const int _RELOAD_FORMAT = 0x1;
49 static const int _RELOAD_QUALITY = 0x1 << 1;
50 static const int _RELOAD_MAX_TIME = 0x1 << 2;
51 static const int _RELOAD_RECORD_RESOLUTION = 0x1 << 3;
52 static const int _RELOAD_FILE_PATH = 0x1 << 4;
53 static const int _RELOAD_INIT = 0x1 << 5;
54 static const int _RELOAD_CALLBACK = 0x1 << 6;
55 static const int _RELOAD_MUTE = 0x1 << 7;
56 static const int _RELOAD_ROTATION = 0x1 << 8;
58 typedef int (*_VideoRecorderFunc)(_RecorderHandle mmHandle);
62 recorder_state_e preState;
63 recorder_state_e postState;
64 _RecorderStateChangeReason reason;
65 _VideoRecorderFunc pFunc;
67 }_VideoCommandStateTable;
69 static const _VideoCommandStateTable _VIDEO_COMMAND_STATE[] =
71 {::RECORDER_STATE_CREATED, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL, recorder_prepare, (RecorderState)-1 },
72 {::RECORDER_STATE_READY, ::RECORDER_STATE_RECORDING, _RECORDER_STATE_REASON_NORMAL, recorder_start, RECORDER_STATE_STARTING },
73 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_PAUSED, _RECORDER_STATE_REASON_NORMAL, recorder_pause, RECORDER_STATE_PAUSING },
74 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL, recorder_commit, RECORDER_STATE_STOPPING },
75 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_CANCEL, recorder_cancel, RECORDER_STATE_STOPPING },
76 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_END_SIZE_REACHED, recorder_commit, RECORDER_STATE_RECORDING },
77 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_END_TIME_REACHED, recorder_commit, RECORDER_STATE_RECORDING },
78 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_RECORDING, _RECORDER_STATE_REASON_NORMAL, recorder_start, RECORDER_STATE_STARTING },
79 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL, recorder_commit, RECORDER_STATE_STOPPING },
80 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_CANCEL, recorder_cancel, RECORDER_STATE_STOPPING },
81 {::RECORDER_STATE_READY, ::RECORDER_STATE_CREATED, _RECORDER_STATE_REASON_NORMAL, recorder_unprepare, RECORDER_STATE_CLOSING },
86 recorder_state_e prevState;
87 recorder_state_e postState;
88 _RecorderStateChangeReason reason;
89 _RecorderEventType event;
90 RecorderErrorReason error;
91 }_VideoCallbackEventTable;
93 static const _VideoCallbackEventTable _VIDEO_CALLBACK_EVENT[] =
95 {::RECORDER_STATE_READY, ::RECORDER_STATE_RECORDING, _RECORDER_STATE_REASON_NORMAL, _RECORDER_EVENT_RECORDING_STARTED, RECORDER_ERROR_NONE },
96 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_PAUSED, _RECORDER_STATE_REASON_NORMAL, _RECORDER_EVENT_PAUSED, RECORDER_ERROR_NONE },
97 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL, _RECORDER_EVENT_STOPPED, RECORDER_ERROR_NONE },
98 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_CANCEL, _RECORDER_EVENT_CANCELED, RECORDER_ERROR_NONE },
99 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_END_SIZE_REACHED, _RECORDER_EVENT_ENDOF_FILESIZE, RECORDER_ERROR_NONE },
100 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_END_TIME_REACHED, _RECORDER_EVENT_ENDOF_RECTIME, RECORDER_ERROR_NONE },
101 {::RECORDER_STATE_RECORDING, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_OUT_OF_STORAGE, _RECORDER_EVENT_ERROR, RECORDER_ERROR_OUT_OF_STORAGE },
102 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_RECORDING, _RECORDER_STATE_REASON_NORMAL, _RECORDER_EVENT_RECORDING_STARTED, RECORDER_ERROR_NONE },
103 {::RECORDER_STATE_PAUSED, ::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL, _RECORDER_EVENT_STOPPED, RECORDER_ERROR_NONE },
104 // {::RECORDER_STATE_READY, ::RECORDER_STATE_CREATED, _RECORDER_STATE_REASON_NORMAL, _RECORDER_EVENT_CLOSED, RECORDER_ERROR_NONE },
109 const char* pCodecName;
110 CodecType audioCodec;
111 CodecType videoCodec;
112 MediaContainerType container;
115 static const _CodecValTable _CODEC_VAL_TABLE[] =
117 {"VIDEO_CODEC_NONE", CODEC_NONE, CODEC_NONE, MEDIA_CONTAINER_NONE},
118 {"VIDEO_CODEC_H263", CODEC_AMR_NB, CODEC_H263, MEDIA_CONTAINER_3GP}, //TODO bug reported
119 // {"VIDEO_CODEC_H263", CODEC_AAC, CODEC_H263, MEDIA_CONTAINER_3GP},
120 {"VIDEO_CODEC_MPEG4SP", CODEC_AAC, CODEC_MPEG4, MEDIA_CONTAINER_MP4},
121 {"VIDEO_CODEC_H264", CODEC_AAC, CODEC_H264, MEDIA_CONTAINER_MP4},
122 {null, CODEC_NONE, CODEC_NONE, MEDIA_CONTAINER_NONE}
125 bool _VideoRecorderImpl::__isUsed = false;
127 _VideoRecorderImpl::_VideoRecorderImpl(void)
128 : __pCoordinator(null)
129 , __pVideoRecorderEvent(null)
130 , __pVideoRecorderEventListener(null)
131 , __pVideoSourceAdapter(null)
132 , __isConstructed(false)
133 , __state(RECORDER_STATE_INITIALIZED)
136 , __maxTime(DEFAULT_VIDEORECORDING_TIME)
137 , __format(VIDEORECORDING_FORMAT_DEFAULT)
138 , __audioCodec(CODEC_AAC) // TODO
139 , __videoCodec(CODEC_MPEG4)
140 , __container(MEDIA_CONTAINER_MP4)
141 , __mode(VIDEORECORDER_MODE_VIDEO_WITH_AUDIO)
142 , __quality(RECORDING_QUALITY_MEDIUM)
144 , __rotation(RECORDING_ROTATION_NONE)
145 , __handle(MM_INVALID_HANDLE)
146 , __deviceType(_RECORDER_DEVICE_NONE)
147 , __mmSourceFormat(CAMERA_PIXEL_FORMAT_INVALID)
148 , __stateChangeReason(_RECORDER_STATE_REASON_NORMAL)
149 , __pAudioStreamCoordinator(null)
150 , __audioStreamTimeDuration(0)
151 , __audioStreamCallback(false)
153 __recordingResolution.width = 0;
154 __recordingResolution.height = 0;
158 _VideoRecorderImpl::~_VideoRecorderImpl(void)
160 if (__handle != MM_INVALID_HANDLE)
162 int err = ::RECORDER_ERROR_NONE;
163 err = recorder_unset_state_changed_cb(__handle);
164 err = recorder_unset_audio_stream_cb(__handle);
165 err = recorder_unset_recording_limit_reached_cb(__handle);
166 err = recorder_unset_error_cb(__handle);
167 err = recorder_unset_recording_status_cb(__handle);
168 err = recorder_unset_interrupted_cb(__handle);
169 __handle = MM_INVALID_HANDLE;
171 if (__pCoordinator != null)
173 if (__pVideoSourceAdapter != null)
175 if (__pVideoSourceAdapter->GetUserPreviewFormat() != __pCoordinator->GetCameraSourceFormat())
177 __pCoordinator->ChangeFormat(_CAMERA_MODE_IMAGE, true, __pVideoSourceAdapter->GetUserPreviewFormat());
180 __pCoordinator->DestroyVideoRecorder();
181 __pCoordinator->RemoveCameraCoordinatorListener(*this);
183 _CameraCoordinator::Release(__deviceType);
186 if ( __isConstructed )
191 SysLog(NID_MEDIA, "video recorder Destroyed");
195 _VideoRecorderImpl::Construct(IVideoRecorderEventListener& listener, const Camera& camera)
197 result r = E_SUCCESS;
198 Tizen::Media::Camera* pCamera = null;
199 Tizen::Media::_CameraImpl* pCamImpl = null;
200 int err = MM_SUCCESS;
202 _CapabilityImpl* pCapabilityImpl = null;
204 SysTryReturn(NID_MEDIA, !__isUsed, E_DEVICE_BUSY, E_DEVICE_BUSY, "[E_DEVICE_BUSY] _VideoRecorderImpl is now being used.");
205 SysTryReturn(NID_MEDIA, !__isConstructed, E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state. A device is already constructed.");
206 SysLog(NID_MEDIA, "video recorder construct");
208 pCamera = const_cast<Tizen::Media::Camera*>(&camera);
209 pCamImpl = _CameraImpl::GetInstance(pCamera);
212 __pVideoSourceAdapter.reset(new (std::nothrow) _VideoSourceAdapter(*pCamImpl));
213 SysTryCatch(NID_MEDIA, __pVideoSourceAdapter.get() != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
216 __pVideoRecorderEvent.reset(new (std::nothrow) _VideoRecorderEvent());
217 SysTryCatch(NID_MEDIA, __pVideoRecorderEvent.get() != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
219 r = __pVideoRecorderEvent->Construct(*this);
220 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
222 r = __pVideoRecorderEvent->AddListener(listener);
223 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
224 __pVideoRecorderEventListener = &listener;
226 // Create audio stream coordinator
227 __pAudioStreamCoordinator.reset(new (std::nothrow) _AudioStreamCoordinator());
228 SysTryCatch(NID_MEDIA, __pAudioStreamCoordinator.get() != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
230 r = __pAudioStreamCoordinator->Construct();
231 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
233 // Get the capability
234 pCapabilityImpl = _CapabilityImpl::GetInstance();
235 SysTryCatch(NID_MEDIA, pCapabilityImpl != null, r= E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Capability is not obtained.");
237 r = pCapabilityImpl->GetValue(String(L"VideoRecorder.Device.fps"), streamFps);
238 //SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
244 __audioStreamTimeDuration = (1000/streamFps); //Time duration in milisec
247 __deviceType = (pCamImpl->GetSelection() == CAMERA_PRIMARY ? _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA
248 : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA);
250 __pCoordinator = _CameraCoordinator::AddInstance(__deviceType);
252 SysTryCatch(NID_MEDIA, __pCoordinator != null, , r, "[E_OBJ_NOT_FOUND] _CameraCoordinator instance is not available.");
254 r = __pCoordinator->AddCameraCoordinatorListener(*this);
255 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
257 //If the reload flag is true, the __handle will be updated in the OnCameraCoordinatorModeChangePrepared(), otherwise the __handle should be updated manually.
258 r = __pCoordinator->CreateVideoRecorder(); // Do not reload. The __mmSourceFormat is not set yet.
259 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] CreateVideoRecorder failed.", GetErrorMessage(r));
261 __handle = __pCoordinator->GetRecorderHandle();
263 err = recorder_set_state_changed_cb(__handle, StateChangedCb, this);
264 r = ConvertResult(err);
265 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set message callback failed.", GetErrorMessage(r));
267 err = recorder_set_recording_limit_reached_cb(__handle, LimitReachedCb, this);
268 r = ConvertResult(err);
269 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set limit reached callback failed.", GetErrorMessage(r));
271 err = recorder_set_recording_status_cb(__handle, RecordingStatusCb, this);
272 r = ConvertResult(err);
273 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set recording status callback failed.", GetErrorMessage(r));
275 err = recorder_set_error_cb(__handle, ErrorCb, this);
276 r = ConvertResult(err);
277 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set limit reached callback failed.", GetErrorMessage(r));
279 err = recorder_set_interrupted_cb(__handle, InterruptedCb, this);
280 r = ConvertResult(err);
281 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set limit reached callback failed.", GetErrorMessage(r));
283 r = LoadDefaultConfiguration(_RELOAD_RECORD_RESOLUTION);
284 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
286 SetState(RECORDER_STATE_INITIALIZED);
287 __isConstructed = true;
295 err = recorder_unset_state_changed_cb(__handle);
296 err = recorder_unset_recording_limit_reached_cb(__handle);
297 err = recorder_unset_error_cb(__handle);
298 err = recorder_unset_recording_status_cb(__handle);
299 err = recorder_unset_interrupted_cb(__handle);
300 __handle = MM_INVALID_HANDLE;
303 if (__pCoordinator != null)
305 __pCoordinator->RemoveCameraCoordinatorListener(*this);
312 _VideoRecorderImpl::AddAudioStreamFilter(IAudioStreamFilter& filter)
314 result r = E_SUCCESS;
316 r = __pAudioStreamCoordinator->AddAudioStreamFilter(filter);
317 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
319 if (__audioStreamCallback != true)
321 int err = ::RECORDER_ERROR_NONE;
322 err = recorder_set_audio_stream_cb(__handle, AudioStreamCb, this);
323 r = ConvertResult(err);
324 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] audio recorder set audio stream callback failed.", GetErrorMessage(r));
325 __audioStreamCallback = true;
332 _VideoRecorderImpl::RemoveAudioStreamFilter(IAudioStreamFilter& filter)
334 result r = E_SUCCESS;
336 r = __pAudioStreamCoordinator->RemoveAudioStreamFilter(filter);
337 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
339 if (__pAudioStreamCoordinator->GetFilterListCount() == 0)
341 int err = ::RECORDER_ERROR_NONE;
342 err = recorder_unset_audio_stream_cb(__handle);
343 r = ConvertResult(err);
344 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] audio recorder unset recording status callback failed.", GetErrorMessage(r));
345 __audioStreamCallback = false;
352 _VideoRecorderImpl::CreateVideoFile(const Tizen::Base::String& mediaLocalPath, bool overwrite)
354 result r = E_SUCCESS;
355 RecorderState state = RECORDER_STATE_ERROR;
356 int err = MM_SUCCESS;
357 SysLog(NID_MEDIA, "video recorder create video file");
360 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED || state == RECORDER_STATE_CLOSED,
361 E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state(%d).", state);
363 std::unique_ptr<char[]> pFileName (_StringConverter::CopyToCharArrayN(mediaLocalPath));
364 SysTryCatch(NID_MEDIA, pFileName.get() != null, r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(mediaLocalPath) is used. File name is null.");
365 SysLog(NID_MEDIA, "File Path : %s\n, overwrite:%d", pFileName.get(), overwrite);
367 r = _RecorderUtil::PrepareFile(mediaLocalPath, overwrite);
368 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder prepare file failed. mediaLocalPath:%s, overwirte:%d",
369 GetErrorMessage(r), pFileName.get(), overwrite);
371 err = recorder_set_filename(__handle, pFileName.get());
372 r = ConvertResult(err);
373 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
375 SetState(RECORDER_STATE_OPENED);
377 // re-configuration for new recorder handle
378 r = ReloadConfiguration(_RELOAD_FORMAT | _RELOAD_QUALITY | _RELOAD_MAX_TIME | _RELOAD_INIT | _RELOAD_ROTATION);
379 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder reload configuration failed", GetErrorMessage(r));
381 __filePath = mediaLocalPath;
390 _VideoRecorderImpl::Close(void)
392 result r = E_SUCCESS;
393 RecorderState state = RECORDER_STATE_ERROR;
394 SysLog(NID_MEDIA, "video recorder close");
398 NID_MEDIA, state == RECORDER_STATE_OPENED || state == RECORDER_STATE_STOPPED
399 || state == RECORDER_STATE_ENDOF_FILE || state == RECORDER_STATE_ERROR
400 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d", state);
402 // Just send closed event
403 r = GetEvent()->SendEvent(_RECORDER_EVENT_CLOSED, RECORDER_ERROR_NONE, E_SUCCESS);
404 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
413 _VideoRecorderImpl::Record(void)
415 result r = E_SUCCESS;
416 RecorderState state = RECORDER_STATE_ERROR;
417 recorder_state_e mmState = ::RECORDER_STATE_NONE;
418 SysLog(NID_MEDIA, "video recorder record");
421 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_OPENED || state == RECORDER_STATE_PAUSED
422 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d", state);
424 if (__pVideoSourceAdapter->HasRecordingResolutionRestriction())
426 SysTryReturn(NID_MEDIA, __recordingResolution == __pVideoSourceAdapter->GetSourceResolution()
427 , E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. __recordingResolution(%d,%d) is not same VideoSourceResolution.", __recordingResolution.width, __recordingResolution.height);
430 std::unique_ptr<IListT<camera_pixel_format_e>, _ListPtrUtil::Remover> pSupportedMmSourceFormatList (__pVideoSourceAdapter->GetSupportedRecordingFormatListN(), _ListPtrUtil::remover);
431 SysTryCatch(NID_MEDIA, pSupportedMmSourceFormatList.get() != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Source's supported recording format is empty");
433 // In case of the preview format is not supported to the Video Recorder, regardless of the current mode,
434 // the recorder should be reset and the preview format should be changed for recording supported one.
435 if ( !pSupportedMmSourceFormatList->Contains(__pCoordinator->GetCameraSourceFormat()))
437 SysLog(NID_MEDIA, "Current coordinaotr's mm format(%d) is not supported to record.", __pCoordinator->GetCameraSourceFormat());
438 r = pSupportedMmSourceFormatList->GetAt(0, __mmSourceFormat);
439 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Camera mode change failed.", GetErrorMessage(r));
441 // If the preview data format is changed, the properties should be set again.
442 r = __pCoordinator->ChangeFormat(_CAMERA_MODE_VIDEO, true, __mmSourceFormat);
443 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder Mode change failed.", GetErrorMessage(r));
445 else if ( __pCoordinator->GetMode() != _CAMERA_MODE_VIDEO )
447 SysLog(NID_MEDIA, "Current Preview mm format format is default mm format format (%d). ", __pCoordinator->GetCameraSourceFormat());
449 __mmSourceFormat = __pCoordinator->GetCameraSourceFormat();
451 r = ReloadConfiguration(_RELOAD_FORMAT | _RELOAD_QUALITY | _RELOAD_MAX_TIME | _RELOAD_FILE_PATH | _RELOAD_CALLBACK | _RELOAD_MUTE | _RELOAD_ROTATION);
452 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
455 mmState = GetMmState();
458 case ::RECORDER_STATE_CREATED:
459 r = ChangeStateTo(::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL);
460 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder init failed.", GetErrorMessage(r));
462 r = __pCoordinator->StartRecord();
463 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder start failed.", GetErrorMessage(r));
464 __stateChangeReason = _RECORDER_STATE_REASON_NORMAL;
465 SetState(RECORDER_STATE_STARTING);
468 case ::RECORDER_STATE_READY:
469 r = __pCoordinator->StartRecord();
470 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder start failed.", GetErrorMessage(r));
471 __stateChangeReason = _RECORDER_STATE_REASON_NORMAL;
472 SetState(RECORDER_STATE_STARTING);
475 case ::RECORDER_STATE_PAUSED:
476 r = __pCoordinator->StartRecord();
477 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder resume failed.", GetErrorMessage(r));
478 __stateChangeReason = _RECORDER_STATE_REASON_NORMAL;
479 SetState(RECORDER_STATE_STARTING);
492 _VideoRecorderImpl::Stop(void)
494 result r = E_SUCCESS;
495 RecorderState state = RECORDER_STATE_ERROR;
496 SysLog(NID_MEDIA, "Enter.");
500 NID_MEDIA, state == RECORDER_STATE_RECORDING || state == RECORDER_STATE_PAUSING || state == RECORDER_STATE_PAUSED
501 || state == RECORDER_STATE_STARTING
502 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d",
505 r = ChangeStateTo(::RECORDER_STATE_READY, _RECORDER_STATE_REASON_NORMAL);
506 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder record stop failed.", GetErrorMessage(r));
514 _VideoRecorderImpl::Pause(void)
516 result r = E_SUCCESS;
517 RecorderState state = RECORDER_STATE_ERROR;
518 SysLog(NID_MEDIA, "Enter.");
521 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_RECORDING, E_INVALID_STATE, E_INVALID_STATE,
522 "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d",
525 r = ChangeStateTo(::RECORDER_STATE_PAUSED, _RECORDER_STATE_REASON_NORMAL);
526 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder pause failed.", GetErrorMessage(r));
535 _VideoRecorderImpl::Cancel(void)
537 result r = E_SUCCESS;
538 RecorderState state = RECORDER_STATE_ERROR;
539 SysLog(NID_MEDIA, "Enter.");
543 NID_MEDIA, state == RECORDER_STATE_RECORDING || state == RECORDER_STATE_PAUSING || state == RECORDER_STATE_PAUSED
544 || state == RECORDER_STATE_STARTING, E_INVALID_STATE, E_INVALID_STATE,
545 "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d", state);
547 r = ChangeStateTo(::RECORDER_STATE_READY, _RECORDER_STATE_REASON_CANCEL);
548 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder cancel failed.", GetErrorMessage(r));
557 _VideoRecorderImpl::GetState(void) const
563 _VideoRecorderImpl::GetRecordingTime(void) const
569 _VideoRecorderImpl::GetRecordingSize(void) const
575 _VideoRecorderImpl::SetMaxRecordingTime(long msTime)
577 result r = E_SUCCESS;
578 RecorderState state = RECORDER_STATE_ERROR;
579 SysLog(NID_MEDIA, "Enter. msTime:%d", msTime);
583 NID_MEDIA, state == RECORDER_STATE_INITIALIZED
584 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE || state == RECORDER_STATE_CLOSED
585 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.",
588 SysTryReturn(NID_MEDIA, msTime > 0, E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] msTime is out of range. msTime:%d must be greater than 0.",
591 r = SetMaxRecordingTimeAttr(msTime);
592 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder set max recording time failed. msTime:%ls", GetErrorMessage(r), msTime);
593 // For reload and Get the exact value
603 _VideoRecorderImpl::GetMaxRecordingTime(void) const
609 _VideoRecorderImpl::SetCodec(const Tizen::Base::String& codec)
611 result r = E_SUCCESS;
612 CodecType audioCodec = CODEC_NONE;
613 CodecType videoCodec = CODEC_NONE;
614 MediaContainerType container = MEDIA_CONTAINER_NONE;
615 SysLog(NID_MEDIA, "Enter. codec:%ls", codec.GetPointer());
616 SysTryReturn(NID_MEDIA, !codec.IsEmpty(), E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC, "[E_UNSUPPORTED_CODEC] The codec is empty.\n");
618 RecorderState state = GetState();
619 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
620 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE
621 || state == RECORDER_STATE_CLOSED
622 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d", state);
624 std::unique_ptr<IList, _ListPtrUtil::Remover> pList (GetSupportedCodecListN(), _ListPtrUtil::remover);
625 SysTryCatch(NID_MEDIA, pList.get() != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Getting the supported list was failed.\n");
626 SysTryCatch(NID_MEDIA, pList->Contains(codec), r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC, "[E_UNSUPPORTED_CODEC]. This codec(%ls) is not supported in the device.\n", codec.GetPointer());
628 GetMediaType(codec, audioCodec, videoCodec, container);
629 SysTryCatch(NID_MEDIA, audioCodec != CODEC_NONE && videoCodec != CODEC_NONE, r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC
630 , "[E_UNSUPPORTED_CODEC]. This codec(%ls) is not supported in the device.\n", codec.GetPointer());
632 r = SetFormatAttr(audioCodec, videoCodec, container);
633 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] File format set failed. audioCodec:0x%x videoCodec:0x%x container:0x%x",
634 GetErrorMessage(r), audioCodec, videoCodec, videoCodec);
635 __audioCodec = audioCodec;
636 __videoCodec = videoCodec;
637 __container = container;
639 // Call the dependency function.
640 r = ReloadConfiguration(_RELOAD_QUALITY);
641 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder reload configuration.", GetErrorMessage(r));
648 _VideoRecorderImpl::GetCodec(void) const
651 GetCodecString(__videoCodec, codec);
655 Tizen::Base::Collection::IList*
656 _VideoRecorderImpl::GetSupportedCodecListN(void) const
658 _CapabilityImpl *pCapImpl = null;
659 result r = E_SUCCESS;
661 pCapImpl = _CapabilityImpl::GetInstance();
662 SysTryReturn(NID_MEDIA, pCapImpl != null, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Get capability information failed.");
664 std::unique_ptr<ArrayList, _ListPtrUtil::Remover> pCodecList (new (std::nothrow) Tizen::Base::Collection::ArrayList(), _ListPtrUtil::remover);
665 SysTryCatch(NID_MEDIA, pCodecList.get() !=null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
667 r = pCodecList->Construct();
668 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder get attribute failed.", GetErrorMessage(r));
670 r = pCapImpl->GetValueN(VIDEORECORDER_CODEC, *(pCodecList.get()));
671 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Converted from '%s'.", GetErrorMessage(r));
672 SysTryCatch(NID_MEDIA, pCodecList.get() != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Supported list was wrong.");
673 SysTryCatch(NID_MEDIA, pCodecList->GetCount() > 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The list was empty.");
675 return pCodecList.release();
682 _VideoRecorderImpl::SetFormat(VideoRecordingFormat format)
684 result r = E_SUCCESS;
685 RecorderState state = RECORDER_STATE_ERROR;
686 CodecType audioCodec = CODEC_NONE;
687 CodecType videoCodec = CODEC_NONE;
688 MediaContainerType container = MEDIA_CONTAINER_NONE;
689 SysLog(NID_MEDIA, "Enter. format:%d", format);
692 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
693 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE
694 || state == RECORDER_STATE_CLOSED
695 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.", state);
697 SysTryReturn(NID_MEDIA, format >= VIDEORECORDING_FORMAT_DEFAULT && format <= VIDEORECORDING_FORMAT_3GP
698 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The format(%d) is not supported.\n",
701 GetMediaType(format, audioCodec, videoCodec, container);
702 SysTryCatch(NID_MEDIA, audioCodec != CODEC_NONE && videoCodec != CODEC_NONE, r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC
703 , "[E_UNSUPPORTED_CODEC]. This format(%d) is not supported in the device.\n", format);
705 r = SetFormatAttr(audioCodec, videoCodec, container);
706 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] File format set failed. audioCodec:0x%x videoCodec:0x%x container:0x%x",
707 GetErrorMessage(r), audioCodec, videoCodec, videoCodec);
710 __audioCodec = audioCodec;
711 __videoCodec = videoCodec;
712 __container = container;
713 // Call the dependency function.
714 r = ReloadConfiguration(_RELOAD_QUALITY);
715 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder reload configuration.", GetErrorMessage(r));
724 _VideoRecorderImpl::GetFormat(void) const
730 _VideoRecorderImpl::SetFormat(CodecType audioCodec, CodecType videoCodec, MediaContainerType container)
732 result r = E_SUCCESS;
733 RecorderState state = RECORDER_STATE_ERROR;
734 bool supported = false;
735 SysLog(NID_MEDIA, "Enter. audioCodec:0x%x, videoCodec:0x%x, container:0x%x", audioCodec, videoCodec, container);
739 NID_MEDIA, state == RECORDER_STATE_INITIALIZED || state == RECORDER_STATE_OPENED || state ==
740 RECORDER_STATE_ENDOF_FILE || state == RECORDER_STATE_CLOSED
741 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.",
744 std::unique_ptr<ArrayListT<CodecType>, _ListPtrUtil::Remover> pAudioCodecListT (GetSupportedAudioCodecListN(), _ListPtrUtil::remover);
745 SysTryReturn(NID_MEDIA, pAudioCodecListT.get() != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Getting the supported list was failed.\n");
746 SysTryReturn(NID_MEDIA, pAudioCodecListT->Contains(audioCodec) || audioCodec == CODEC_NONE, E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC,
747 "[E_UNSUPPORTED_CODEC]This AudioCodec(%d) is not supported in the device.\n", audioCodec);
749 std::unique_ptr<ArrayListT<CodecType>, _ListPtrUtil::Remover> pVideoCodecListT (GetSupportedVideoCodecListN(), _ListPtrUtil::remover);
750 SysTryReturn(NID_MEDIA, pVideoCodecListT.get() != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Getting the supported list was failed.\n");
751 SysTryReturn(NID_MEDIA, pVideoCodecListT->Contains(videoCodec), E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC,
752 "[E_UNSUPPORTED_CODEC]This VideoCodec(%d) is not supported in the device.\n", videoCodec);
754 std::unique_ptr<ArrayListT<MediaContainerType>, _ListPtrUtil::Remover> pContainerCodecListT (GetSupportedContainerListN(), _ListPtrUtil::remover);
755 SysTryReturn(NID_MEDIA, pContainerCodecListT.get() != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Getting the supported list was failed.\n");
756 SysTryReturn(NID_MEDIA, pContainerCodecListT->Contains(container), E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT,
757 "[E_UNSUPPORTED_FORMAT]This Container(%d) is not supported in the device.\n", container);
759 supported = _RecorderUtil::CheckFormat(audioCodec, videoCodec, container);
760 SysTryCatch(NID_MEDIA, supported, r = E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT,
761 "[E_UNSUPPORTED_FORMAT] camcorder check foramt failed. audioCodec:0x%x, videoCodec:0x%x, container:0x%x",
762 audioCodec, videoCodec,
765 r = SetFormatAttr(audioCodec, videoCodec, container);
766 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] File format set failed. audioCodec:0x%x videoCodec:0x%x container:0x%x",
767 GetErrorMessage(r), audioCodec, videoCodec, videoCodec);
769 __audioCodec = audioCodec;
770 __videoCodec = videoCodec;
771 __container = container;
773 // Call the dependency function.
774 r = ReloadConfiguration(_RELOAD_QUALITY);
775 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder reload configuration.", GetErrorMessage(r));
782 _VideoRecorderImpl::GetFormat(CodecType& audioCodec, CodecType& videoCodec, MediaContainerType& container) const
784 audioCodec = __audioCodec;
785 videoCodec = __videoCodec;
786 container = __container;
789 Tizen::Base::Collection::ArrayListT <CodecType>*
790 _VideoRecorderImpl::GetSupportedAudioCodecListN(void) const
792 result r = E_SUCCESS;
793 _ResultType itemType = _RESULT_INTEGER_LIST;
795 std::unique_ptr<IList, _ListPtrUtil::Remover> pIntegerList (_RecorderCapability::GetListN(_VROP_AUDIO_ENCODER, itemType), _ListPtrUtil::remover);
796 SysTryReturn(NID_MEDIA, pIntegerList.get() != null, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Supported list was wrong.");
797 SysTryReturn(NID_MEDIA, pIntegerList->GetCount() > 0, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The list was empty.");
799 std::unique_ptr<ArrayListT<CodecType>, _ListPtrUtil::Remover> pAudioCodecList (new (std::nothrow) ArrayListT<CodecType>(), _ListPtrUtil::remover);
800 SysTryReturn(NID_MEDIA, pAudioCodecList.get() != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
802 r = pAudioCodecList->Construct();
803 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
805 for (int i = 0; i < pIntegerList->GetCount(); i++)
808 Integer* pInteger = null;
809 pObj = pIntegerList->GetAt(i);
810 SysTryCatch(NID_MEDIA, pObj != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object instance is not available. %d item is not found.", i);
812 pInteger = dynamic_cast<Integer*>(pObj);
813 SysTryCatch(NID_MEDIA, pInteger != null, r = E_INVALID_FORMAT, E_INVALID_FORMAT, "[E_INVALID_FORMAT] %d item's format is invalid.", i);
815 r = pAudioCodecList->Add((CodecType)pInteger->ToInt());
816 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
817 SysLog(NID_MEDIA, "Pixel format : %d was added.", pInteger->ToInt());
820 return pAudioCodecList.release();
826 Tizen::Base::Collection::ArrayListT<CodecType>*
827 _VideoRecorderImpl::GetSupportedVideoCodecListN(void) const
829 result r = E_SUCCESS;
830 _ResultType itemType = _RESULT_INTEGER_LIST;
832 std::unique_ptr<IList, _ListPtrUtil::Remover> pIntegerList (_RecorderCapability::GetListN(_VROP_VIDEO_ENCODER, itemType), _ListPtrUtil::remover);
833 SysTryReturn(NID_MEDIA, pIntegerList.get() != null, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Supported list was wrong.");
834 SysTryReturn(NID_MEDIA, pIntegerList->GetCount() > 0, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The list was empty.");
836 std::unique_ptr<ArrayListT<CodecType>, _ListPtrUtil::Remover> pVideoCodecList (new (std::nothrow) ArrayListT<CodecType>(), _ListPtrUtil::remover);
837 SysTryReturn(NID_MEDIA, pVideoCodecList.get() != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
839 r = pVideoCodecList->Construct();
840 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
842 for (int i = 0; i < pIntegerList->GetCount(); i++)
845 Integer* pInteger = null;
846 pObj = pIntegerList->GetAt(i);
847 SysTryCatch(NID_MEDIA, pObj != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object instance is not available. %d item is not found.", i);
849 pInteger = dynamic_cast<Integer*>(pObj);
850 SysTryCatch(NID_MEDIA, pInteger != null, r = E_INVALID_FORMAT, E_INVALID_FORMAT, "[E_INVALID_FORMAT] %d item's format is invalid.", i);
852 r = pVideoCodecList->Add((CodecType)pInteger->ToInt());
853 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
854 SysLog(NID_MEDIA, "Pixel format : %d was added.", pInteger->ToInt());
857 return pVideoCodecList.release();
864 Tizen::Base::Collection::ArrayListT<MediaContainerType>*
865 _VideoRecorderImpl::GetSupportedContainerListN(void) const
867 result r = E_SUCCESS;
868 _ResultType itemType = _RESULT_INTEGER_LIST;
870 std::unique_ptr<IList, _ListPtrUtil::Remover> pIntegerList (_RecorderCapability::GetListN(_VROP_FILE_FORMAT, itemType), _ListPtrUtil::remover);
871 SysTryReturn(NID_MEDIA, pIntegerList.get() != null, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Supported list was wrong.");
872 SysTryReturn(NID_MEDIA, pIntegerList->GetCount() > 0, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The list was empty.");
874 std::unique_ptr<ArrayListT<MediaContainerType>, _ListPtrUtil::Remover> pContainerList (new (std::nothrow) ArrayListT<MediaContainerType>(), _ListPtrUtil::remover);
875 SysTryReturn(NID_MEDIA, pContainerList.get() != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
877 r = pContainerList->Construct();
878 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
880 for (int i = 0; i < pIntegerList->GetCount(); i++)
883 Integer* pInteger = null;
884 pObj = pIntegerList->GetAt(i);
885 SysTryCatch(NID_MEDIA, pObj != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object instance is not available. %d item is not found.", i);
887 pInteger = dynamic_cast<Integer*>(pObj);
888 SysTryCatch(NID_MEDIA, pInteger != null, r = E_INVALID_FORMAT, E_INVALID_FORMAT, "[E_INVALID_FORMAT] %d item's format is invalid.", i);
890 r = pContainerList->Add((MediaContainerType)pInteger->ToInt());
891 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
892 SysLog(NID_MEDIA, "Pixel format : %d was added.", pInteger->ToInt());
895 return pContainerList.release();
903 _VideoRecorderImpl::SetMode(VideoRecorderMode mode)
905 result r = E_SUCCESS;
906 RecorderState state = RECORDER_STATE_ERROR;
908 SysLog(NID_MEDIA, "Enter. mode:%d", mode);
911 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
912 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE
913 || state == RECORDER_STATE_CLOSED
914 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.");
916 SysTryReturn(NID_MEDIA, mode >= VIDEORECORDER_MODE_VIDEO_WITH_AUDIO && mode <= VIDEORECORDER_MODE_VIDEO_ONLY
917 , E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(mode) is used. mode=%d.", mode);
919 r = SetMute(mode == VIDEORECORDER_MODE_VIDEO_ONLY ? true : false);
920 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. mode:%d", GetErrorMessage(r), mode);
928 _VideoRecorderImpl::GetMode(void) const
934 _VideoRecorderImpl::SetQuality(RecordingQuality quality)
936 result r = E_SUCCESS;
937 RecorderState state = RECORDER_STATE_ERROR;
938 CodecType audioCodec = CODEC_NONE;
939 CodecType videoCodec = CODEC_NONE;
940 MediaContainerType container = MEDIA_CONTAINER_NONE;
941 SysLog(NID_MEDIA, "Enter. quality:%d", quality);
944 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
945 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE || state == RECORDER_STATE_CLOSED
946 , E_INVALID_STATE, r, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.", state);
948 SysTryReturn(NID_MEDIA, (quality >= RECORDING_QUALITY_LOW && quality <= RECORDING_QUALITY_HIGH)
949 , E_INVALID_ARG, r, "[E_INVALID_ARG] Invalid argument(quality) is used. The quality=%d.", quality);
951 GetFormat(audioCodec, videoCodec, container);
953 r = SetQualityAttr(quality, audioCodec, videoCodec);
954 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] set quality failed. quality:%d", GetErrorMessage(r), quality);
963 _VideoRecorderImpl::GetQuality(void) const
969 _VideoRecorderImpl::SetRecordingResolution(const Tizen::Graphics::Dimension& resolution)
971 result r = E_SUCCESS;
972 RecorderState state = RECORDER_STATE_ERROR;
973 SysLog(NID_MEDIA, "Enter. resolution(%d,%d)", resolution.width, resolution.height);
976 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
977 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE
978 || state == RECORDER_STATE_CLOSED
979 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.", state);
981 SysTryReturn(NID_MEDIA, resolution.width >= 0 && resolution.height >= 0
982 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] resolution is out of range. The resolution(%d,%d) must be greater than (0,0).",
986 std::unique_ptr<IList, _ListPtrUtil::Remover> pList (GetSupportedRecordingResolutionListN(), _ListPtrUtil::remover);
987 SysTryReturn(NID_MEDIA, pList.get() != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Getting the supported list was failed.\n");
988 SysTryReturn(NID_MEDIA, pList->Contains(resolution), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE]. resolution is out of range. This resolution(%d,%d) is not supported in the device.\n", resolution.width, resolution.height);
990 if ( __pVideoSourceAdapter->HasRecordingResolutionRestriction())
992 Dimension sourceResolution = __pVideoSourceAdapter->GetSourceResolution();
993 SysTryReturn(NID_MEDIA, sourceResolution == resolution, E_SYSTEM, E_SYSTEM,
994 "[E_SYSTEM] A system error has been occurred. The source resolution(%d,%d) should be same as the recording resolution(%d,%d).", sourceResolution.width, sourceResolution.height, resolution.width, resolution.height);
998 SysLog(NID_MEDIA, "There is no recording attribute... ");
1001 __recordingResolution = resolution;
1006 Tizen::Graphics::Dimension
1007 _VideoRecorderImpl::GetRecordingResolution(void) const
1009 return __recordingResolution;
1012 Tizen::Base::Collection::IList*
1013 _VideoRecorderImpl::GetSupportedRecordingResolutionListN(void) const
1015 SysTryReturn(NID_MEDIA, __pVideoSourceAdapter.get() != null, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The source is deleted.");
1017 return __pVideoSourceAdapter->GetSupportedRecordingResolutionListN();
1021 _VideoRecorderImpl::GetSupportedMaxFrameRate(const Tizen::Graphics::Dimension& dim) const
1023 result r = E_SUCCESS;
1024 int maxFrameRate = 0;
1026 SysTryReturn(NID_MEDIA, __pVideoSourceAdapter.get() != null, 0, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The source is deleted.");
1028 std::unique_ptr<IListT<int>, _ListPtrUtil::Remover> pListT (__pVideoSourceAdapter->GetSupportedFrameRateListN(dim), _ListPtrUtil::remover);
1029 SysTryCatch(NID_MEDIA, pListT.get() != null, , E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Supported list was wrong.");
1030 SysTryCatch(NID_MEDIA, pListT->GetCount() > 0, , E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The list was empty.");
1032 r = pListT->GetAt(pListT->GetCount()-1, maxFrameRate);
1033 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] propogated", GetErrorMessage(r));
1035 return maxFrameRate;
1042 _VideoRecorderImpl::SetMute(bool mute)
1044 result r = E_SUCCESS;
1045 RecorderState state = RECORDER_STATE_ERROR;
1046 SysLog(NID_MEDIA, "Enter. mute:%d", mute);
1049 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
1050 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_ENDOF_FILE || state == RECORDER_STATE_CLOSED
1051 || state == RECORDER_STATE_STOPPED || state == RECORDER_STATE_PAUSED || state == RECORDER_STATE_RECORDING
1052 , E_INVALID_STATE, r, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.", state);
1055 r = SetMuteAttr(mute);
1056 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagating. mute:%d", GetErrorMessage(r), mute);
1062 _VideoRecorderImpl::IsMuted(void) const
1068 _VideoRecorderImpl::SetRecordingRotation(RecordingRotation rotation)
1070 result r = E_SUCCESS;
1071 RecorderState state = RECORDER_STATE_ERROR;
1072 SysLog(NID_MEDIA, "Enter. rotation:%d", rotation);
1075 SysTryReturn(NID_MEDIA, state == RECORDER_STATE_INITIALIZED
1076 || state == RECORDER_STATE_OPENED || state == RECORDER_STATE_CLOSED
1077 , E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] VideoRecorder is in an invalid state:%d.", state);
1079 SysTryReturn(NID_MEDIA, (rotation >= RECORDING_ROTATION_NONE&& rotation <= RECORDING_ROTATION_270)
1080 , E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(rotation) is used. The rotation=%d.", rotation);
1082 __pCoordinator->SetRecordingOrientation(rotation);
1083 __rotation = rotation;
1089 _VideoRecorderImpl::GetRecordingRotation(void) const
1095 _VideoRecorderImpl::SetFormatAttr(CodecType audioCodec, CodecType videoCodec, MediaContainerType container)
1097 result r = E_SUCCESS;
1098 int err = ::RECORDER_ERROR_NONE;
1100 recorder_audio_codec_e attrAudioCodec = ::RECORDER_AUDIO_CODEC_AAC;
1101 recorder_video_codec_e attrVideoCodec = ::RECORDER_VIDEO_CODEC_MPEG4;
1102 recorder_file_format_e attrFormat = ::RECORDER_FILE_FORMAT_MP4;
1104 r = _RecorderUtil::GetMmAudioCodec(audioCodec, attrAudioCodec);
1105 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. audio codec:0x%x", GetErrorMessage(r), audioCodec);
1107 err = recorder_set_audio_encoder(__handle, attrAudioCodec);
1108 r = ConvertResult(err);
1109 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Audio codec set failed. codec:0x%x", GetErrorMessage(r), audioCodec);
1111 r = _RecorderUtil::GetMmVideoCodec(videoCodec, attrVideoCodec);
1112 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. video codec:0x%x", GetErrorMessage(r), videoCodec);
1114 err = recorder_set_video_encoder(__handle, attrVideoCodec);
1115 r = ConvertResult(err);
1116 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Video codec set failed. codec:0x%x", GetErrorMessage(r), videoCodec);
1118 r = _RecorderUtil::GetMmFileFormat(container, attrFormat);
1119 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. container:0x%x", GetErrorMessage(r), container);
1121 err = recorder_set_file_format(__handle, attrFormat);
1122 r = ConvertResult(err);
1123 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] File format set failed. container:0x%x", GetErrorMessage(r), container);
1131 _VideoRecorderImpl::SetQualityAttr(RecordingQuality quality, CodecType audioCodec, CodecType videoCodec)
1133 result r = E_SUCCESS;
1134 int err = ::RECORDER_ERROR_NONE;
1135 int attrVideoBitrate = 0;
1136 if (audioCodec != CODEC_NONE)
1138 int attrAudioSampleate = 0;
1139 int attrAudioChannel = 0;
1140 int attrAudioBitrate = 0;
1142 r = _RecorderUtil::GetMmAudioQuality(audioCodec, quality, attrAudioSampleate, attrAudioChannel, attrAudioBitrate);
1143 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. audioCodec:%d, quality:%d", GetErrorMessage(r), audioCodec, quality);
1145 err = recorder_attr_set_audio_samplerate(__handle, attrAudioSampleate);
1146 r = ConvertResult(err);
1147 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Sampling-rate set failed. attr:%d", GetErrorMessage(r), attrAudioSampleate);
1149 err = recorder_attr_set_audio_channel(__handle, attrAudioChannel);
1150 r = ConvertResult(err);
1151 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Channel set failed. attr:%d", GetErrorMessage(r), attrAudioChannel);
1153 err = recorder_attr_set_audio_encoder_bitrate(__handle, attrAudioBitrate);
1154 r = ConvertResult(err);
1155 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Bitrate set failed. attr:%d", GetErrorMessage(r), attrAudioBitrate);
1157 r = _RecorderUtil::GetMmVideoQuality(_CameraUtil::ConvertResolutionType(__recordingResolution), quality, attrVideoBitrate);
1158 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. videoCodec:%d, quality:%d", GetErrorMessage(r), videoCodec, quality);
1160 err = recorder_attr_set_video_encoder_bitrate(__handle, attrVideoBitrate);
1161 r = ConvertResult(err);
1162 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Bitrate set failed. attr:%d", GetErrorMessage(r), attrVideoBitrate);
1170 _VideoRecorderImpl::SetMuteAttr(bool mute)
1172 result r = E_SUCCESS;
1173 int err = ::RECORDER_ERROR_NONE;
1175 err = recorder_attr_set_mute(__handle, mute);
1176 r = ConvertResult(err);
1177 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set mute failed", GetErrorMessage(r));
1184 _VideoRecorderImpl::SetMaxRecordingTimeAttr(long msTime)
1186 result r = E_SUCCESS;
1187 int err = ::RECORDER_ERROR_NONE;
1188 int secTime = MEDIA_INVALID_VALUE;
1189 // msec max time is not possible to set
1190 secTime = msTime > 1000 ? ((msTime + 500) / 1000) : 1;
1191 err = recorder_attr_set_time_limit(__handle, secTime);
1192 r = ConvertResult(err);
1193 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder set attribute failed. msTime:%ls", GetErrorMessage(r), msTime);
1200 _VideoRecorderImpl::SetCallback(void)
1202 result r = E_SUCCESS;
1203 int err = ::RECORDER_ERROR_NONE;
1205 err = recorder_set_state_changed_cb(__handle, StateChangedCb, this);
1206 r = ConvertResult(err);
1207 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set message callback failed.", GetErrorMessage(r));
1209 err = recorder_set_recording_limit_reached_cb(__handle, LimitReachedCb, this);
1210 r = ConvertResult(err);
1211 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set limit reached callback failed.", GetErrorMessage(r));
1213 err = recorder_set_recording_status_cb(__handle, RecordingStatusCb, this);
1214 r = ConvertResult(err);
1215 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set recording status callback failed.", GetErrorMessage(r));
1217 err = recorder_set_error_cb(__handle, ErrorCb, this);
1218 r = ConvertResult(err);
1219 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set limit reached callback failed.", GetErrorMessage(r));
1221 err = recorder_set_interrupted_cb(__handle, InterruptedCb, this);
1222 r = ConvertResult(err);
1223 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set limit reached callback failed.", GetErrorMessage(r));
1231 _VideoRecorderImpl::OnCameraCoordinatorModeChangePrepared(_CameraMode mode)
1233 result r = E_SUCCESS;
1234 SysLog(NID_MEDIA, "Mode:%d", mode);
1235 __handle = __pCoordinator->GetRecorderHandle(); // update to the new handle. All configuration shuld be updated with this handle after mode changing.
1237 if ( mode == _CAMERA_MODE_VIDEO )
1239 r = ReloadConfiguration(_RELOAD_FORMAT | _RELOAD_QUALITY);
1240 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
1249 _VideoRecorderImpl::OnCameraCoordinatorModeChanged(_CameraMode mode)
1251 result r = E_SUCCESS;
1252 SysLog(NID_MEDIA, "Mode:%d", mode);
1254 if ( mode == _CAMERA_MODE_VIDEO )
1256 r = ReloadConfiguration(_RELOAD_MAX_TIME | _RELOAD_FILE_PATH | _RELOAD_CALLBACK | _RELOAD_MUTE | _RELOAD_ROTATION);
1257 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating", GetErrorMessage(r));
1266 _VideoRecorderImpl::StateChangedCb(recorder_state_e previous, recorder_state_e current, bool byPolicy, void* pUserData)
1268 result r = E_SUCCESS;
1269 _VideoRecorderImpl* pImpl = static_cast<_VideoRecorderImpl*>( pUserData);
1270 int tableTotalCount = 0;
1272 SysTryReturnVoidResult(NID_MEDIA, _VideoRecorderImpl::IsAlive(), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
1273 SysTryReturnVoidResult(NID_MEDIA, pImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _VideoRecorderImpl instance is not available. pImpl is null.");
1274 SysLog(NID_MEDIA, "State previous:%d, current:%d, byPolicy:%d", previous, current, byPolicy);
1276 tableTotalCount = sizeof(_VIDEO_CALLBACK_EVENT) / sizeof(_VIDEO_CALLBACK_EVENT[0]);
1278 for (i = 0; i < tableTotalCount; i++)
1280 if (previous == _VIDEO_CALLBACK_EVENT[i].prevState && current == _VIDEO_CALLBACK_EVENT[i].postState && pImpl->GetStateChangeReason() == _VIDEO_CALLBACK_EVENT[i].reason) //for cancel
1282 r = pImpl->GetEvent()->SendEvent(_VIDEO_CALLBACK_EVENT[i].event, _VIDEO_CALLBACK_EVENT[i].error, E_SUCCESS);
1283 SysLog(NID_MEDIA, "VIDEO_CALLBACK_EVENT(%d) is sent by StateChangedCb", _VIDEO_CALLBACK_EVENT[i].event);
1284 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1291 _VideoRecorderImpl::RecordingStatusCb(unsigned long long elapsedTime, unsigned long long fileSize, void *pUserData)
1293 _VideoRecorderImpl* pImpl = static_cast<_VideoRecorderImpl*>(pUserData);
1294 SysTryReturnVoidResult(NID_MEDIA, _VideoRecorderImpl::IsAlive(), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
1295 SysTryReturnVoidResult(NID_MEDIA, pImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _VideoRecorderImpl instance is not available. pImpl is null.");
1297 SysLog(NID_MEDIA, "FileSize:%llu,elapsedTime:%llu",fileSize,elapsedTime);
1299 pImpl->SetRecordingTime((long)elapsedTime);
1300 pImpl->SetRecordingSize((long)fileSize);
1304 _VideoRecorderImpl::AudioStreamCb(void* pStream, int size, audio_sample_type_e format, int channel, unsigned int timeStamp, void *pUserData)
1306 _VideoRecorderImpl* pImpl = static_cast<_VideoRecorderImpl*>(pUserData);
1307 int samplingRate =0;
1308 SysTryReturnVoidResult(NID_MEDIA, _VideoRecorderImpl::IsAlive(), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
1309 SysTryReturnVoidResult(NID_MEDIA, pImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _VideoRecorderImpl instance is not available. Impl is null.");
1310 SysTryReturnVoidResult(NID_MEDIA, pStream != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] void instance is not available. pStream is null.");
1312 if (pImpl->__audioStreamCallback == true)
1314 samplingRate = _RecorderUtil::CalculateSampleRate(size, channel, pImpl->__audioStreamTimeDuration, _RecorderUtil::GetOspSampleType(format));
1315 (pImpl->__pAudioStreamCoordinator)->ProcessAudioStreamData((byte*)pStream, size, samplingRate, _RecorderUtil::GetOspChannelType(channel), _RecorderUtil::GetOspSampleType(format));
1320 _VideoRecorderImpl::LimitReachedCb(recorder_recording_limit_type_e type, void *pUserData)
1322 result r = E_SUCCESS;
1323 _VideoRecorderImpl* pImpl = static_cast<_VideoRecorderImpl*>(pUserData);
1324 SysTryReturnVoidResult(NID_MEDIA, _VideoRecorderImpl::IsAlive(), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
1325 SysTryReturnVoidResult(NID_MEDIA, pImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _VideoRecorderImpl instance is not available. pImpl is null.");
1327 SysLog(NID_MEDIA, "Type:%d", type);
1331 case ::RECORDER_RECORDING_LIMIT_TIME:
1332 r = pImpl->ChangeStateTo(::RECORDER_STATE_READY, _RECORDER_STATE_REASON_END_TIME_REACHED);
1333 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1336 case ::RECORDER_RECORDING_LIMIT_SIZE:
1337 r = pImpl->ChangeStateTo(::RECORDER_STATE_READY, _RECORDER_STATE_REASON_END_SIZE_REACHED);
1338 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1341 case ::RECORDER_RECORDING_LIMIT_FREE_SPACE:
1342 r = pImpl->ChangeStateTo(::RECORDER_STATE_READY, _RECORDER_STATE_REASON_OUT_OF_STORAGE);
1343 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1355 _VideoRecorderImpl::ErrorCb(recorder_error_e error, recorder_state_e state, void *pUserData)
1357 result r = E_SUCCESS;
1358 _VideoRecorderImpl* pImpl = static_cast<_VideoRecorderImpl*>(pUserData);
1359 SysTryReturnVoidResult(NID_MEDIA, _VideoRecorderImpl::IsAlive(), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
1360 SysTryReturnVoidResult(NID_MEDIA, pImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _VideoRecorderImpl instance is not available. pImpl is null.");
1361 SysLog(NID_MEDIA, "Error:%d, state:%d", error, state);
1363 r = pImpl->GetEvent()->SendEvent(_RECORDER_EVENT_ERROR, RECORDER_ERROR_DEVICE_FAILED, E_SUCCESS);
1364 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1370 _VideoRecorderImpl::InterruptedCb(recorder_policy_e policy, recorder_state_e previous, recorder_state_e current, void *pUserData)
1372 _VideoRecorderImpl* pImpl = static_cast<_VideoRecorderImpl*>(pUserData);
1373 SysTryReturnVoidResult(NID_MEDIA, _VideoRecorderImpl::IsAlive(), E_INVALID_OPERATION, "[E_INVALID_OPERATION] The object was already destroyed.");
1374 SysTryReturnVoidResult(NID_MEDIA, pImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _VideoRecorderImpl instance is not available. pImpl is null.");
1376 SysLog(NID_MEDIA, "Policy:%d, previous:%d, current:%d", policy, previous, current);
1379 _VideoRecorderEvent*
1380 _VideoRecorderImpl::GetEvent(void) const
1382 return __pVideoRecorderEvent.get();
1386 _VideoRecorderImpl::SetState(RecorderState state)
1392 _VideoRecorderImpl::SetRecordingTime(long recTime)
1394 __recTime = recTime;
1398 _VideoRecorderImpl::SetRecordingSize(long recSize)
1400 __recSize = recSize;
1404 _VideoRecorderImpl::GetDeviceType(void) const
1406 return __deviceType;
1410 _VideoRecorderImpl::ConvertResult(int err) const
1412 result r = E_SYSTEM;
1413 if (err != ::RECORDER_ERROR_NONE)
1415 SysLog(NID_MEDIA, "MM Err:0x%x", err);
1419 if (err == ::RECORDER_ERROR_NONE)
1423 else if (err == ::RECORDER_ERROR_INVALID_PARAMETER)
1427 else if (err == ::RECORDER_ERROR_INVALID_STATE)
1429 r = E_INVALID_STATE;
1431 else if (err == ::RECORDER_ERROR_OUT_OF_MEMORY)
1433 r = E_OUT_OF_MEMORY;
1435 else if (err == ::RECORDER_ERROR_DEVICE)
1437 r = E_DEVICE_FAILED;
1439 else if (err == ::RECORDER_ERROR_INVALID_OPERATION
1440 || err == ::RECORDER_ERROR_SECURITY_RESTRICTED)
1444 else if (err == ::RECORDER_ERROR_SOUND_POLICY)
1457 _VideoRecorderImpl::GetCodecString(const CodecType videoCodec, Tizen::Base::String& codec) const
1461 while (_CODEC_VAL_TABLE[i].pCodecName != null)
1463 if (videoCodec == _CODEC_VAL_TABLE[i].videoCodec)
1466 codec.Append(_CODEC_VAL_TABLE[i].pCodecName);
1474 _VideoRecorderImpl::ChangeStateTo(recorder_state_e mmDestState, _RecorderStateChangeReason reason)
1476 result r = E_SUCCESS;
1477 int tableTotalCount = 0;
1479 int err = MM_SUCCESS;
1480 recorder_state_e preState = ::RECORDER_STATE_NONE;
1481 recorder_state_e postState = ::RECORDER_STATE_NONE;
1483 SysLog(NID_MEDIA, "Enter. mmDestState:%d", mmDestState);
1484 SysTryReturn(NID_MEDIA, __isConstructed == true, E_INVALID_STATE, E_INVALID_STATE,
1485 "[E_INVALID_STATE] VideoRecorder is in an invalid state. VideoRecorder is not constructed.");
1487 preState = GetMmState();
1488 tableTotalCount = sizeof(_VIDEO_COMMAND_STATE) / sizeof(_VIDEO_COMMAND_STATE[0]);
1489 SysLog(NID_MEDIA, " preState:%d, mmDestState:%d, tableTotalCount:%d", preState, mmDestState, tableTotalCount);
1491 for (i = 0; i < tableTotalCount; i++)
1493 if (preState == _VIDEO_COMMAND_STATE[i].preState && mmDestState == _VIDEO_COMMAND_STATE[i].postState && reason ==
1494 _VIDEO_COMMAND_STATE[i].reason)
1496 if (_VIDEO_COMMAND_STATE[i].pFunc != null)
1498 SysLog(NID_MEDIA, "Exist the matching state field. current state:%d, mmState:%d, reason:%d",
1499 preState, mmDestState, reason);
1500 err = _VIDEO_COMMAND_STATE[i].pFunc(__handle);
1501 r = ConvertResult(err);
1502 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. i:%d", GetErrorMessage(r), i);
1504 // Check whether the retuned states are destinationed states.
1505 postState = GetMmState();
1506 SysTryCatch(NID_MEDIA, mmDestState == postState, r = E_INVALID_STATE, E_INVALID_STATE,
1507 "[E_INVALID_STATE] VideoRecorder state of CAPI is in an invalid state. result mmState:%d, is different from the desired state:%", postState, mmDestState);
1508 SysLog(NID_MEDIA, "[E_SUCCESS] Found. result mmState:%d, param mmDestState:%d", postState,
1511 __stateChangeReason = reason; //for distinguish between stop and cancel
1514 if (_VIDEO_COMMAND_STATE[i].state >= RECORDER_STATE_INITIALIZED && _VIDEO_COMMAND_STATE[i].state <= RECORDER_STATE_ERROR)
1516 SysLog(NID_MEDIA, "State set to %d", _VIDEO_COMMAND_STATE[i].state);
1517 SetState(_VIDEO_COMMAND_STATE[i].state);
1522 SysTryCatch(NID_MEDIA, i != tableTotalCount, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not found. ");
1526 SysLog(NID_MEDIA, "[%s] Real mmState:%d, param mmState:%d", GetErrorMessage(r), preState, mmDestState);
1530 _RecorderStateChangeReason
1531 _VideoRecorderImpl::GetStateChangeReason(void) const
1533 return __stateChangeReason;
1537 _VideoRecorderImpl::GetMmState(void) const
1539 result r = E_SUCCESS;
1540 int err = ::RECORDER_ERROR_NONE;
1541 recorder_state_e mmState = ::RECORDER_STATE_NONE;
1543 err = recorder_get_state(__handle, &mmState);
1544 r = ConvertResult(err);
1545 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1550 return ::RECORDER_STATE_NONE;
1554 _VideoRecorderImpl::GetMediaType(const Base::String& codec, CodecType& audioCodec, CodecType& videoCodec, MediaContainerType& container) const
1557 std::unique_ptr<char[]> pCodecChars (Tizen::Base::_StringConverter::CopyToCharArrayN(codec));
1559 while (_CODEC_VAL_TABLE[i].pCodecName != null)
1561 if (strcmp(_CODEC_VAL_TABLE[i].pCodecName, pCodecChars.get()) == 0)
1563 videoCodec = _CODEC_VAL_TABLE[i].videoCodec;
1564 audioCodec = _CODEC_VAL_TABLE[i].audioCodec;
1565 container = _CODEC_VAL_TABLE[i].container;
1573 _VideoRecorderImpl::GetMediaType(VideoRecordingFormat format, CodecType& audioCodec, CodecType& videoCodec,
1574 MediaContainerType& container) const
1578 case VIDEORECORDING_FORMAT_3GP:
1579 audioCodec = CODEC_AMR_NB;
1580 videoCodec = CODEC_MPEG4;
1581 container = MEDIA_CONTAINER_3GP;
1584 case VIDEORECORDING_FORMAT_DEFAULT:
1585 case VIDEORECORDING_FORMAT_MP4:
1586 audioCodec = CODEC_AAC;
1587 videoCodec = CODEC_MPEG4;
1588 container = MEDIA_CONTAINER_MP4;
1592 audioCodec = CODEC_NONE;
1593 videoCodec = CODEC_NONE;
1594 container = MEDIA_CONTAINER_NONE;
1600 _VideoRecorderImpl::ReloadConfiguration(int reload)
1602 result r = E_SUCCESS;
1603 int err = MM_SUCCESS;
1604 SysLog(NID_MEDIA, "Enter. reload:0x%x", reload);
1606 if (reload & _RELOAD_FORMAT)
1608 r = SetFormatAttr(__audioCodec, __videoCodec, __container);
1609 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] File format set failed. audioCodec:0x%x videoCodec:0x%x container:0x%x",
1610 GetErrorMessage(r), __audioCodec, __videoCodec, __videoCodec);
1612 if (reload & _RELOAD_QUALITY)
1614 r = SetQualityAttr(__quality, __audioCodec, __videoCodec);
1615 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] set quality failed. quality:%d", GetErrorMessage(r), __quality);
1617 if (reload & _RELOAD_MAX_TIME)
1619 r = SetMaxRecordingTimeAttr(__maxTime);
1620 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] camcorder set attribute failed. maxTime:%ls", GetErrorMessage(r), __maxTime);
1622 if (reload & _RELOAD_FILE_PATH)
1624 result r = E_SUCCESS;
1625 int err = MM_SUCCESS;
1626 std::unique_ptr<char[]> pFileName (Tizen::Base::_StringConverter::CopyToCharArrayN(__filePath));
1627 SysTryCatch(NID_MEDIA, pFileName.get() != null, r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(__filePath) is used. File name is null.");
1628 SysLog(NID_MEDIA, "File Path : %s\n", pFileName.get());
1630 err = recorder_set_filename(__handle, pFileName.get());
1631 r = ConvertResult(err);
1632 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1634 if (reload & _RELOAD_INIT)
1639 if (reload & _RELOAD_CALLBACK)
1642 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set callback failed.", GetErrorMessage(r));
1644 if (reload & _RELOAD_MUTE)
1646 r = SetMuteAttr(__mute);
1647 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] video recorder set mute failed", GetErrorMessage(r));
1649 if (reload & _RELOAD_ROTATION)
1651 __pCoordinator->SetRecordingOrientation(__rotation);
1659 err = recorder_unset_state_changed_cb(__handle);
1660 err = recorder_unset_recording_limit_reached_cb(__handle);
1661 err = recorder_unset_error_cb(__handle);
1662 err = recorder_unset_interrupted_cb(__handle);
1663 __handle = MM_INVALID_HANDLE;
1670 _VideoRecorderImpl::LoadDefaultConfiguration(int reload)
1672 result r = E_SUCCESS;
1673 SysLog(NID_MEDIA, "Enter.");
1675 // Preview resolution
1676 if (reload & _RELOAD_RECORD_RESOLUTION)
1678 __recordingResolution = __pVideoSourceAdapter->GetSourceResolution();
1685 _VideoRecorderImpl::IsAlive(void)
1691 _VideoRecorderImpl::GetInstance(VideoRecorder *pVideoRecorder)
1693 if ( pVideoRecorder != null )
1695 return pVideoRecorder->__pImpl;
1700 const _VideoRecorderImpl*
1701 _VideoRecorderImpl::GetInstance(const VideoRecorder *pVideoRecorder)
1703 if ( pVideoRecorder != null )
1705 return pVideoRecorder->__pImpl;