2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <mm_transcode.h>
23 #include <video_util.h>
24 #include <video_util_private.h>
30 #define LOG_TAG "CAPI_MEDIA_VIDEO_UTIL"
32 #define UTIL_SAFE_FREE(src) { if(src) {free(src); src = NULL;}}
33 #define UTIL_STRING_VALID(str) \
34 ((str != NULL && strlen(str) > 0) ? true : false)
36 #define VIDEO_UTIL_MINIMUM_WIDTH 128
37 #define VIDEO_UTIL_MINIMUM_HEIGHT 96
38 #define VIDEO_UTIL_MINIMUM_DURATION 1000 /*1 sec*/
39 #define VIDEO_UTIL_MINIMUM_FPS 5
40 #define VIDEO_UTIL_MAXIMUM_FPS 30
41 #define VIDEO_UTIL_MAXIMUM_BPS 4294967295UL
43 static int __video_util_create_transcode_handle(video_util_s *handle);
44 static int __video_util_destroy_transcode_handle(video_util_s *handle);
45 static int __video_util_check_transcode_is_busy(video_util_s * handle, bool *is_busy);
46 static bool __video_util_check_video_codec(video_util_video_codec_e video_codec);
47 static bool __video_util_check_audio_codec(video_util_audio_codec_e audio_codec);
48 static bool __video_util_check_file_format(video_util_file_format_e file_format);
49 static bool __video_util_check_resolution(int width, int height);
50 static bool __video_util_check_duration(int duration);
51 static bool __video_util_check_fps(int fps);
52 static video_util_error_e __video_util_error_convert(int error);
53 static void __video_util_transcode_progress_cb(unsigned long current_position, unsigned long duration, void *user_data);
54 static void __video_util_transcode_completed_cb(int error, void *user_data);
55 static bool __video_util_type_callback(int codec_type, void *user_data);
56 static int __video_util_foreach_supported_type(video_util_type_e type, video_util_supported_type_cb callback, void *user_data);
58 static int __video_util_create_transcode_handle(video_util_s *handle)
60 int ret = VIDEO_UTIL_ERROR_NONE;
61 MMHandleType transcode_h = 0;
63 ret = mm_transcode_create(&transcode_h);
64 if(ret != MM_ERROR_NONE)
66 if(ret == MM_ERROR_TRANSCODE_INVALID_VALUE)
68 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
69 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
70 } else if(ret == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT)
72 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
73 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
77 video_util_error("INVALID_OPERATION(0x%08x)", ret);
78 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
82 ret = mm_transcode_prepare(transcode_h, handle->input_path, handle->file_format, handle->video_codec, handle->audio_codec);
83 if(ret != MM_ERROR_NONE)
85 if(ret == MM_ERROR_TRANSCODE_INVALID_VALUE)
87 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
88 ret = VIDEO_UTIL_ERROR_INVALID_PARAMETER;
89 } else if(ret == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT)
91 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
92 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
96 video_util_error("INVALID_OPERATION(0x%08x)", ret);
97 ret = VIDEO_UTIL_ERROR_INVALID_OPERATION;
101 if(ret == MM_ERROR_NONE)
103 handle->transcode_h = transcode_h;
107 __video_util_destroy_transcode_handle(handle);
113 //when should make new trandcode handle? input_filepath or file_format or video_codec or audio_codec is modified
114 static int __video_util_destroy_transcode_handle(video_util_s *handle)
116 int ret = VIDEO_UTIL_ERROR_NONE;
118 if(handle->transcode_h)
120 ret = mm_transcode_destroy(handle->transcode_h);
121 if(ret != MM_ERROR_NONE)
123 video_util_error("INVALID_OPERATION (0x%08x)", ret);
124 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
128 handle->transcode_h = 0;
133 int __video_util_check_transcode_is_busy(video_util_s * handle, bool *is_busy)
135 int ret = VIDEO_UTIL_ERROR_NONE;
137 if(handle->transcode_h)
139 ret = mm_transcode_is_busy(handle->transcode_h, is_busy);
140 if(ret != MM_ERROR_NONE)
142 video_util_error("INVALID_OPERATION(0x%08x)", ret);
143 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
154 static bool __video_util_check_video_codec(video_util_video_codec_e video_codec)
156 if((video_codec < 0) || (video_codec > VIDEO_UTIL_VIDEO_CODEC_NONE ))
158 video_util_error("invalid video_codec [%d]", video_codec);
165 static bool __video_util_check_audio_codec(video_util_audio_codec_e audio_codec)
167 if((audio_codec < 0) || (audio_codec > VIDEO_UTIL_AUDIO_CODEC_NONE ))
169 video_util_error("invalid audio_codec [%d]", audio_codec);
176 static bool __video_util_check_file_format(video_util_file_format_e file_format)
178 if((file_format < 0) || (file_format >= VIDEO_UTIL_FILE_FORMAT_MAX ))
180 video_util_error("invalid file_format [%d]", file_format);
187 static bool __video_util_check_resolution(int width, int height)
189 if(((width > 0) && (width < VIDEO_UTIL_MINIMUM_WIDTH)) || (width < 0))
191 video_util_error("invalid width [%d]", width);
195 if(((height > 0) && (height < VIDEO_UTIL_MINIMUM_HEIGHT)) || (height < 0))
197 video_util_error("invalid height [%d]", height);
204 static bool __video_util_check_duration(int duration)
206 if(((duration > 0) && (duration < VIDEO_UTIL_MINIMUM_DURATION)) || (duration < 0))
208 video_util_error("invalid duration [%d]", duration);
215 static bool __video_util_check_fps(int fps)
217 if((fps < 0) || ((fps > 0) && (fps < VIDEO_UTIL_MINIMUM_FPS)) || (fps > VIDEO_UTIL_MAXIMUM_FPS))
219 video_util_error("invalid fps [%d]", fps);
226 static video_util_error_e __video_util_error_convert(int error)
228 if(error == MM_ERROR_NONE)
230 video_util_debug("Error None");
231 return VIDEO_UTIL_ERROR_NONE;
233 else if(error == MM_ERROR_TRANSCODE_INVALID_VALUE)
235 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
236 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
237 } else if(error == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT)
239 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
240 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
244 video_util_error("INVALID_OPERATION(0x%08x)", error);
245 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
249 static void __video_util_transcode_progress_cb(unsigned long current_position, unsigned long duration, void *user_data)
251 video_util_cb_s *_util_cb = (video_util_cb_s *)user_data;
253 if((_util_cb != NULL) && (_util_cb->transcode_progress_cb != NULL))
255 _util_cb->transcode_progress_cb(current_position, duration, _util_cb->user_data);
261 static void __video_util_transcode_completed_cb(int error, void *user_data)
263 int error_value = VIDEO_UTIL_ERROR_NONE;
264 video_util_cb_s *_util_cb = (video_util_cb_s *)user_data;
266 if((_util_cb != NULL) && (_util_cb->transcode_completed_cb != NULL))
268 error_value = __video_util_error_convert(error);
269 _util_cb->transcode_completed_cb(error_value, _util_cb->user_data);
272 UTIL_SAFE_FREE(_util_cb);
277 static bool __video_util_type_callback(int codec_type, void *user_data)
279 video_util_type_cb_s *codec_cb = (video_util_type_cb_s *)user_data;
283 if (codec_cb->supported_type_cb) {
284 codec_cb->supported_type_cb(codec_type, codec_cb->user_data);
291 static int __video_util_foreach_supported_type(video_util_type_e type, video_util_supported_type_cb callback, void *user_data)
293 int ret = VIDEO_UTIL_ERROR_NONE;
295 video_util_type_cb_s *codec_cb = (video_util_type_cb_s*)calloc(1, sizeof(video_util_type_cb_s));
296 codec_cb->user_data = user_data;
297 codec_cb->supported_type_cb = (video_util_supported_type_cb)callback;
299 if(type == VIDEO_UTIL_TYPE_FORMAT)
301 ret = mm_transcode_get_supported_container_format((mm_transcode_support_type_callback)__video_util_type_callback, (void *)codec_cb);
303 else if(type == VIDEO_UTIL_TYPE_VIDEO_ENC)
305 ret = mm_transcode_get_supported_video_encoder((mm_transcode_support_type_callback)__video_util_type_callback, (void *)codec_cb);
307 else if(type == VIDEO_UTIL_TYPE_AUDIO_ENC)
309 ret = mm_transcode_get_supported_audio_encoder((mm_transcode_support_type_callback)__video_util_type_callback, (void *)codec_cb);
313 video_util_error("Invalid type (%d)", type);
314 ret = VIDEO_UTIL_ERROR_INVALID_PARAMETER;
317 UTIL_SAFE_FREE(codec_cb);
322 int video_util_create(video_util_h *handle)
324 int ret = VIDEO_UTIL_ERROR_NONE;
326 bool transcoder_supported = false;
327 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
328 if (false == transcoder_supported) {
329 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
330 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
333 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
334 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
339 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
340 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
343 video_util_s *_handle = (video_util_s*)calloc(1,sizeof(video_util_s));
346 video_util_error("OUT_OF_MEMORY(0x%08x)", VIDEO_UTIL_ERROR_OUT_OF_MEMORY);
347 return VIDEO_UTIL_ERROR_OUT_OF_MEMORY;
350 _handle->input_path = NULL;
351 _handle->accurate_mode = false;
352 _handle->video_codec = 0;
353 _handle->audio_codec = 0;
354 _handle->file_format = 0;
358 _handle->transcode_h = 0;
359 _handle->_util_cb = NULL;
361 *handle = (video_util_h)_handle;
366 int video_util_destroy(video_util_h handle)
368 int ret = VIDEO_UTIL_ERROR_NONE;
369 video_util_s *_handle = NULL;
370 bool transcoder_supported = false;
371 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
372 if (false == transcoder_supported) {
373 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
374 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
377 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
378 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
381 _handle = (video_util_s*)handle;
384 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
385 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
388 ret = __video_util_destroy_transcode_handle(_handle);
390 UTIL_SAFE_FREE(_handle->_util_cb);
391 video_util_debug("FREE(_handle->_util_cb)");
392 UTIL_SAFE_FREE(_handle->input_path);
393 UTIL_SAFE_FREE(_handle);
398 int video_util_set_file_path(video_util_h handle, const char *file_path)
400 int ret = VIDEO_UTIL_ERROR_NONE;
401 video_util_s *_handle = NULL;
402 bool is_busy = false;
403 bool transcoder_supported = false;
404 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
405 if (false == transcoder_supported) {
406 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
407 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
410 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
411 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
414 _handle = (video_util_s*)handle;
415 if((_handle != NULL) && (UTIL_STRING_VALID(file_path)))
417 video_util_secure_info("file_path [%s]\n", file_path);
419 if(_handle->input_path != NULL)
421 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
422 if(ret != VIDEO_UTIL_ERROR_NONE)
427 video_util_error("BUSY!! Transcoding is already running.\n");
428 return VIDEO_UTIL_ERROR_BUSY;
432 ret = __video_util_destroy_transcode_handle(_handle);
433 if(ret != VIDEO_UTIL_ERROR_NONE)
436 UTIL_SAFE_FREE(_handle->input_path);
440 _handle->input_path = strdup(file_path);
441 if(_handle->input_path == NULL)
443 video_util_error("OUT_OF_MEMORY(0x%08x)", VIDEO_UTIL_ERROR_OUT_OF_MEMORY);
444 return VIDEO_UTIL_ERROR_OUT_OF_MEMORY;
449 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
450 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
456 int video_util_set_accurate_mode(video_util_h handle, bool accurate_mode)
458 int ret = VIDEO_UTIL_ERROR_NONE;
459 video_util_s *_handle = NULL;
460 bool transcoder_supported = false;
461 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
462 if (false == transcoder_supported) {
463 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
464 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
467 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
468 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
471 _handle = (video_util_s*)handle;
474 _handle->accurate_mode= accurate_mode;
478 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
479 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
485 int video_util_set_video_codec(video_util_h handle, video_util_video_codec_e codec)
487 int ret = VIDEO_UTIL_ERROR_NONE;
488 video_util_s *_handle = NULL;
489 bool is_busy = false;
490 bool transcoder_supported = false;
491 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
492 if (false == transcoder_supported) {
493 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
494 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
497 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
498 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
501 _handle = (video_util_s*)handle;
502 if((_handle != NULL) && (__video_util_check_video_codec(codec)))
504 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
505 if(ret != VIDEO_UTIL_ERROR_NONE)
510 video_util_error("BUSY!! Transcoding is already running.\n");
511 return VIDEO_UTIL_ERROR_BUSY;
515 ret = __video_util_destroy_transcode_handle(_handle);
516 if(ret != VIDEO_UTIL_ERROR_NONE)
520 _handle->video_codec= codec;
524 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
525 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
531 int video_util_set_audio_codec(video_util_h handle, video_util_audio_codec_e codec)
533 int ret = VIDEO_UTIL_ERROR_NONE;
534 video_util_s *_handle = NULL;
535 bool is_busy = false;
536 bool transcoder_supported = false;
537 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
538 if (false == transcoder_supported) {
539 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
540 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
543 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
544 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
547 _handle = (video_util_s*)handle;
548 if((_handle != NULL) && (__video_util_check_audio_codec(codec)))
550 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
551 if(ret != VIDEO_UTIL_ERROR_NONE)
556 video_util_error("BUSY!! Transcoding is already running.\n");
557 return VIDEO_UTIL_ERROR_BUSY;
561 ret = __video_util_destroy_transcode_handle(_handle);
562 if(ret != VIDEO_UTIL_ERROR_NONE)
566 _handle->audio_codec= codec;
570 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
571 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
577 int video_util_set_file_format(video_util_h handle, video_util_file_format_e format)
579 int ret = VIDEO_UTIL_ERROR_NONE;
580 video_util_s *_handle = NULL;
581 bool is_busy = false;
582 bool transcoder_supported = false;
583 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
584 if (false == transcoder_supported) {
585 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
586 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
589 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
590 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
593 _handle = (video_util_s*)handle;
594 if((_handle != NULL) && (__video_util_check_file_format(format)))
596 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
597 if(ret != VIDEO_UTIL_ERROR_NONE)
602 video_util_error("BUSY!! Transcoding is already running.\n");
603 return VIDEO_UTIL_ERROR_BUSY;
607 ret = __video_util_destroy_transcode_handle(_handle);
608 if(ret != VIDEO_UTIL_ERROR_NONE)
612 _handle->file_format= format;
616 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
617 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
623 int video_util_set_resolution(video_util_h handle, int width, int height)
625 int ret = VIDEO_UTIL_ERROR_NONE;
626 video_util_s *_handle = NULL;
627 bool transcoder_supported = false;
628 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
629 if (false == transcoder_supported) {
630 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
631 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
634 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
635 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
638 _handle = (video_util_s*)handle;
639 if((_handle != NULL) && (__video_util_check_resolution(width, height)))
641 _handle->width= width;
642 _handle->height= height;
646 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
647 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
653 int video_util_set_fps(video_util_h handle, int fps)
655 int ret = VIDEO_UTIL_ERROR_NONE;
656 video_util_s *_handle = NULL;
657 bool transcoder_supported = false;
658 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
659 if (false == transcoder_supported) {
660 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
661 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
664 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
665 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
668 _handle = (video_util_s*)handle;
669 if(_handle && __video_util_check_fps(fps))
675 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
676 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
682 int video_util_start_transcoding(video_util_h handle, unsigned long start, unsigned long duration, const char *out_path, video_util_transcoding_progress_cb progress_cb, video_util_transcoding_completed_cb completed_cb,void *user_data)
684 int ret = VIDEO_UTIL_ERROR_NONE;
685 video_util_s *_handle = NULL;
686 mm_seek_mode_e accurate_mode = MM_SEEK_NUM;
687 bool is_busy = false;
688 bool transcoder_supported = false;
689 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
690 if (false == transcoder_supported) {
691 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
692 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
695 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
696 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
699 _handle = (video_util_s*)handle;
700 video_util_debug("start [%d] duration [%d]\n", start, duration);
702 if(_handle && (__video_util_check_duration(duration)) && (UTIL_STRING_VALID(_handle->input_path)) && (UTIL_STRING_VALID(out_path)) && completed_cb)
704 if(!_handle->transcode_h)
706 ret = __video_util_create_transcode_handle(_handle);
707 if(ret != MM_ERROR_NONE)
712 if(!_handle->transcode_h)
714 video_util_error("INVALID_OPERATION(0x%08x)", VIDEO_UTIL_ERROR_INVALID_OPERATION);
715 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
720 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
721 if(ret != VIDEO_UTIL_ERROR_NONE)
726 video_util_error("BUSY!! Transcoding is already running.\n");
727 return VIDEO_UTIL_ERROR_BUSY;
731 video_util_debug("width [%d] height [%d] fps [%d]v_codec [%d] a_codec [%d] file_format [%d] accurate [%d]\n",
732 _handle->width, _handle->height, _handle->fps, _handle->video_codec, _handle->audio_codec, _handle->file_format, _handle->accurate_mode);
734 _handle->_util_cb = (video_util_cb_s*)calloc(1, sizeof(video_util_cb_s));
735 if(!_handle->_util_cb) {
736 video_util_error("Error _util_cb");
737 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
739 _handle->_util_cb->user_data = user_data;
740 _handle->_util_cb->transcode_completed_cb = completed_cb;
741 _handle->_util_cb->transcode_progress_cb = progress_cb;
743 if(_handle->accurate_mode)
744 accurate_mode = MM_SEEK_ACCURATE;
746 accurate_mode = MM_SEEK_INACCURATE;
748 ret = mm_transcode(_handle->transcode_h, _handle->width, _handle->height, _handle->fps, start, duration, accurate_mode, out_path, (mm_transcode_progress_callback)__video_util_transcode_progress_cb, (mm_transcode_completed_callback)__video_util_transcode_completed_cb, (void *)_handle->_util_cb);
750 if(ret != MM_ERROR_NONE)
752 UTIL_SAFE_FREE(_handle->_util_cb);
754 if(ret == MM_ERROR_TRANSCODE_INVALID_VALUE)
756 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
757 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
758 } else if(ret == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT)
760 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
761 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
765 video_util_error("INVALID_OPERATION(0x%08x)", ret);
766 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
772 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
773 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
779 int video_util_cancel_transcoding(video_util_h handle)
781 int ret = VIDEO_UTIL_ERROR_NONE;
782 video_util_s *_handle = NULL;
783 bool transcoder_supported = false;
784 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
785 if (false == transcoder_supported) {
786 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
787 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
790 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
791 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
794 _handle = (video_util_s*)handle;
795 if(_handle && (_handle->transcode_h))
797 ret = mm_transcode_cancel(_handle->transcode_h);
798 if(ret != MM_ERROR_NONE)
800 video_util_error("INVALID_OPERATION(0x%08x)", ret);
801 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
806 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
807 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
810 UTIL_SAFE_FREE(_handle->_util_cb);
811 video_util_debug("FREE(_handle->_util_cb)");
816 int video_util_get_progress_transcoding(video_util_h handle, unsigned long *current_position, unsigned long *duration)
818 int ret = VIDEO_UTIL_ERROR_NONE;
819 video_util_s *_handle = NULL;
821 bool transcoder_supported = false;
822 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
823 if (false == transcoder_supported) {
824 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
825 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
828 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
829 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
832 _handle = (video_util_s*)handle;
833 if(_handle && current_position && duration)
835 if(_handle->transcode_h)
837 ret = mm_transcode_get_attrs(_handle->transcode_h, (mm_containerformat_e *)&value, (mm_videoencoder_e *)&value, (mm_audioencoder_e *)&value,
838 current_position, duration, (unsigned int *)&value, (unsigned int *)&value);
839 if(ret != MM_ERROR_NONE)
841 video_util_error("INVALID_OPERATION(0x%08x)", ret);
842 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
847 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
848 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
853 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
854 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
860 int video_util_foreach_supported_file_format(video_util_h handle, video_util_supported_file_format_cb callback, void *user_data)
862 int ret = VIDEO_UTIL_ERROR_NONE;
863 video_util_s *_handle = NULL;
864 bool transcoder_supported = false;
865 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
866 if (false == transcoder_supported) {
867 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
868 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
871 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
872 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
875 _handle = (video_util_s*)handle;
876 if(_handle && callback)
878 ret = __video_util_foreach_supported_type(VIDEO_UTIL_TYPE_FORMAT, (video_util_supported_type_cb)callback, user_data);
882 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
883 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
889 int video_util_foreach_supported_video_codec(video_util_h handle, video_util_supported_video_encoder_cb callback, void *user_data)
891 int ret = VIDEO_UTIL_ERROR_NONE;
892 video_util_s *_handle = NULL;
893 bool transcoder_supported = false;
894 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
895 if (false == transcoder_supported) {
896 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
897 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
900 _handle = (video_util_s*)handle;
901 if(_handle && callback)
903 ret = __video_util_foreach_supported_type(VIDEO_UTIL_TYPE_VIDEO_ENC, (video_util_supported_type_cb)callback, user_data);
907 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
908 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
914 int video_util_foreach_supported_audio_codec(video_util_h handle, video_util_supported_audio_encoder_cb callback, void *user_data)
916 int ret = VIDEO_UTIL_ERROR_NONE;
917 video_util_s *_handle = NULL;
918 bool transcoder_supported = false;
919 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
920 if (false == transcoder_supported) {
921 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
922 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
925 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
926 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
929 _handle = (video_util_s*)handle;
930 if(_handle && callback)
932 ret = __video_util_foreach_supported_type(VIDEO_UTIL_TYPE_AUDIO_ENC, (video_util_supported_type_cb)callback, user_data);
936 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
937 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;