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>
25 #include <system_info.h>
31 #define LOG_TAG "CAPI_MEDIA_VIDEO_UTIL"
33 #define UTIL_SAFE_FREE(src) \
41 #define UTIL_STRING_VALID(str) \
42 ((str != NULL && strlen(str) > 0) ? true : false)
44 #define VIDEO_UTIL_MINIMUM_WIDTH 128
45 #define VIDEO_UTIL_MINIMUM_HEIGHT 96
46 #define VIDEO_UTIL_MINIMUM_DURATION 1000 /* 1 sec */
47 #define VIDEO_UTIL_MINIMUM_FPS 5
48 #define VIDEO_UTIL_MAXIMUM_FPS 30
49 #define VIDEO_UTIL_MAXIMUM_BPS 4294967295UL
51 static int __video_util_create_transcode_handle(video_util_s *handle);
52 static int __video_util_destroy_transcode_handle(video_util_s *handle);
53 static int __video_util_check_transcode_is_busy(video_util_s * handle, bool *is_busy);
54 static bool __video_util_check_video_codec(video_util_video_codec_e video_codec);
55 static bool __video_util_check_audio_codec(video_util_audio_codec_e audio_codec);
56 static bool __video_util_check_file_format(video_util_file_format_e file_format);
57 static bool __video_util_check_resolution(int width, int height);
58 static bool __video_util_check_duration(int duration);
59 static bool __video_util_check_fps(int fps);
60 static video_util_error_e __video_util_error_convert(int error);
61 static void __video_util_transcode_progress_cb(unsigned long current_position, unsigned long duration, void *user_data);
62 static void __video_util_transcode_completed_cb(int error, void *user_data);
63 static bool __video_util_type_callback(int codec_type, void *user_data);
64 static int __video_util_foreach_supported_type(video_util_type_e type, video_util_supported_type_cb callback, void *user_data);
66 static int __video_util_create_transcode_handle(video_util_s *handle)
68 int ret = VIDEO_UTIL_ERROR_NONE;
69 MMHandleType transcode_h = 0;
71 ret = mm_transcode_create(&transcode_h);
72 if (ret != MM_ERROR_NONE) {
73 if (ret == MM_ERROR_TRANSCODE_INVALID_VALUE) {
74 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
75 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
76 } else if (ret == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT) {
77 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
78 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
80 video_util_error("INVALID_OPERATION(0x%08x)", ret);
81 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
85 ret = mm_transcode_prepare(transcode_h, handle->input_path, handle->file_format, handle->video_codec, handle->audio_codec);
86 if (ret != MM_ERROR_NONE) {
87 if (ret == MM_ERROR_TRANSCODE_INVALID_VALUE) {
88 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
89 ret = VIDEO_UTIL_ERROR_INVALID_PARAMETER;
90 } 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;
94 video_util_error("INVALID_OPERATION(0x%08x)", ret);
95 ret = VIDEO_UTIL_ERROR_INVALID_OPERATION;
99 if (ret == MM_ERROR_NONE)
100 handle->transcode_h = transcode_h;
102 __video_util_destroy_transcode_handle(handle);
107 /* when should make new trandcode handle? input_filepath or file_format or video_codec or audio_codec is modified */
108 static int __video_util_destroy_transcode_handle(video_util_s *handle)
110 int ret = VIDEO_UTIL_ERROR_NONE;
112 if (handle->transcode_h) {
113 ret = mm_transcode_destroy(handle->transcode_h);
114 if (ret != MM_ERROR_NONE) {
115 video_util_error("INVALID_OPERATION (0x%08x)", ret);
116 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
120 handle->transcode_h = 0;
125 int __video_util_check_transcode_is_busy(video_util_s *handle, bool *is_busy)
127 int ret = VIDEO_UTIL_ERROR_NONE;
129 if (handle->transcode_h) {
130 ret = mm_transcode_is_busy(handle->transcode_h, is_busy);
131 if (ret != MM_ERROR_NONE) {
132 video_util_error("INVALID_OPERATION(0x%08x)", ret);
133 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
142 static bool __video_util_check_video_codec(video_util_video_codec_e video_codec)
144 if (video_codec > VIDEO_UTIL_VIDEO_CODEC_NONE) {
145 video_util_error("invalid video_codec [%d]", video_codec);
152 static bool __video_util_check_audio_codec(video_util_audio_codec_e audio_codec)
154 if (audio_codec > VIDEO_UTIL_AUDIO_CODEC_NONE) {
155 video_util_error("invalid audio_codec [%d]", audio_codec);
162 static bool __video_util_check_file_format(video_util_file_format_e file_format)
164 if (file_format >= VIDEO_UTIL_FILE_FORMAT_MAX) {
165 video_util_error("invalid file_format [%d]", file_format);
172 static bool __video_util_check_resolution(int width, int height)
174 if (((width > 0) && (width < VIDEO_UTIL_MINIMUM_WIDTH)) || (width < 0)) {
175 video_util_error("invalid width [%d]", width);
179 if (((height > 0) && (height < VIDEO_UTIL_MINIMUM_HEIGHT)) || (height < 0)) {
180 video_util_error("invalid height [%d]", height);
187 static bool __video_util_check_duration(int duration)
189 if (((duration > 0) && (duration < VIDEO_UTIL_MINIMUM_DURATION)) || (duration < 0)) {
190 video_util_error("invalid duration [%d]", duration);
197 static bool __video_util_check_fps(int fps)
199 if ((fps < 0) || ((fps > 0) && (fps < VIDEO_UTIL_MINIMUM_FPS)) || (fps > VIDEO_UTIL_MAXIMUM_FPS)) {
200 video_util_error("invalid fps [%d]", fps);
207 static video_util_error_e __video_util_error_convert(int error)
209 if (error == MM_ERROR_NONE) {
210 video_util_debug("Error None");
211 return VIDEO_UTIL_ERROR_NONE;
212 } else if (error == MM_ERROR_TRANSCODE_INVALID_VALUE) {
213 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
214 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
215 } else if (error == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT) {
216 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
217 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
219 video_util_error("INVALID_OPERATION(0x%08x)", error);
220 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
224 static void __video_util_transcode_progress_cb(unsigned long current_position, unsigned long duration, void *user_data)
226 video_util_s *_handle = (video_util_s *)user_data;
228 if ((_handle != NULL) && (_handle->_util_cb != NULL)
229 && (_handle->_util_cb->transcode_progress_cb != NULL))
230 _handle->_util_cb->transcode_progress_cb(current_position, duration, _handle->_util_cb->user_data);
235 static void __video_util_transcode_completed_cb(int error, void *user_data)
237 int error_value = VIDEO_UTIL_ERROR_NONE;
238 video_util_s *_handle = (video_util_s *)user_data;
240 if (_handle == NULL) {
241 video_util_error("INVALID_PARAMETER");
245 if ((_handle->_util_cb != NULL) && (_handle->_util_cb->transcode_completed_cb != NULL)) {
246 error_value = __video_util_error_convert(error);
247 _handle->_util_cb->transcode_completed_cb(error_value, _handle->_util_cb->user_data);
250 UTIL_SAFE_FREE(_handle->_util_cb);
255 static bool __video_util_type_callback(int codec_type, void *user_data)
257 video_util_type_cb_s *codec_cb = (video_util_type_cb_s *)user_data;
259 if (codec_cb != NULL) {
260 if (codec_cb->supported_type_cb)
261 codec_cb->supported_type_cb(codec_type, codec_cb->user_data);
267 static int __video_util_foreach_supported_type(video_util_type_e type, video_util_supported_type_cb callback, void *user_data)
269 int ret = VIDEO_UTIL_ERROR_NONE;
271 video_util_type_cb_s *codec_cb = (video_util_type_cb_s *)calloc(1, sizeof(video_util_type_cb_s));
273 video_util_error("Fail to allocate internal callback");
274 return VIDEO_UTIL_ERROR_OUT_OF_MEMORY;
277 codec_cb->user_data = user_data;
278 codec_cb->supported_type_cb = (video_util_supported_type_cb)callback;
280 if (type == VIDEO_UTIL_TYPE_FORMAT)
281 ret = mm_transcode_get_supported_container_format((mm_transcode_support_type_callback)__video_util_type_callback, (void *)codec_cb);
282 else if (type == VIDEO_UTIL_TYPE_VIDEO_ENC)
283 ret = mm_transcode_get_supported_video_encoder((mm_transcode_support_type_callback)__video_util_type_callback, (void *)codec_cb);
284 else if (type == VIDEO_UTIL_TYPE_AUDIO_ENC)
285 ret = mm_transcode_get_supported_audio_encoder((mm_transcode_support_type_callback)__video_util_type_callback, (void *)codec_cb);
287 video_util_error("Invalid type (%d)", type);
288 ret = VIDEO_UTIL_ERROR_INVALID_PARAMETER;
291 UTIL_SAFE_FREE(codec_cb);
296 int video_util_create(video_util_h *handle)
298 int ret = VIDEO_UTIL_ERROR_NONE;
299 bool transcoder_supported = false;
301 video_util_deprecated_log(__FUNCTION__);
303 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
304 if (false == transcoder_supported) {
305 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
306 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
309 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
310 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
313 if (handle == NULL) {
314 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
315 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
318 video_util_s *_handle = (video_util_s *)calloc(1, sizeof(video_util_s));
319 if (_handle == NULL) {
320 video_util_error("OUT_OF_MEMORY(0x%08x)", VIDEO_UTIL_ERROR_OUT_OF_MEMORY);
321 return VIDEO_UTIL_ERROR_OUT_OF_MEMORY;
324 _handle->input_path = NULL;
325 _handle->accurate_mode = false;
326 _handle->video_codec = 0;
327 _handle->audio_codec = 0;
328 _handle->file_format = 0;
332 _handle->transcode_h = 0;
333 _handle->_util_cb = NULL;
335 *handle = (video_util_h)_handle;
340 int video_util_destroy(video_util_h handle)
342 int ret = VIDEO_UTIL_ERROR_NONE;
343 video_util_s *_handle = NULL;
344 bool transcoder_supported = false;
346 video_util_deprecated_log(__FUNCTION__);
348 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
349 if (false == transcoder_supported) {
350 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
351 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
354 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
355 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
358 _handle = (video_util_s *)handle;
359 if (_handle == NULL) {
360 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
361 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
364 ret = __video_util_destroy_transcode_handle(_handle);
366 UTIL_SAFE_FREE(_handle->_util_cb);
367 video_util_debug("FREE(_handle->_util_cb)");
368 UTIL_SAFE_FREE(_handle->input_path);
369 UTIL_SAFE_FREE(_handle);
374 int video_util_set_file_path(video_util_h handle, const char *file_path)
376 int ret = VIDEO_UTIL_ERROR_NONE;
377 video_util_s *_handle = NULL;
378 bool is_busy = false;
379 bool transcoder_supported = false;
381 video_util_deprecated_log(__FUNCTION__);
383 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
384 if (false == transcoder_supported) {
385 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
386 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
389 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
390 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
393 _handle = (video_util_s *)handle;
394 if ((_handle != NULL) && (UTIL_STRING_VALID(file_path))) {
395 video_util_secure_info("file_path [%s]\n", file_path);
397 if (_handle->input_path != NULL) {
398 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
399 if (ret != VIDEO_UTIL_ERROR_NONE)
403 video_util_error("BUSY!! Transcoding is already running.\n");
404 return VIDEO_UTIL_ERROR_BUSY;
406 ret = __video_util_destroy_transcode_handle(_handle);
407 if (ret != VIDEO_UTIL_ERROR_NONE)
410 UTIL_SAFE_FREE(_handle->input_path);
414 _handle->input_path = strdup(file_path);
415 if (_handle->input_path == NULL) {
416 video_util_error("OUT_OF_MEMORY(0x%08x)", VIDEO_UTIL_ERROR_OUT_OF_MEMORY);
417 return VIDEO_UTIL_ERROR_OUT_OF_MEMORY;
420 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
421 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
427 int video_util_set_accurate_mode(video_util_h handle, bool accurate_mode)
429 int ret = VIDEO_UTIL_ERROR_NONE;
430 video_util_s *_handle = NULL;
431 bool transcoder_supported = false;
433 video_util_deprecated_log(__FUNCTION__);
435 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
436 if (false == transcoder_supported) {
437 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
438 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
441 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
442 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
445 _handle = (video_util_s *)handle;
446 if (_handle != NULL) {
447 _handle->accurate_mode = accurate_mode;
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_video_codec(video_util_h handle, video_util_video_codec_e codec)
458 int ret = VIDEO_UTIL_ERROR_NONE;
459 video_util_s *_handle = NULL;
460 bool is_busy = false;
461 bool transcoder_supported = false;
463 video_util_deprecated_log(__FUNCTION__);
465 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
466 if (false == transcoder_supported) {
467 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
468 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
471 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
472 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
475 _handle = (video_util_s *)handle;
476 if ((_handle != NULL) && (__video_util_check_video_codec(codec))) {
477 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
478 if (ret != VIDEO_UTIL_ERROR_NONE)
482 video_util_error("BUSY!! Transcoding is already running.\n");
483 return VIDEO_UTIL_ERROR_BUSY;
485 ret = __video_util_destroy_transcode_handle(_handle);
486 if (ret != VIDEO_UTIL_ERROR_NONE)
490 _handle->video_codec = codec;
492 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
493 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
499 int video_util_set_audio_codec(video_util_h handle, video_util_audio_codec_e codec)
501 int ret = VIDEO_UTIL_ERROR_NONE;
502 video_util_s *_handle = NULL;
503 bool is_busy = false;
504 bool transcoder_supported = false;
506 video_util_deprecated_log(__FUNCTION__);
508 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
509 if (false == transcoder_supported) {
510 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
511 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
514 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
515 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
518 _handle = (video_util_s *)handle;
519 if ((_handle != NULL) && (__video_util_check_audio_codec(codec))) {
520 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
521 if (ret != VIDEO_UTIL_ERROR_NONE)
525 video_util_error("BUSY!! Transcoding is already running.\n");
526 return VIDEO_UTIL_ERROR_BUSY;
528 ret = __video_util_destroy_transcode_handle(_handle);
529 if (ret != VIDEO_UTIL_ERROR_NONE)
533 _handle->audio_codec = codec;
535 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
536 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
542 int video_util_set_file_format(video_util_h handle, video_util_file_format_e format)
544 int ret = VIDEO_UTIL_ERROR_NONE;
545 video_util_s *_handle = NULL;
546 bool is_busy = false;
547 bool transcoder_supported = false;
549 video_util_deprecated_log(__FUNCTION__);
551 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
552 if (false == transcoder_supported) {
553 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
554 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
557 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
558 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
561 _handle = (video_util_s *)handle;
562 if ((_handle != NULL) && (__video_util_check_file_format(format))) {
563 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
564 if (ret != VIDEO_UTIL_ERROR_NONE)
568 video_util_error("BUSY!! Transcoding is already running.\n");
569 return VIDEO_UTIL_ERROR_BUSY;
571 ret = __video_util_destroy_transcode_handle(_handle);
572 if (ret != VIDEO_UTIL_ERROR_NONE)
576 _handle->file_format = format;
578 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
579 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
585 int video_util_set_resolution(video_util_h handle, int width, int height)
587 int ret = VIDEO_UTIL_ERROR_NONE;
588 video_util_s *_handle = NULL;
589 bool transcoder_supported = false;
591 video_util_deprecated_log(__FUNCTION__);
593 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
594 if (false == transcoder_supported) {
595 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
596 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
599 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
600 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
603 _handle = (video_util_s *)handle;
604 if ((_handle != NULL) && (__video_util_check_resolution(width, height))) {
605 _handle->width = width;
606 _handle->height = height;
608 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
609 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
615 int video_util_set_fps(video_util_h handle, int fps)
617 int ret = VIDEO_UTIL_ERROR_NONE;
618 video_util_s *_handle = NULL;
619 bool transcoder_supported = false;
621 video_util_deprecated_log(__FUNCTION__);
623 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
624 if (false == transcoder_supported) {
625 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
626 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
629 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
630 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
633 _handle = (video_util_s *)handle;
634 if (_handle && __video_util_check_fps(fps)) {
637 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
638 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
644 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)
646 int ret = VIDEO_UTIL_ERROR_NONE;
647 video_util_s *_handle = NULL;
648 mm_seek_mode_e accurate_mode = MM_SEEK_NUM;
649 bool is_busy = false;
650 bool transcoder_supported = false;
652 video_util_deprecated_log(__FUNCTION__);
654 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
655 if (false == transcoder_supported) {
656 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
657 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
660 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
661 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
664 _handle = (video_util_s *)handle;
665 video_util_debug("start [%lu] duration [%lu]\n", start, duration);
667 if (_handle && (__video_util_check_duration(duration)) && (UTIL_STRING_VALID(_handle->input_path)) && (UTIL_STRING_VALID(out_path)) && completed_cb) {
668 if (!_handle->transcode_h) {
669 ret = __video_util_create_transcode_handle(_handle);
670 if (ret != MM_ERROR_NONE)
673 if (!_handle->transcode_h) {
674 video_util_error("INVALID_OPERATION(0x%08x)", VIDEO_UTIL_ERROR_INVALID_OPERATION);
675 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
678 ret = __video_util_check_transcode_is_busy(_handle, &is_busy);
679 if (ret != VIDEO_UTIL_ERROR_NONE)
683 video_util_error("BUSY!! Transcoding is already running.\n");
684 return VIDEO_UTIL_ERROR_BUSY;
688 video_util_debug("width [%d] height [%d] fps [%d]v_codec [%d] a_codec [%d] file_format [%d] accurate [%d]\n", _handle->width, _handle->height, _handle->fps, _handle->video_codec, _handle->audio_codec, _handle->file_format, _handle->accurate_mode);
690 _handle->_util_cb = (video_util_cb_s *)calloc(1, sizeof(video_util_cb_s));
691 if (!_handle->_util_cb) {
692 video_util_error("Error _util_cb");
693 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
695 _handle->_util_cb->user_data = user_data;
696 _handle->_util_cb->transcode_completed_cb = completed_cb;
697 _handle->_util_cb->transcode_progress_cb = progress_cb;
699 if (_handle->accurate_mode)
700 accurate_mode = MM_SEEK_ACCURATE;
702 accurate_mode = MM_SEEK_INACCURATE;
704 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);
706 if (ret != MM_ERROR_NONE) {
707 UTIL_SAFE_FREE(_handle->_util_cb);
709 if (ret == MM_ERROR_TRANSCODE_INVALID_VALUE) {
710 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
711 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
712 } else if (ret == MM_ERROR_TRANSCODE_NOT_SUPPORT_FORMAT) {
713 video_util_error("NOT_SUPPORTED_FORMAT(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT);
714 return VIDEO_UTIL_ERROR_NOT_SUPPORTED_FORMAT;
716 video_util_error("INVALID_OPERATION(0x%08x)", ret);
717 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
721 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
722 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
728 int video_util_cancel_transcoding(video_util_h handle)
730 int ret = VIDEO_UTIL_ERROR_NONE;
731 video_util_s *_handle = NULL;
732 bool transcoder_supported = false;
734 video_util_deprecated_log(__FUNCTION__);
736 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
737 if (false == transcoder_supported) {
738 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
739 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
742 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
743 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
746 _handle = (video_util_s *)handle;
747 if (_handle && (_handle->transcode_h)) {
748 ret = mm_transcode_cancel(_handle->transcode_h);
749 if (ret != MM_ERROR_NONE) {
750 video_util_error("INVALID_OPERATION(0x%08x)", ret);
751 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
754 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
755 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
758 UTIL_SAFE_FREE(_handle->_util_cb);
759 video_util_debug("FREE(_handle->_util_cb)");
764 int video_util_get_progress_transcoding(video_util_h handle, unsigned long *current_position, unsigned long *duration)
766 int ret = VIDEO_UTIL_ERROR_NONE;
767 video_util_s *_handle = NULL;
769 bool transcoder_supported = false;
771 video_util_deprecated_log(__FUNCTION__);
773 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
774 if (false == transcoder_supported) {
775 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
776 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
779 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
780 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
783 _handle = (video_util_s *)handle;
784 if (_handle && current_position && duration) {
785 if (_handle->transcode_h) {
786 ret = mm_transcode_get_attrs(_handle->transcode_h, (mm_containerformat_e *)&value, (mm_videoencoder_e *)&value, (mm_audioencoder_e *)&value, current_position, duration, (unsigned int *)&value, (unsigned int *)&value);
787 if (ret != MM_ERROR_NONE) {
788 video_util_error("INVALID_OPERATION(0x%08x)", ret);
789 return VIDEO_UTIL_ERROR_INVALID_OPERATION;
792 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
793 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
796 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
797 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
803 int video_util_foreach_supported_file_format(video_util_h handle, video_util_supported_file_format_cb callback, void *user_data)
805 int ret = VIDEO_UTIL_ERROR_NONE;
806 video_util_s *_handle = NULL;
807 bool transcoder_supported = false;
809 video_util_deprecated_log(__FUNCTION__);
811 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
812 if (false == transcoder_supported) {
813 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
814 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
817 video_util_error("Error - System Info of Platform(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
818 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
821 _handle = (video_util_s *)handle;
822 if (_handle && callback) {
823 ret = __video_util_foreach_supported_type(VIDEO_UTIL_TYPE_FORMAT, (video_util_supported_type_cb)callback, user_data);
825 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
826 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
832 int video_util_foreach_supported_video_codec(video_util_h handle, video_util_supported_video_encoder_cb callback, void *user_data)
834 int ret = VIDEO_UTIL_ERROR_NONE;
835 video_util_s *_handle = NULL;
836 bool transcoder_supported = false;
838 video_util_deprecated_log(__FUNCTION__);
840 if (0 == system_info_get_platform_bool(TRANSCODER_FEATURE_PATH, &transcoder_supported)) {
841 if (false == transcoder_supported) {
842 video_util_error("VIDEO_UTIL_ERROR_NOT_SUPPORTED(0x%08x)", VIDEO_UTIL_ERROR_NOT_SUPPORTED);
843 return VIDEO_UTIL_ERROR_NOT_SUPPORTED;
846 _handle = (video_util_s *)handle;
847 if (_handle && callback) {
848 ret = __video_util_foreach_supported_type(VIDEO_UTIL_TYPE_VIDEO_ENC, (video_util_supported_type_cb)callback, user_data);
850 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
851 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;
857 int video_util_foreach_supported_audio_codec(video_util_h handle, video_util_supported_audio_encoder_cb callback, void *user_data)
859 int ret = VIDEO_UTIL_ERROR_NONE;
860 video_util_s *_handle = NULL;
861 bool transcoder_supported = false;
863 video_util_deprecated_log(__FUNCTION__);
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) {
877 ret = __video_util_foreach_supported_type(VIDEO_UTIL_TYPE_AUDIO_ENC, (video_util_supported_type_cb)callback, user_data);
879 video_util_error("INVALID_PARAMETER(0x%08x)", VIDEO_UTIL_ERROR_INVALID_PARAMETER);
880 return VIDEO_UTIL_ERROR_INVALID_PARAMETER;