From 1cd52c840d97f70705725470e7f8ea28baf28a23 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 2 Aug 2021 18:16:39 +0900 Subject: [PATCH 01/16] Set bitrate for encoder [Version] 0.6.21 [Issue Type] Bug fix Change-Id: I441c5dfc9fab3736f2c6ad662bd24c2bb9a0a4a4 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port.c | 16 ++++++++++++---- src/media_codec_port_gst.c | 29 ++++++++++++++++++++--------- test/media_codec_test.c | 2 +- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index cf5fbf3..4a500a5 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.20 +Version: 0.6.21 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port.c b/src/media_codec_port.c index 70b5cc3..cadd8e6 100644 --- a/src/media_codec_port.c +++ b/src/media_codec_port.c @@ -171,8 +171,10 @@ int mc_set_vdec_info(MMHandleType mediacodec, int width, int height) return MC_INVALID_ARG; } - if (!_check_support_video_info(mc_handle->codec_id, width, height)) + if (!_check_support_video_info(mc_handle->codec_id, width, height)) { + LOGE("invaild param[res %dx%d]", width, height); return MC_PARAM_ERROR; + } MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && mc_handle->is_video && !mc_handle->is_encoder, MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER"); @@ -195,8 +197,10 @@ int mc_set_venc_info(MMHandleType mediacodec, int width, int height, int fps, in return MC_INVALID_ARG; } - if (!_check_support_video_info(mc_handle->codec_id, width, height) || fps < 0 || target_bits < 0) + if (!_check_support_video_info(mc_handle->codec_id, width, height) || fps < 0 || target_bits < 0) { + LOGE("invaild param[res %dx%d, fps %d, target_bits %d]", width, height, fps, target_bits); return MC_PARAM_ERROR; + } MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && mc_handle->is_video && mc_handle->is_encoder, MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER"); @@ -220,8 +224,10 @@ int mc_set_adec_info(MMHandleType mediacodec, int samplerate, int channel, int b return MC_INVALID_ARG; } - if (!_check_support_audio_info(mc_handle->codec_id, samplerate, channel, bit)) + if (!_check_support_audio_info(mc_handle->codec_id, samplerate, channel, bit)) { + LOGE("invaild param[samplerate %d, channel %d, bit %d]", samplerate, channel, bit); return MC_PARAM_ERROR; + } MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && !mc_handle->is_video && !mc_handle->is_encoder, MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER"); @@ -244,8 +250,10 @@ int mc_set_aenc_info(MMHandleType mediacodec, int samplerate, int channel, int b return MC_INVALID_ARG; } - if (!_check_support_audio_info(mc_handle->codec_id, samplerate, channel, bit)) + if (!_check_support_audio_info(mc_handle->codec_id, samplerate, channel, bit) || bitrate < 0) { + LOGE("invaild param[samplerate %d, channel %d, bit %d, bitrate %d]", samplerate, channel, bit, bitrate); return MC_PARAM_ERROR; + } MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && !mc_handle->is_video && mc_handle->is_encoder, MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER"); diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 110003f..2746bec 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -1696,24 +1696,24 @@ media_packet_h _mc_get_input_buffer(mc_gst_core_t *core) mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) { - MEDIACODEC_FENTER(); - int ret = MC_ERROR_NONE; - media_format_mimetype_e out_mime; int num_supported_codec = 0; int i = 0; - GstCaps *caps = NULL; - - if (!mc_handle) - return MC_PARAM_ERROR; - - mediacodec_codec_type_e id; + int bitrate = 0; bool video; bool encoder; bool hardware; gchar *factory_name = NULL; + GstCaps *caps = NULL; + media_format_mimetype_e out_mime; + mediacodec_codec_type_e id; mc_codec_map_t *codec_map; + MEDIACODEC_FENTER(); + + if (!mc_handle) + return MC_PARAM_ERROR; + id = mc_handle->codec_id; video = mc_handle->is_video; encoder = mc_handle->is_encoder; @@ -1801,6 +1801,17 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) g_object_set(new_core->capsfilter, "caps", caps, NULL); gst_caps_unref(caps); + if (new_core->encoder) { + if (new_core->video) + bitrate = mc_handle->info.video.bitrate; + else + bitrate = mc_handle->info.audio.bitrate; + + LOGI("set encoder bitrate[v:%d] %d", new_core->video, bitrate); + + g_object_set(new_core->codec, "bitrate", bitrate, NULL); + } + mc_handle->core = new_core; LOGD("initialized... %d", ret); MEDIACODEC_FLEAVE(); diff --git a/test/media_codec_test.c b/test/media_codec_test.c index b02cd3e..9c77527 100644 --- a/test/media_codec_test.c +++ b/test/media_codec_test.c @@ -2246,7 +2246,7 @@ void interpret(char *cmd) int len; if (cnt == 0) { len = strlen(cmd); - strncpy(app->filepath, cmd, len + 1); + strncpy(app->filepath, cmd, sizeof(app->filepath) - 1); g_print("%s, %d\n", app->filepath, len); cnt++; } else if (cnt == 1) { -- 2.7.4 From cafc35f318e67a55729d4f666ec48c7ec561291d Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Wed, 26 Jan 2022 13:02:30 +0900 Subject: [PATCH 02/16] Change installation path for gcov [Version] 0.6.21-1 [Issue Type] Update Change-Id: I2e539829905e97ad79dd48d41ba287a53ec840d7 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 4a500a5..a237cf2 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -5,7 +5,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API Version: 0.6.21 -Release: 0 +Release: 1 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz @@ -91,8 +91,8 @@ cp test/media_codec_test %{buildroot}/usr/bin %make_install %if 0%{?gcov:1} -mkdir -p %{buildroot}%{_datadir}/gcov/obj -install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj +mkdir -p %{buildroot}%{_datadir}/gcov/obj/%{name} +install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj/%{name} %endif -- 2.7.4 From 4ba2e369d2d10a3411ad20495da3ef6c62cb7ef9 Mon Sep 17 00:00:00 2001 From: Seungbae Shin Date: Thu, 17 Mar 2022 00:03:18 +0900 Subject: [PATCH 03/16] Remove dead codes [Version] 0.6.22 [Issue Type] Cleanup Change-Id: Iedaa837c58db2e9be9f19377a48d3d25bc7d0f24 --- include/media_codec_port.h | 3 +-- include/media_codec_queue.h | 1 - packaging/capi-media-codec.spec | 4 ++-- src/media_codec.c | 15 --------------- src/media_codec_port.c | 27 --------------------------- src/media_codec_queue.c | 7 ------- 6 files changed, 3 insertions(+), 54 deletions(-) diff --git a/include/media_codec_port.h b/include/media_codec_port.h index b34afa9..d13531c 100644 --- a/include/media_codec_port.h +++ b/include/media_codec_port.h @@ -152,7 +152,6 @@ typedef enum { _MEDIACODEC_EVENT_TYPE_EOS, _MEDIACODEC_EVENT_TYPE_BUFFER_STATUS, _MEDIACODEC_EVENT_TYPE_INTERNAL_FILLBUFFER, - _MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC, _MEDIACODEC_EVENT_TYPE_NUM } _mediacodec_event_e; @@ -260,7 +259,7 @@ int mc_unset_eos_cb(MMHandleType mediacodec); int mc_set_buffer_status_cb(MMHandleType mediacodec, mediacodec_buffer_status_cb callback, void* user_data); int mc_unset_buffer_status_cb(MMHandleType mediacodec); -int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void* user_data); + int _mediacodec_foreach_supported_codec(mediacodec_supported_codec_cb callback, void* user_data); void _mc_create_codec_map_from_ini(mc_handle_t *mc_handle, mc_codec_spec_t *spec_emul); diff --git a/include/media_codec_queue.h b/include/media_codec_queue.h index cc8fe24..f0d89e4 100644 --- a/include/media_codec_queue.h +++ b/include/media_codec_queue.h @@ -45,7 +45,6 @@ void mc_async_queue_push(async_queue_t *async_queue, gpointer data); gpointer mc_async_queue_pop_forced(async_queue_t *async_queue); gpointer mc_async_queue_pop(async_queue_t *async_queue); void mc_async_queue_disable(async_queue_t *async_queue); -void mc_async_queue_enable(async_queue_t *async_queue); void mc_async_queue_flush(async_queue_t *async_queue); gboolean mc_async_queue_is_empty(async_queue_t *async_queue); diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index a237cf2..f403b36 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,8 +4,8 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.21 -Release: 1 +Version: 0.6.22 +Release: 0 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/src/media_codec.c b/src/media_codec.c index cff7fc1..60eb677 100644 --- a/src/media_codec.c +++ b/src/media_codec.c @@ -36,7 +36,6 @@ static gboolean __mediacodec_empty_buffer_cb(media_packet_h pkt, void *user_dat static gboolean __mediacodec_fill_buffer_cb(media_packet_h pkt, void *user_data); static gboolean __mediacodec_error_cb(mediacodec_error_e error, void *user_data); static gboolean __mediacodec_eos_cb(void *user_data); -static gboolean __mediacodec_supported_codec_cb(mediacodec_codec_type_e codec_type, void *user_data); static gboolean __mediacodec_buffer_status_cb(mediacodec_status_e status, void *user_data); #ifdef USE_MM_RESOURCE_MANAGER static void __mediacodec_init_lib() __attribute__((constructor)); @@ -179,7 +178,6 @@ int mediacodec_create(mediacodec_h *mediacodec) mc_set_error_cb(handle->mc_handle, (mediacodec_error_cb)__mediacodec_error_cb, handle); mc_set_eos_cb(handle->mc_handle, (mediacodec_eos_cb)__mediacodec_eos_cb, handle); mc_set_buffer_status_cb(handle->mc_handle, (mediacodec_buffer_status_cb)__mediacodec_buffer_status_cb, handle); - mc_set_supported_codec_cb(handle->mc_handle, (mediacodec_supported_codec_cb)__mediacodec_supported_codec_cb, handle); #ifdef USE_MM_RESOURCE_MANAGER g_mutex_lock(&g_mediacodec_lock); @@ -695,19 +693,6 @@ static gboolean __mediacodec_eos_cb(void *user_data) return 1; } -static gboolean __mediacodec_supported_codec_cb(mediacodec_codec_type_e codec_type, void *user_data) -{ - if (user_data == NULL) - return 0; - - mediacodec_s *handle = (mediacodec_s *)user_data; - - if (handle->supported_codec_cb) - return ((mediacodec_supported_codec_cb)handle->supported_codec_cb)(codec_type, handle->supported_codec_cb_userdata); - - return false; -} - static gboolean __mediacodec_buffer_status_cb(mediacodec_status_e status, void *user_data) { if (user_data == NULL) diff --git a/src/media_codec_port.c b/src/media_codec_port.c index cadd8e6..128a44a 100644 --- a/src/media_codec_port.c +++ b/src/media_codec_port.c @@ -779,33 +779,6 @@ int mc_unset_buffer_status_cb(MMHandleType mediacodec) return MC_ERROR_NONE; } -int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void *user_data) -{ - int ret = MC_ERROR_NONE; - mc_handle_t *mc_handle = (mc_handle_t *)mediacodec; - - if (!mc_handle) { - LOGE("fail invaild param\n"); - return MC_INVALID_ARG; - } - - if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC]) { - LOGE("Already set mediacodec_supported_codec_cb\n"); - return MC_PARAM_ERROR; - } else { - if (!callback) - return MC_INVALID_ARG; - - LOGD("Set event handler callback(cb = %p, data = %p)", callback, user_data); - - mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC] = (mc_supported_codec_cb) callback; - mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC] = user_data; - return MC_ERROR_NONE; - } - - return ret; -} - int _mediacodec_foreach_supported_codec(mediacodec_supported_codec_cb callback, void *user_data) { int i; diff --git a/src/media_codec_queue.c b/src/media_codec_queue.c index d8568d1..5b8a328 100644 --- a/src/media_codec_queue.c +++ b/src/media_codec_queue.c @@ -115,13 +115,6 @@ void mc_async_queue_disable(async_queue_t *async_queue) g_mutex_unlock(&async_queue->mutex); } -void mc_async_queue_enable(async_queue_t *async_queue) -{ - g_mutex_lock(&async_queue->mutex); - async_queue->enabled = TRUE; - g_mutex_unlock(&async_queue->mutex); -} - void mc_async_queue_flush(async_queue_t *async_queue) { g_mutex_lock(&async_queue->mutex); -- 2.7.4 From 30017b182c2799c1ec6d3ce564685603e32ef402 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 17 May 2022 15:12:40 +0900 Subject: [PATCH 04/16] Release feed task thread before destroy pipeline - The crash could be occurred if make gst buffer in feed task thread after gst pipeline is destroyed. [Version] 0.6.23 [Issue Type] Improvement Change-Id: I96ca4da5222d8b511c9f54d3eb48337ff61e13ef Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 46 ++++++++++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index f403b36..8d11131 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.22 +Version: 0.6.23 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 2746bec..68e9c5e 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -33,6 +33,8 @@ * Internal Implementation */ static gpointer feed_task(gpointer data); +static void _mc_gst_feed_task_new(mc_gst_core_t *core); +static void _mc_gst_feed_task_free(mc_gst_core_t *core); static void __mc_gst_stop_feed(GstElement *pipeline, gpointer data); static void __mc_gst_start_feed(GstElement *pipeline, guint size, gpointer data); static media_packet_h _mc_get_input_buffer(mc_gst_core_t *core); @@ -977,13 +979,11 @@ static mc_gst_core_t *mc_gst_core_new() core->prepare_count = 0; core->etb_count = 0; core->codec_data = NULL; - - g_atomic_int_set(&core->available_queue->running, 1); - core->available_queue->thread = g_thread_new("feed thread", &feed_task, core); core->allocator = gst_tizen_allocator_new(); core->bufmgr = NULL; core->drm_fd = -1; + LOGD("gst_core(%p) is created", core); MEDIACODEC_FLEAVE(); @@ -995,15 +995,6 @@ static void mc_gst_core_free(mc_gst_core_t *core) { MEDIACODEC_FENTER(); - mc_aqueue_t *async_queue; - - async_queue = core->available_queue; - - mc_async_queue_disable(async_queue->input); - - g_atomic_int_set(&async_queue->running, 0); - g_thread_join(async_queue->thread); - g_mutex_clear(&core->eos_mutex); g_mutex_clear(&core->prepare_lock); g_mutex_clear(&core->drain_lock); @@ -1011,8 +1002,9 @@ static void mc_gst_core_free(mc_gst_core_t *core) g_cond_clear(&core->buffer_cond); g_cond_clear(&core->out_buffer_cond); - mc_async_queue_free(async_queue->input); - g_free(async_queue); + mc_async_queue_free(core->available_queue->input); + g_free(core->available_queue); + core->available_queue = NULL; if (core->allocator) { gst_object_unref(core->allocator); @@ -1326,6 +1318,28 @@ LEAVE: return NULL; } +static void _mc_gst_feed_task_new(mc_gst_core_t *core) +{ + g_return_if_fail(core && core->available_queue); + + g_atomic_int_set(&core->available_queue->running, 1); + core->available_queue->thread = g_thread_new("feed thread", &feed_task, core); + + LOGI("new thread for feed[%p]", core->available_queue->thread); +} + +static void _mc_gst_feed_task_free(mc_gst_core_t *core) +{ + g_return_if_fail(core && core->available_queue); + + mc_async_queue_disable(core->available_queue->input); + + g_atomic_int_set(&core->available_queue->running, 0); + g_thread_join(core->available_queue->thread); + + LOGI("feed thread[%p] is released", core->available_queue->thread); +} + static void __mc_gst_stop_feed(GstElement *pipeline, gpointer data) { mc_gst_core_t *core = (mc_gst_core_t *)data; @@ -1812,6 +1826,8 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) g_object_set(new_core->codec, "bitrate", bitrate, NULL); } + _mc_gst_feed_task_new(new_core); + mc_handle->core = new_core; LOGD("initialized... %d", ret); MEDIACODEC_FLEAVE(); @@ -1842,6 +1858,8 @@ mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle) if (core->eos) _mc_send_eos_signal(core); + _mc_gst_feed_task_free(core); + _mc_gst_set_flush_input(core); ret = _mc_gst_destroy_pipeline(core); -- 2.7.4 From feb9a716d611ef059f3953ed3b22fcdd0a55c9d2 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 24 May 2022 16:38:37 +0900 Subject: [PATCH 05/16] Update for line coverage measurement automation [Version] 0.6.23-1 [Issue Type] Line coverage Change-Id: I1bec4a020be0f6380ad95a6fe36c2292d8f1ca78 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 8d11131..7802316 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -5,7 +5,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API Version: 0.6.23 -Release: 0 +Release: 1 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz @@ -78,10 +78,6 @@ MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` make %{?jobs:-j%jobs} -%if 0%{?gcov:1} -mkdir -p gcov-obj -find . -name '*.gcno' -exec cp '{}' gcov-obj ';' -%endif %install rm -rf %{buildroot} @@ -91,8 +87,10 @@ cp test/media_codec_test %{buildroot}/usr/bin %make_install %if 0%{?gcov:1} -mkdir -p %{buildroot}%{_datadir}/gcov/obj/%{name} -install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj/%{name} +builddir=$(basename $PWD) +gcno_obj_dir=%{buildroot}%{_datadir}/gcov/obj/%{name}/"$builddir" +mkdir -p "$gcno_obj_dir" +find . -name '*.gcno' -exec cp --parents '{}' "$gcno_obj_dir" ';' %endif -- 2.7.4 From 922e3b74c4a942cfb4e76762a382e355670c5819 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 5 Aug 2022 09:39:48 +0900 Subject: [PATCH 06/16] Unmap memory after use - The data pointer could be unavailable after gst_memory_unmap(). [Version] 0.6.24 [Issue Type] Improvement Change-Id: I2596aa01ab24da3893339ea34c959ccb699f83f3 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 4 ++-- src/media_codec_port_gst.c | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 7802316..2ab1b78 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,8 +4,8 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.23 -Release: 1 +Version: 0.6.24 +Release: 0 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 68e9c5e..abad009 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2516,7 +2516,6 @@ GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) data = map.data; size = map.size; - gst_memory_unmap(mem, &map); } mcbuffer = g_new0(GstMCBuffer, 1); @@ -2526,6 +2525,10 @@ GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) mcbuffer->buf_size = size; ret = __mc_fill_output_buffer(core, data, mcbuffer->buf_size, mcbuffer); + + if (!gst_is_tizen_memory(mem)) + gst_memory_unmap(mem, &map); + if (ret != MC_ERROR_NONE) { LOGW("failed to fill outbuf: %s (ox%08x)", _mc_error_to_string(ret), ret); g_free(mcbuffer); -- 2.7.4 From 32d802f60f31826c649ee35cf4c2845bf2b55a32 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 29 Aug 2022 21:20:20 +0900 Subject: [PATCH 07/16] Add new enum for codec role [Version] 0.6.25 [Issue Type] Update Change-Id: If817afcb91ab538079098a0320510873d951fa51 Signed-off-by: Jeongmo Yang --- include/media_codec_ini.h | 11 ++++++++-- packaging/capi-media-codec.spec | 2 +- src/media_codec_ini.c | 40 +++++++++++++++++----------------- src/media_codec_port.c | 48 ++++++++++++++++++++--------------------- 4 files changed, 54 insertions(+), 47 deletions(-) diff --git a/include/media_codec_ini.h b/include/media_codec_ini.h index ee05257..bdf22ba 100644 --- a/include/media_codec_ini.h +++ b/include/media_codec_ini.h @@ -31,7 +31,6 @@ extern "C" { #define MEDIA_CODEC_INI_CNAME_LEN 16 #define DEFAULT_PORT "GST_PORT" #define MEDIA_CODEC_MAX_CODEC_TYPE 100 -#define MEDIA_CODEC_MAX_CODEC_ROLE 4 #define MEDICODEC_INI_MAX_ELEMENT 10 #define MEDIA_CODEC_MAX_VIDEO_CODEC 100 @@ -53,6 +52,14 @@ typedef enum { CUSTOM_PORT, } port_mode; +typedef enum { + MEDIA_CODEC_ROLE_HW_DECODER = 0, + MEDIA_CODEC_ROLE_HW_ENCODER, + MEDIA_CODEC_ROLE_SW_DECODER, + MEDIA_CODEC_ROLE_SW_ENCODER, + MEDIA_CODEC_ROLE_MAX +} codec_role; + struct _codec_info_t { gchar name[MEDIA_CODEC_INI_MAX_STRLEN]; gchar mime[MEDIA_CODEC_INI_MAX_STRLEN]; @@ -61,7 +68,7 @@ struct _codec_info_t { struct _codec_t { gint codec_id; - codec_info_t codec_info[MEDIA_CODEC_MAX_CODEC_ROLE]; + codec_info_t codec_info[MEDIA_CODEC_ROLE_MAX]; }; diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 2ab1b78..0cede0a 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.24 +Version: 0.6.25 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_ini.c b/src/media_codec_ini.c index 35bc0b0..0978fe3 100644 --- a/src/media_codec_ini.c +++ b/src/media_codec_ini.c @@ -341,13 +341,13 @@ int mc_ini_load(mc_ini_t *ini) int len = strlen(cname); ini->codec[i].codec_id = general_codec_list[i].ctype; snprintf(cname+len, CNAME_SIZE - len, "%s", ":hw_decoder"); - MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[0], cname, DEFAULT_VALUE); + MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_DECODER], cname, DEFAULT_VALUE); snprintf(cname+len, CNAME_SIZE - len, "%s", ":hw_encoder"); - MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[1], cname, DEFAULT_VALUE); + MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER], cname, DEFAULT_VALUE); snprintf(cname+len, CNAME_SIZE - len, "%s", ":sw_decoder"); - MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[2], cname, DEFAULT_VALUE); + MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER], cname, DEFAULT_VALUE); snprintf(cname+len, CNAME_SIZE - len, "%s", ":sw_encoder"); - MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[3], cname, DEFAULT_VALUE); + MEDIA_CODEC_INI_GET_STRING_FROM_LIST(dict, ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER], cname, DEFAULT_VALUE); } } else {/* if dict is not available just fill the structure with default value */ @@ -355,21 +355,21 @@ int mc_ini_load(mc_ini_t *ini) /* general */ snprintf(ini->port_name, sizeof(ini->port_name), "%s", DEFAULT_PORT); for (i = 0; i < ini->codec_list; i++) { - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[0].name, DEFAULT_HW_DECODER_NAME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[0].mime, DEFAULT_HW_DECODER_MIME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[0].format, DEFAULT_HW_DECODER_FORMAT); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].name, DEFAULT_HW_DECODER_NAME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].mime, DEFAULT_HW_DECODER_MIME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].format, DEFAULT_HW_DECODER_FORMAT); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[1].name, DEFAULT_HW_ENCODER_NAME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[1].mime, DEFAULT_HW_ENCODER_MIME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[1].format, DEFAULT_HW_ENCODER_FORMAT); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name, DEFAULT_HW_ENCODER_NAME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].mime, DEFAULT_HW_ENCODER_MIME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].format, DEFAULT_HW_ENCODER_FORMAT); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[2].name, DEFAULT_SW_DECODER_NAME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[2].mime, DEFAULT_SW_DECODER_MIME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[2].format, DEFAULT_SW_DECODER_FORMAT); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name, DEFAULT_SW_DECODER_NAME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].mime, DEFAULT_SW_DECODER_MIME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].format, DEFAULT_SW_DECODER_FORMAT); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[3].name, DEFAULT_SW_ENCODER_NAME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[3].mime, DEFAULT_SW_ENCODER_MIME); - MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[3].format, DEFAULT_SW_ENCODER_FORMAT); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name, DEFAULT_SW_ENCODER_NAME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].mime, DEFAULT_SW_ENCODER_MIME); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].format, DEFAULT_SW_ENCODER_FORMAT); } } @@ -388,13 +388,13 @@ int mc_ini_load(mc_ini_t *ini) int len = strlen(cname); snprintf(cname+len, CNAME_SIZE-len, "%s", ":hw_decoder"); - MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[0], cname); + MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_DECODER], cname); snprintf(cname+len, CNAME_SIZE-len, "%s", ":hw_encoder"); - MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[1], cname); + MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER], cname); snprintf(cname+len, CNAME_SIZE-len, "%s", ":sw_decoder"); - MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[2], cname); + MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER], cname); snprintf(cname+len, CNAME_SIZE-len, "%s", ":sw_encoder"); - MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[3], cname); + MEDIA_CODEC_PRINT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER], cname); } /* free dict as we got our own structure */ diff --git a/src/media_codec_port.c b/src/media_codec_port.c index 128a44a..68d5b78 100644 --- a/src/media_codec_port.c +++ b/src/media_codec_port.c @@ -840,23 +840,23 @@ void _mc_create_decoder_map_from_ini(mc_handle_t *mediacodec) int indx = 0, count = 0; int codec_list = mediacodec->ini->codec_list; for (indx = 0; indx < codec_list; indx++) { - if (strcmp(mediacodec->ini->codec[indx].codec_info[0].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].name, "")) { mediacodec->decoder_map[count].id = mediacodec->ini->codec[indx].codec_id; mediacodec->decoder_map[count].hardware = 1; /* hardware */ - mediacodec->decoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[0].name; - mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[0].mime; + mediacodec->decoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].name; + mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].mime; mediacodec->decoder_map[count].type.out_format = - _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[0].format); + _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].format); count++; } - if (strcmp(mediacodec->ini->codec[indx].codec_info[2].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name, "")) { mediacodec->decoder_map[count].id = mediacodec->ini->codec[indx].codec_id; mediacodec->decoder_map[count].hardware = 0; /* software */ - mediacodec->decoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[2].name; - mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[2].mime; + mediacodec->decoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name; + mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].mime; mediacodec->decoder_map[count].type.out_format = - _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[2].format); + _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].format); count++; } } @@ -871,23 +871,23 @@ void _mc_create_encoder_map_from_ini(mc_handle_t *mediacodec) int codec_list = mediacodec->ini->codec_list; for (indx = 0; indx < codec_list; indx++) { - if (strcmp(mediacodec->ini->codec[indx].codec_info[1].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name, "")) { mediacodec->encoder_map[count].id = mediacodec->ini->codec[indx].codec_id; mediacodec->encoder_map[count].hardware = 1; - mediacodec->encoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[1].name; - mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[1].mime; + mediacodec->encoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name; + mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].mime; mediacodec->encoder_map[count].type.out_format = - _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[1].format); + _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].format); count++; } - if (strcmp(mediacodec->ini->codec[indx].codec_info[3].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name, "")) { mediacodec->encoder_map[count].id = mediacodec->ini->codec[indx].codec_id; mediacodec->encoder_map[count].hardware = 0; - mediacodec->encoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[3].name; - mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[3].mime; + mediacodec->encoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name; + mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].mime; mediacodec->encoder_map[count].type.out_format = - _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[3].format); + _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].format); count++; } } @@ -901,25 +901,25 @@ void _mc_create_codec_map_from_ini(mc_handle_t *mediacodec, mc_codec_spec_t *spe int codec_list = mediacodec->ini->codec_list; for (indx = 0; indx < codec_list; indx++) { - if (strcmp(mediacodec->ini->codec[indx].codec_info[0].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].name, "")) { spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; count++; } - if (strcmp(mediacodec->ini->codec[indx].codec_info[1].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name, "")) { spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_HW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; count++; } - if (strcmp(mediacodec->ini->codec[indx].codec_info[2].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name, "")) { spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_SW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; count++; } - if (strcmp(mediacodec->ini->codec[indx].codec_info[3].name, "")) { + if (strcmp(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name, "")) { spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_SW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; @@ -938,25 +938,25 @@ void _mc_create_codec_map_from_ini_static(mc_ini_t *ini, mc_codec_spec_t *spec_e int codec_list = ini->codec_list; for (indx = 0; indx < codec_list; indx++) { - if (strcmp(ini->codec[indx].codec_info[0].name, "")) { + if (strcmp(ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].name, "")) { spec_emul[count].codec_id = ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; count++; } - if (strcmp(ini->codec[indx].codec_info[1].name, "")) { + if (strcmp(ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name, "")) { spec_emul[count].codec_id = ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_HW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; count++; } - if (strcmp(ini->codec[indx].codec_info[2].name, "")) { + if (strcmp(ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name, "")) { spec_emul[count].codec_id = ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_SW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; count++; } - if (strcmp(ini->codec[indx].codec_info[3].name, "")) { + if (strcmp(ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name, "")) { spec_emul[count].codec_id = ini->codec[indx].codec_id; spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_SW; spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST; -- 2.7.4 From a241cb8d823afeeccdce2d459c24c6a617e77bad Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Wed, 28 Sep 2022 14:49:54 +0900 Subject: [PATCH 08/16] Add property setting in ini - Add property name for bitrate of encoder. - Add extra properties and values. [Version] 0.6.26 [Issue Type] New feature Change-Id: Ie487df68a1105a6b5be538d7238ab96c7b16aec0 Signed-off-by: Jeongmo Yang --- include/media_codec_ini.h | 46 ++++++++++++++++++++++++++++----------- include/media_codec_port_gst.h | 1 + include/media_codec_spec_emul.h | 2 ++ packaging/capi-media-codec.spec | 2 +- src/media_codec_ini.c | 48 ++++++++++++++++++++++++++++++++--------- src/media_codec_port.c | 9 ++++++++ src/media_codec_port_gst.c | 32 +++++++++++++++++++++++---- 7 files changed, 112 insertions(+), 28 deletions(-) diff --git a/include/media_codec_ini.h b/include/media_codec_ini.h index bdf22ba..dbd7c5e 100644 --- a/include/media_codec_ini.h +++ b/include/media_codec_ini.h @@ -26,18 +26,21 @@ extern "C" { #endif -#define MEDIA_CODEC_INI_DEFAULT_PATH SYSCONFDIR"/multimedia/mmfw_media_codec.ini" -#define MEDIA_CODEC_INI_MAX_STRLEN 256 -#define MEDIA_CODEC_INI_CNAME_LEN 16 -#define DEFAULT_PORT "GST_PORT" -#define MEDIA_CODEC_MAX_CODEC_TYPE 100 - -#define MEDICODEC_INI_MAX_ELEMENT 10 -#define MEDIA_CODEC_MAX_VIDEO_CODEC 100 -#define MEDIA_CODEC_MAX_AUDIO_CODEC 100 +#define MEDIA_CODEC_INI_DEFAULT_PATH SYSCONFDIR"/multimedia/mmfw_media_codec.ini" +#define MEDIA_CODEC_INI_MAX_STRLEN 256 +#define MEDIA_CODEC_INI_STRLEN 32 +#define MEDIA_CODEC_INI_CNAME_LEN 16 +#define DEFAULT_PORT "GST_PORT" +#define MEDIA_CODEC_MAX_CODEC_TYPE 100 +#define MEDIA_CODEC_MAX_PROPERTY_EXT 5 + +#define MEDICODEC_INI_MAX_ELEMENT 10 +#define MEDIA_CODEC_MAX_VIDEO_CODEC 100 +#define MEDIA_CODEC_MAX_AUDIO_CODEC 100 typedef struct _codec_list_t codec_list_t; typedef struct _codec_info_t codec_info_t; +typedef struct _codec_property_t codec_property_t; typedef struct _codec_t codec_t; typedef struct _mc_ini_t mc_ini_t; @@ -60,10 +63,27 @@ typedef enum { MEDIA_CODEC_ROLE_MAX } codec_role; +typedef enum { + MEDIA_CODEC_INFO_NAME = 0, + MEDIA_CODEC_INFO_MIME, + MEDIA_CODEC_INFO_FORMAT, + MEDIA_CODEC_INFO_PROPERTY_BITRATE_NAME, + MEDIA_CODEC_INFO_PROPERTY_EXT_NAME, + MEDIA_CODEC_INFO_PROPERTY_EXT_VALUE +} codec_info; + +struct _codec_property_t { + gchar bitrate_name[MEDIA_CODEC_INI_STRLEN]; + gchar ext_name[MEDIA_CODEC_MAX_PROPERTY_EXT][MEDIA_CODEC_INI_STRLEN]; + gchar ext_value[MEDIA_CODEC_MAX_PROPERTY_EXT][MEDIA_CODEC_INI_STRLEN]; + gint ext_num; +}; + struct _codec_info_t { - gchar name[MEDIA_CODEC_INI_MAX_STRLEN]; - gchar mime[MEDIA_CODEC_INI_MAX_STRLEN]; - gchar format[MEDIA_CODEC_INI_MAX_STRLEN]; + gchar name[MEDIA_CODEC_INI_STRLEN]; + gchar mime[MEDIA_CODEC_INI_STRLEN]; + gchar format[MEDIA_CODEC_INI_STRLEN]; + codec_property_t property; }; struct _codec_t { @@ -80,7 +100,7 @@ struct _mc_ini_t { port_mode port_type; /* general */ gchar port_name[MEDIA_CODEC_INI_MAX_STRLEN]; - codec_t codec[MEDIA_CODEC_MAX_CODEC_TYPE]; + codec_t codec[MEDIA_CODEC_MAX_CODEC_TYPE]; }; /*Default sink ini values*/ diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index f3fe9a5..8b086e6 100644 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -135,6 +135,7 @@ struct _mc_gst_core_t { media_format_h output_fmt; mc_gst_port_t *ports[2]; mc_bitstream_t bits; + mc_codec_type_t *codec_type; mc_aqueue_t *available_queue; GQueue *output_queue; diff --git a/include/media_codec_spec_emul.h b/include/media_codec_spec_emul.h index 96bb3fb..08e0705 100644 --- a/include/media_codec_spec_emul.h +++ b/include/media_codec_spec_emul.h @@ -22,6 +22,7 @@ extern "C" { #endif #include +#include #define MEDIA_CODEC_MAX_CODEC_TYPE 100 @@ -42,6 +43,7 @@ struct _mc_codec_type_t { char *factory_name; char *mime; media_format_mimetype_e out_format; + codec_property_t *property; }; struct _mc_codec_map_t { diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 0cede0a..ce40850 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.25 +Version: 0.6.26 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_ini.c b/src/media_codec_ini.c index 0978fe3..917cc94 100644 --- a/src/media_codec_ini.c +++ b/src/media_codec_ini.c @@ -36,6 +36,7 @@ #define DEFAULT_HW_ENCODER_NAME "" #define DEFAULT_HW_ENCODER_MIME "" #define DEFAULT_HW_ENCODER_FORMAT "" +#define DEFAULT_HW_ENCODER_PROPERTY_BITRATE_NAME "bitrate" #define DEFAULT_SW_DECODER_NAME "" #define DEFAULT_SW_DECODER_MIME "" @@ -44,6 +45,7 @@ #define DEFAULT_SW_ENCODER_NAME "" #define DEFAULT_SW_ENCODER_MIME "" #define DEFAULT_SW_ENCODER_FORMAT "" +#define DEFAULT_SW_ENCODER_PROPERTY_BITRATE_NAME "bitrate" #define CNAME_SIZE 512 @@ -85,7 +87,6 @@ static void _mc_ini_check_ini_status(void); #define MEDIA_CODEC_INI_GET_STRING(x_dict, x_item, x_ini, x_default) \ do {\ const char *str = iniparser_getstring(x_dict, x_ini, x_default); \ - \ if (str && \ (strlen(str) > 0) && \ (strlen(str) < MEDIA_CODEC_INI_MAX_STRLEN)) \ @@ -102,14 +103,35 @@ do {\ const char *delimiters = " ,"; \ gchar temp_arr[MEDIA_CODEC_INI_MAX_STRLEN] = {0}; \ MEDIA_CODEC_INI_GET_STRING(x_dict, temp_arr, x_ini, x_default); \ + strncpy(x_list.property.bitrate_name, DEFAULT_HW_ENCODER_PROPERTY_BITRATE_NAME, MEDIA_CODEC_INI_STRLEN - 1); \ token = strtok_r(temp_arr, delimiters, &usr_ptr); \ while (token) {\ - if (index == 0) \ - strncpy(x_list.name, token, MEDIA_CODEC_INI_MAX_STRLEN-1);\ - else if (index == 1) \ - strncpy(x_list.mime, token, MEDIA_CODEC_INI_MAX_STRLEN-1);\ - else if (index == 2) \ - strncpy(x_list.format, token, MEDIA_CODEC_INI_MAX_STRLEN-1);\ + LOGI("index[%d], token[%s]", index, token);\ + switch (index) { \ + case MEDIA_CODEC_INFO_NAME: \ + strncpy(x_list.name, token, MEDIA_CODEC_INI_STRLEN - 1); \ + break; \ + case MEDIA_CODEC_INFO_MIME: \ + strncpy(x_list.mime, token, MEDIA_CODEC_INI_STRLEN - 1); \ + break; \ + case MEDIA_CODEC_INFO_FORMAT: \ + strncpy(x_list.format, token, MEDIA_CODEC_INI_STRLEN - 1); \ + break; \ + case MEDIA_CODEC_INFO_PROPERTY_BITRATE_NAME: \ + strncpy(x_list.property.bitrate_name, token, MEDIA_CODEC_INI_STRLEN - 1); \ + break; \ + default: \ + if (x_list.property.ext_num < MEDIA_CODEC_MAX_PROPERTY_EXT) { \ + strncpy(x_list.property.ext_name[x_list.property.ext_num], token, MEDIA_CODEC_INI_STRLEN - 1); \ + token = strtok_r(NULL, delimiters, &usr_ptr); \ + LOGI(" token[property value:%s]", token);\ + strncpy(x_list.property.ext_value[x_list.property.ext_num], token, MEDIA_CODEC_INI_STRLEN - 1); \ + x_list.property.ext_num++; \ + } else { \ + LOGW("unhandled token[%s] from ini", token); \ + } \ + break; \ + } \ index++;\ token = strtok_r(NULL, delimiters, &usr_ptr); \ } \ @@ -174,13 +196,17 @@ do {\ #define MEDIA_CODEC_GET_DEFAULT_LIST(x_list, x_default) \ do {\ - strncpy(x_list, x_default, MEDIA_CODEC_INI_MAX_STRLEN - 1);\ + strncpy(x_list, x_default, MEDIA_CODEC_INI_STRLEN - 1);\ } while (0) + #define MEDIA_CODEC_PRINT_LIST(x_list, x_message) \ do {\ - codec_info_t codec_list = x_list;\ + int prop_index = 0;\ LOGW("%s =", x_message);\ - LOGW("%s %s %s\n", codec_list.name, codec_list.mime, codec_list.format);\ + LOGW(" %s %s %s", x_list.name, x_list.mime, x_list.format);\ + LOGW(" bitrate property: %s\n", x_list.property.bitrate_name);\ + for (prop_index = 0 ; prop_index < x_list.property.ext_num ; prop_index++)\ + LOGW(" property ext: %s,%s", x_list.property.ext_name[prop_index], x_list.property.ext_value[prop_index]);\ } while (0) media_format_mimetype_e _mc_convert_media_format_str_to_int(char *sformat) @@ -362,6 +388,7 @@ int mc_ini_load(mc_ini_t *ini) MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name, DEFAULT_HW_ENCODER_NAME); MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].mime, DEFAULT_HW_ENCODER_MIME); MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].format, DEFAULT_HW_ENCODER_FORMAT); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].property.bitrate_name, DEFAULT_HW_ENCODER_PROPERTY_BITRATE_NAME); MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name, DEFAULT_SW_DECODER_NAME); MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].mime, DEFAULT_SW_DECODER_MIME); @@ -370,6 +397,7 @@ int mc_ini_load(mc_ini_t *ini) MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name, DEFAULT_SW_ENCODER_NAME); MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].mime, DEFAULT_SW_ENCODER_MIME); MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].format, DEFAULT_SW_ENCODER_FORMAT); + MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].property.bitrate_name, DEFAULT_SW_ENCODER_PROPERTY_BITRATE_NAME); } } diff --git a/src/media_codec_port.c b/src/media_codec_port.c index 68d5b78..ee24d4d 100644 --- a/src/media_codec_port.c +++ b/src/media_codec_port.c @@ -490,6 +490,11 @@ int mc_get_output(MMHandleType mediacodec, media_packet_h *outbuf, uint64_t time return MC_INVALID_ARG; } + if (!outbuf) { + LOGE("invaild outbuf buffer"); + return MC_INVALID_OUT_BUF; + } + /* setting core details */ switch (mc_handle->port_type) { case MEDIACODEC_PORT_TYPE_GENERAL: @@ -847,6 +852,7 @@ void _mc_create_decoder_map_from_ini(mc_handle_t *mediacodec) mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].mime; mediacodec->decoder_map[count].type.out_format = _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].format); + mediacodec->decoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].property; count++; } @@ -857,6 +863,7 @@ void _mc_create_decoder_map_from_ini(mc_handle_t *mediacodec) mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].mime; mediacodec->decoder_map[count].type.out_format = _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].format); + mediacodec->decoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].property; count++; } } @@ -878,6 +885,7 @@ void _mc_create_encoder_map_from_ini(mc_handle_t *mediacodec) mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].mime; mediacodec->encoder_map[count].type.out_format = _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].format); + mediacodec->encoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].property; count++; } @@ -888,6 +896,7 @@ void _mc_create_encoder_map_from_ini(mc_handle_t *mediacodec) mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].mime; mediacodec->encoder_map[count].type.out_format = _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].format); + mediacodec->encoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].property; count++; } } diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index abad009..9c3e7d7 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -1274,11 +1274,21 @@ static gpointer feed_task(gpointer data) } if (is_format_change) { - GstCaps *caps; - caps = core->mc_caps_new(core, core->codec_id, in_port_index); + int bitrate = core->video ? \ + core->ports[in_port_index]->port_def.info.video.bitrate : \ + core->ports[in_port_index]->port_def.info.audio.bitrate; + GstCaps *caps = core->mc_caps_new(core, core->codec_id, in_port_index); + g_object_set(core->appsrc, "caps", caps, NULL); gst_caps_unref(caps); + LOGD("caps updated"); + + g_object_set(core->codec, core->codec_type->property->bitrate_name, bitrate, NULL); + + LOGI("bitrate[property:%s,v:%d] %d updated", + core->codec_type->property->bitrate_name, core->video, bitrate); + is_format_change = FALSE; } @@ -1758,6 +1768,7 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) memcpy(&new_core->ports[out_port_index]->port_def.info, &mc_handle->info, sizeof(mc_handle->info)); new_core->ports[out_port_index]->port_def.coding_type = out_mime; new_core->codec_id = id; + new_core->codec_type = &codec_map[i].type; new_core->mc_caps_new = video ? &_mc_gst_vid_caps_new : &_mc_gst_aud_caps_new; new_core->bufmgr = tbm_bufmgr_init(new_core->drm_fd); @@ -1821,9 +1832,22 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) else bitrate = mc_handle->info.audio.bitrate; - LOGI("set encoder bitrate[v:%d] %d", new_core->video, bitrate); + LOGI("set encoder bitrate[property:%s,v:%d] %d", + new_core->codec_type->property->bitrate_name, new_core->video, bitrate); + + g_object_set(new_core->codec, + new_core->codec_type->property->bitrate_name, bitrate, + NULL); + } + + for (i = 0 ; i < new_core->codec_type->property->ext_num ; i++) { + LOGI("set property [%s] -> [%s]", + new_core->codec_type->property->ext_name[i], + new_core->codec_type->property->ext_value[i]); - g_object_set(new_core->codec, "bitrate", bitrate, NULL); + gst_util_set_object_arg((GObject *)new_core->codec, + new_core->codec_type->property->ext_name[i], + new_core->codec_type->property->ext_value[i]); } _mc_gst_feed_task_new(new_core); -- 2.7.4 From 47c10d42114edbc6a63f3de1bb7d3f93f32d3f75 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 25 Oct 2022 12:12:20 +0900 Subject: [PATCH 09/16] Set bitrate and properties before PLAYING [Version] 0.6.27 [Issue Type] Update Change-Id: I955d4c5c6ef6c68ab3c9a4748f84af107ad3261e Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 64 ++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index ce40850..0e19950 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.26 +Version: 0.6.27 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 9c3e7d7..eaf5f62 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -1723,7 +1723,6 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) int ret = MC_ERROR_NONE; int num_supported_codec = 0; int i = 0; - int bitrate = 0; bool video; bool encoder; bool hardware; @@ -1826,30 +1825,6 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) g_object_set(new_core->capsfilter, "caps", caps, NULL); gst_caps_unref(caps); - if (new_core->encoder) { - if (new_core->video) - bitrate = mc_handle->info.video.bitrate; - else - bitrate = mc_handle->info.audio.bitrate; - - LOGI("set encoder bitrate[property:%s,v:%d] %d", - new_core->codec_type->property->bitrate_name, new_core->video, bitrate); - - g_object_set(new_core->codec, - new_core->codec_type->property->bitrate_name, bitrate, - NULL); - } - - for (i = 0 ; i < new_core->codec_type->property->ext_num ; i++) { - LOGI("set property [%s] -> [%s]", - new_core->codec_type->property->ext_name[i], - new_core->codec_type->property->ext_value[i]); - - gst_util_set_object_arg((GObject *)new_core->codec, - new_core->codec_type->property->ext_name[i], - new_core->codec_type->property->ext_value[i]); - } - _mc_gst_feed_task_new(new_core); mc_handle->core = new_core; @@ -2120,20 +2095,22 @@ ERROR: mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) { + int i = 0; + int bitrate = 0; GstBus *bus = NULL; MEDIACODEC_FENTER(); g_mutex_lock(&core->prepare_lock); - if (core->prepare_count == 0) { + if (core->prepare_count == 0) { if (!__mc_gst_init_gstreamer()) { LOGE("gstreamer initialize fail"); g_mutex_unlock(&core->prepare_lock); return MC_NOT_INITIALIZED; } - core->codec = gst_element_factory_make(factory_name, NULL); + core->codec = gst_element_factory_make(factory_name, NULL); if (!core->codec) { LOGE("codec element create fail"); goto ERROR; @@ -2144,14 +2121,12 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) /* create common elements */ core->pipeline = gst_pipeline_new(NULL); - if (!core->pipeline) { LOGE("pipeline create fail"); goto ERROR; } core->appsrc = gst_element_factory_make("appsrc", NULL); - if (!core->appsrc) { LOGE("appsrc can't create"); goto ERROR; @@ -2189,18 +2164,17 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) } core->capsfilter = gst_element_factory_make("capsfilter", NULL); - if (!core->capsfilter) { LOGE("capsfilter can't create"); goto ERROR; } core->fakesink = gst_element_factory_make("fakesink", NULL); - if (!core->fakesink) { LOGE("fakesink create fail"); goto ERROR; } + g_object_set(core->fakesink, "enable-last-sample", FALSE, NULL); /*__mc_link_elements(core);*/ @@ -2247,11 +2221,35 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) g_object_set(GST_OBJECT(core->fakesink), "signal-handoffs", TRUE, NULL); core->signal_handoff = g_signal_connect(core->fakesink, "handoff", G_CALLBACK(__mc_gst_buffer_add), core); - /* set state PLAYING */ - MEDIACODEC_ELEMENT_SET_STATE(GST_ELEMENT_CAST(core->pipeline), GST_STATE_PLAYING); + /* set bitrate and properties */ + if (core->encoder) { + if (core->video) + bitrate = core->ports[in_port_index]->port_def.info.video.bitrate; + else + bitrate = core->ports[in_port_index]->port_def.info.audio.bitrate; + LOGI("set encoder bitrate[property:%s,v:%d] %d", + core->codec_type->property->bitrate_name, core->video, bitrate); + g_object_set(core->codec, + core->codec_type->property->bitrate_name, bitrate, + NULL); + } + + for (i = 0 ; i < core->codec_type->property->ext_num ; i++) { + LOGI("set property [%s] -> [%s]", + core->codec_type->property->ext_name[i], + core->codec_type->property->ext_value[i]); + + gst_util_set_object_arg((GObject *)core->codec, + core->codec_type->property->ext_name[i], + core->codec_type->property->ext_value[i]); + } + + /* set state PLAYING */ + MEDIACODEC_ELEMENT_SET_STATE(GST_ELEMENT_CAST(core->pipeline), GST_STATE_PLAYING); } + core->prepare_count++; g_mutex_unlock(&core->prepare_lock); -- 2.7.4 From 373a2dffd4760ed81e3dd202c03fd81cc7a126c4 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 7 Nov 2022 14:13:52 +0900 Subject: [PATCH 10/16] Remove unnecessary execute permission [Version] 0.6.27-1 [Issue Type] File permission Change-Id: I83a63cd1a2db508dae2532f54bea9f7e1b533f53 Signed-off-by: Jeongmo Yang --- AUTHORS | 0 capi-media-codec.manifest | 0 packaging/capi-media-codec.spec | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 AUTHORS mode change 100755 => 100644 capi-media-codec.manifest diff --git a/AUTHORS b/AUTHORS old mode 100755 new mode 100644 diff --git a/capi-media-codec.manifest b/capi-media-codec.manifest old mode 100755 new mode 100644 diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 0e19950..34cb0a5 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -5,7 +5,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API Version: 0.6.27 -Release: 0 +Release: 1 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz -- 2.7.4 From 6cdd0866b0bffe80390766afd7ccd5436bbbe6a1 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 24 Feb 2023 16:01:56 +0900 Subject: [PATCH 11/16] Exclude some files in gcov package [Version] 0.6.27-2 [Issue Type] gcov Change-Id: Id87eb27edcfb3d7f2b124a99ce1ed24975d6ed9c Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 34cb0a5..f2f1445 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -5,7 +5,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API Version: 0.6.27 -Release: 1 +Release: 2 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz @@ -90,7 +90,7 @@ cp test/media_codec_test %{buildroot}/usr/bin builddir=$(basename $PWD) gcno_obj_dir=%{buildroot}%{_datadir}/gcov/obj/%{name}/"$builddir" mkdir -p "$gcno_obj_dir" -find . -name '*.gcno' -exec cp --parents '{}' "$gcno_obj_dir" ';' +find . -name '*.gcno' -not -regex ".*\(test\|internal\|bitstream\|port\|ini\|util\).*$" -exec cp --parents '{}' "$gcno_obj_dir" ';' %endif -- 2.7.4 From b811105b71494347e1b58893e77b7b1561a368f2 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 27 Feb 2023 21:16:53 +0900 Subject: [PATCH 12/16] Fix coverity issue - Unused value [Version] 0.6.28 [Issue Type] Coverity Change-Id: I5bccba80ba34bb277a885da4047d728f0d7fa2f5 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 4 ++-- src/media_codec_port_gst.c | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index f2f1445..9da8792 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,8 +4,8 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.27 -Release: 2 +Version: 0.6.28 +Release: 0 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index eaf5f62..69f60ba 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -3050,7 +3050,6 @@ static void _mc_gst_set_flush_output(mc_gst_core_t *core) if (packet) { media_packet_destroy(packet); LOGD("outpacket destroyed"); - packet = NULL; } } g_mutex_unlock(&core->ports[1]->mutex); -- 2.7.4 From b36d02d266a5010573041cd996ec15e22848badd Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 7 Aug 2023 14:24:06 +0900 Subject: [PATCH 13/16] Bug fix - Invalid bitrate setting - The bitrate for video encoder can be changed to 0. [Version] 0.6.29 [Issue Type] Bug fix Change-Id: I3927f28107b159f9c1866a9f7734937ea5ae8c0d Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 9da8792..90c1480 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.28 +Version: 0.6.29 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 69f60ba..1eb6e84 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -1071,6 +1071,7 @@ static void mc_gst_port_free(mc_gst_port_t *port) gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h format) { + gint bitrate = 0; gboolean is_format_change = FALSE; mc_gst_port_def_t *input_port_def = &core->ports[in_port_index]->port_def; @@ -1078,7 +1079,6 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h format) if (core->video) { gint width = 0; gint height = 0; - gint bitrate = 0; gint framerate = 0; gchar *sformat = NULL; media_format_mimetype_e mimetype = 0; @@ -1098,13 +1098,16 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h format) } if (core->encoder) { + bitrate *= 1000; sformat = __mc_get_gst_input_format(mimetype, core->is_hw); - is_format_change |= ((input_port_def->info.video.bitrate != bitrate * 1000) && (bitrate != 0)); + is_format_change |= ((input_port_def->info.video.bitrate != bitrate) && (bitrate != 0)); is_format_change |= g_strcmp0(input_port_def->info.video.format, sformat); if (is_format_change) { - LOGD("Bitrate changed : %d -> %d", input_port_def->info.video.bitrate, bitrate); + if (bitrate != 0) { + LOGD("Bitrate changed : %d -> %d", input_port_def->info.video.bitrate, bitrate); + input_port_def->info.video.bitrate = bitrate; + } LOGD("Format changed : %s -> %s", input_port_def->info.video.format, sformat); - input_port_def->info.video.bitrate = bitrate * 1000; input_port_def->info.video.format = g_strdup(sformat); } } @@ -1112,7 +1115,6 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h format) gint channel; gint samplerate; gint bit; - gint bitrate; media_format_get_audio_info(format, NULL, &channel, &samplerate, &bit, &bitrate); @@ -1130,10 +1132,11 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h format) } if (core->encoder) { - is_format_change |= ((input_port_def->info.audio.bitrate != bitrate * 1000) && (bitrate != 0)); + bitrate *= 1000; + is_format_change |= ((input_port_def->info.audio.bitrate != bitrate) && (bitrate != 0)); if (is_format_change) { LOGD("Bitrate changed : %d -> %d", input_port_def->info.audio.bitrate, bitrate); - input_port_def->info.audio.bitrate = bitrate * 1000; + input_port_def->info.audio.bitrate = bitrate; } } } -- 2.7.4 From cc617d87d8f79bd7eada569301dea1fa042de188 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 17 Aug 2023 11:52:19 +0900 Subject: [PATCH 14/16] Bug fix for GStreamer port 1. The capsfilter element is missed for video encoder pipeline. 2. The bitrate property is set even though it's not encoder. 3. The GstMemory is not appended in GstBuffer for SW video encoder. [Version] 0.6.30 [Issue Type] Bug fix Change-Id: I41804e3bf2be48d63013c329b9684908f5c1b909 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 39 ++++++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 90c1480..664242c 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.29 +Version: 0.6.30 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 1eb6e84..5b244fe 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -317,6 +317,7 @@ static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_pa gint height; uint32_t plane_num; guint8 *planes[2]; + GstMemory *mem = NULL; mc_gst_port_def_t *port_def = &core->ports[in_port_index]->port_def; @@ -388,18 +389,23 @@ static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_pa mcbuffer->buf_size += buf_size; } } - } else { - GstMemory *mem = NULL; + mem = gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, + planes[0], mcbuffer->buf_size, 0, + mcbuffer->buf_size, mcbuffer, + (GDestroyNotify)__mc_input_buffer_finalize_cb); + } else { mem = __mc_gst_make_tbm_buffer(core, mcbuffer); - if (mem == NULL) { - LOGW("Failed to make tizen memory"); - return MC_ERROR; - } + LOGD("tizen memory[%p]", mem); + } - gst_buffer_append_memory(mcbuffer->buffer, mem); - LOGD("tizen memory appended"); + if (mem == NULL) { + LOGE("gstmemory failed[is_hw:%d]", core->is_hw); + return MC_ERROR; } + + gst_buffer_append_memory(mcbuffer->buffer, mem); + return ret; } @@ -1277,9 +1283,6 @@ static gpointer feed_task(gpointer data) } if (is_format_change) { - int bitrate = core->video ? \ - core->ports[in_port_index]->port_def.info.video.bitrate : \ - core->ports[in_port_index]->port_def.info.audio.bitrate; GstCaps *caps = core->mc_caps_new(core, core->codec_id, in_port_index); g_object_set(core->appsrc, "caps", caps, NULL); @@ -1287,10 +1290,16 @@ static gpointer feed_task(gpointer data) LOGD("caps updated"); - g_object_set(core->codec, core->codec_type->property->bitrate_name, bitrate, NULL); + if (core->encoder) { + int bitrate = core->video ? \ + core->ports[in_port_index]->port_def.info.video.bitrate : \ + core->ports[in_port_index]->port_def.info.audio.bitrate; - LOGI("bitrate[property:%s,v:%d] %d updated", - core->codec_type->property->bitrate_name, core->video, bitrate); + g_object_set(core->codec, core->codec_type->property->bitrate_name, bitrate, NULL); + + LOGI("bitrate[property:%s,v:%d] %d updated", + core->codec_type->property->bitrate_name, core->video, bitrate); + } is_format_change = FALSE; } @@ -2193,7 +2202,7 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) gst_bin_add_many(GST_BIN(core->pipeline), core->appsrc, core->capsfilter, core->codec, core->fakesink, NULL); /* link elements */ - if (!(gst_element_link_many(core->appsrc, core->codec, core->fakesink, NULL))) { + if (!(gst_element_link_many(core->appsrc, core->capsfilter, core->codec, core->fakesink, NULL))) { LOGE("gst_element_link_many is failed"); goto ERROR; } -- 2.7.4 From b3c4e45ab44796a65bb987157b39e6d5ddd4ee19 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 28 Aug 2023 18:30:12 +0900 Subject: [PATCH 15/16] Remove unnecessary capsfilter in video encoder pipeline - The capsfilter in appsrc is used for video encoder pipeline. [Version] 0.6.31 [Issue Type] Update Change-Id: Ia960f15d64622dd5edb58d40151043ff9cfffc6c Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 664242c..e45275d 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.30 +Version: 0.6.31 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 5b244fe..cf46748 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -1541,6 +1541,7 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index) { + gchar *caps_string = NULL; GstCaps *caps = NULL; mc_gst_port_def_t *port_def = &core->ports[index]->port_def; @@ -1597,6 +1598,12 @@ GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec break; } + caps_string = gst_caps_to_string(caps); + if (caps_string) { + LOGI("new caps[%s]", caps_string); + g_free(caps_string); + } + return caps; } @@ -2202,7 +2209,7 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) gst_bin_add_many(GST_BIN(core->pipeline), core->appsrc, core->capsfilter, core->codec, core->fakesink, NULL); /* link elements */ - if (!(gst_element_link_many(core->appsrc, core->capsfilter, core->codec, core->fakesink, NULL))) { + if (!(gst_element_link_many(core->appsrc, core->codec, core->fakesink, NULL))) { LOGE("gst_element_link_many is failed"); goto ERROR; } -- 2.7.4 From e7d13b9aa617aa46c669585d39075e7780427b8a Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 2 Nov 2023 11:19:15 +0900 Subject: [PATCH 16/16] Add video meta for video encoder Some encoder plugin needs video meta from GST buffer, but GST buffer from media codec did not provide video meta. This patch sets video meta to GST buffer. - Changes : Change return type for mc_caps_new()(GstCaps* to gboolean). : Add new functions for video info and meta. : Remove gst_caps_unref() in mc_gst_prepare(). gst_caps_unref() can be called although it's freed after pipeline is released all. [Version] 0.6.32 [Issue Type] Improvement Change-Id: Iefb2e17bee72a3e7a72bdf952f8c0fa2e2f98dd4 Signed-off-by: Jeongmo Yang --- include/media_codec_port_gst.h | 4 +- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 168 ++++++++++++++++++++++++++++++---------- 3 files changed, 133 insertions(+), 41 deletions(-) diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index 8b086e6..3f63bc2 100644 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -141,11 +141,13 @@ struct _mc_gst_core_t { GQueue *output_queue; GstBuffer *codec_data; - GstCaps* (*mc_caps_new)(mc_gst_core_t *, mediacodec_codec_type_e, gint); + gboolean (*mc_caps_new)(mc_gst_core_t *, mediacodec_codec_type_e, gint); GstAllocator *allocator; void* user_cb[_MEDIACODEC_EVENT_TYPE_NUM]; void* user_data[_MEDIACODEC_EVENT_TYPE_NUM]; + + GstVideoInfo *video_info; }; struct _GstMCBuffer { diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index e45275d..db7b1f7 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.31 +Version: 0.6.32 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index cf46748..2785565 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -60,6 +60,9 @@ static int __mc_set_caps_codecdata(mc_gst_core_t *core, GstMCBuffer *mcbuffer, g static void __mc_push_output_to_queue(mc_gst_core_t *core, GstMCBuffer *mcbuffer); static int __mc_gst_create_eos_packet(media_format_h fmt, GstMCBuffer *mcbuffer); static void _mc_gst_handle_input_buffer_used(mc_gst_core_t *core, media_packet_h packet); +static gboolean _mc_gst_video_info_check_and_new(mc_gst_core_t *core, GstMCBuffer *mcbuffer); +static void _mc_gst_video_info_free(mc_gst_core_t *core); +static void _mc_gst_video_meta_add(mc_gst_core_t *core, GstBuffer *buffer); static gint __gst_handle_stream_error(mc_gst_core_t *core, GError *error, GstMessage *message); static gint __gst_transform_gsterror(mc_gst_core_t *core, GstMessage *message, GError *error); @@ -85,8 +88,8 @@ static void _mc_send_eos_signal(mc_gst_core_t *core); static void _mc_wait_for_eos(mc_gst_core_t *core); static int _mc_get_mime(mc_gst_core_t *core); static int _mc_set_codec_data(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool codec_config); -GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); -GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); +static gboolean _mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); +static gboolean _mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); static int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); static int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); @@ -406,6 +409,8 @@ static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_pa gst_buffer_append_memory(mcbuffer->buffer, mem); + _mc_gst_video_meta_add(core, mcbuffer->buffer); + return ret; } @@ -1150,6 +1155,70 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h format) return is_format_change; } +static gboolean _mc_gst_video_info_check_and_new(mc_gst_core_t *core, GstMCBuffer *mcbuffer) +{ + int i = 0; + gchar *caps_str = NULL; + + if (!core || !mcbuffer) { + LOGE("NULL core[%p] or mcbuffer[%p]", core, mcbuffer); + return FALSE; + } + + if (!core->video_info) { + caps_str = gst_caps_to_string(core->caps); + + LOGI("caps[%s] to video info", caps_str); + + g_free(caps_str); + + core->video_info = gst_video_info_new_from_caps(core->caps); + if (!core->video_info) { + LOGE("video info failed"); + return FALSE; + } + + for (i = 0 ; i < GST_VIDEO_INFO_N_PLANES(core->video_info) ; i++) { + GST_VIDEO_INFO_PLANE_OFFSET(core->video_info, i) = 0; + media_packet_get_video_stride_width(mcbuffer->packet, i, &GST_VIDEO_INFO_PLANE_STRIDE(core->video_info, i)); + + LOGI("[%d] offset[%zu], stride[%d]", i, + GST_VIDEO_INFO_PLANE_OFFSET(core->video_info, i), + GST_VIDEO_INFO_PLANE_STRIDE(core->video_info, i)); + } + + LOGI("new video info[%p]", core->video_info); + } + + return TRUE; +} + +static void _mc_gst_video_info_free(mc_gst_core_t *core) +{ + if (!core) + return; + + if (core->video_info) { + LOGI("free video info[%p]", core->video_info); + gst_video_info_free(core->video_info); + core->video_info = NULL; + } +} + +static void _mc_gst_video_meta_add(mc_gst_core_t *core, GstBuffer *buffer) +{ + if (!core || !core->video_info || !buffer) + return; + + gst_buffer_add_video_meta_full(buffer, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_INFO_FORMAT(core->video_info), + GST_VIDEO_INFO_WIDTH(core->video_info), + GST_VIDEO_INFO_HEIGHT(core->video_info), + GST_VIDEO_INFO_N_PLANES(core->video_info), + core->video_info->offset, + core->video_info->stride); +} + static int _mc_set_codec_data(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool codec_config) { MEDIACODEC_FENTER(); @@ -1283,12 +1352,12 @@ static gpointer feed_task(gpointer data) } if (is_format_change) { - GstCaps *caps = core->mc_caps_new(core, core->codec_id, in_port_index); - - g_object_set(core->appsrc, "caps", caps, NULL); - gst_caps_unref(caps); + if (!core->mc_caps_new(core, core->codec_id, in_port_index)) { + LOGE("caps new failed"); + goto ERROR; + } - LOGD("caps updated"); + g_object_set(core->appsrc, "caps", core->caps, NULL); if (core->encoder) { int bitrate = core->video ? \ @@ -1385,9 +1454,10 @@ static void __mc_gst_start_feed(GstElement *pipeline, guint size, gpointer data) } } -GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index) +static gboolean _mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index) { - GstCaps *caps = NULL; + gchar *caps_string = NULL; + g_autoptr(GstCaps) caps = NULL; mc_gst_port_def_t *port_def = &core->ports[index]->port_def; caps = gst_caps_new_simple(core->mime, @@ -1414,7 +1484,7 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec case MEDIACODEC_AAC_HE_PS: if (core->encoder) { LOGD("[MC_NOT_SUPPORTED] he-aac-v12 encoder is not supported yet!!!"); - return NULL; + return FALSE; } else { gst_caps_set_simple(caps, "mpegversion", G_TYPE_INT, 4, @@ -1427,7 +1497,7 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec case MEDIACODEC_MP3: if (core->encoder) { LOGD("[MC_NOT_SUPPORTED] mp3 encoder is not supported yet!!!"); - return NULL; + return FALSE; } else { gst_caps_set_simple(caps, "framed", G_TYPE_BOOLEAN, TRUE, @@ -1454,7 +1524,7 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec case MEDIACODEC_AMR_WB: if (core->encoder) { LOGD("[MC_NOT_SUPPORTED] amr-wb encoder is not supported yet!!!"); - return NULL; + return FALSE; } else { gst_caps_set_simple(caps, "rate", G_TYPE_INT, 16000, @@ -1464,14 +1534,14 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec case MEDIACODEC_VORBIS: if (core->encoder) { LOGD("[MC_NOT_SUPPORTED] vorbis encoder is not supported yet!!!"); - return NULL; + return FALSE; } else { } break; case MEDIACODEC_FLAC: if (core->encoder) { LOGD("[MC_NOT_SUPPORTED] flac encoder is not supported yet!!!"); - return NULL; + return FALSE; } else { gst_caps_set_simple(caps, "framed", G_TYPE_BOOLEAN, TRUE, @@ -1485,7 +1555,7 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec case MEDIACODEC_WMALSL: if (core->encoder) { LOGD("[MC_NOT_SUPPORTED] wma encoder is not supported yet!!!"); - return NULL; + return FALSE; } else { /* * Need to extract from Stream Type Specific ... or @@ -1530,16 +1600,30 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec "layout", G_TYPE_STRING, "interleaved", NULL); } else { LOGD("[MC_NOT_SUPPORTED] opus decoder is not supported yet!!!"); - return NULL; + return FALSE; } break; default: break; } - return caps; + + caps_string = gst_caps_to_string(caps); + if (caps_string) { + LOGI("new caps[%p:%s]", caps, caps_string); + g_free(caps_string); + } + + if (core->caps) + gst_caps_unref(core->caps); + + _mc_gst_video_info_free(core); + + core->caps = g_steal_pointer(&caps); + + return TRUE; } -GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index) +static gboolean _mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index) { gchar *caps_string = NULL; GstCaps *caps = NULL; @@ -1600,11 +1684,17 @@ GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec caps_string = gst_caps_to_string(caps); if (caps_string) { - LOGI("new caps[%s]", caps_string); + LOGI("new caps[%p:%s]", caps, caps_string); g_free(caps_string); } - return caps; + if (core->caps) + gst_caps_unref(core->caps); + _mc_gst_video_info_free(core); + + core->caps = caps; + + return TRUE; } static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboolean encoder, gboolean is_hw) @@ -1746,7 +1836,6 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) bool encoder; bool hardware; gchar *factory_name = NULL; - GstCaps *caps = NULL; media_format_mimetype_e out_mime; mediacodec_codec_type_e id; mc_codec_map_t *codec_map; @@ -1829,20 +1918,19 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) } /* set caps in capsfilter as default*/ - caps = new_core->mc_caps_new(new_core, id, out_port_index); + if (!new_core->mc_caps_new(new_core, id, out_port_index)) { + LOGE("caps new failed"); + return MC_INTERNAL_ERROR; + } - new_core->caps = caps; /* FIXME will parse input format from ini. format is needed when linking elements*/ if (new_core->video && new_core->encoder) { - gchar *format = NULL; - - format = new_core->is_hw ? "SN12" : "I420"; - gst_caps_set_simple(caps, - "format", G_TYPE_STRING, format, + gst_caps_set_simple(new_core->caps, + "format", G_TYPE_STRING, (new_core->is_hw ? "SN12" : "I420"), NULL); } - g_object_set(new_core->capsfilter, "caps", caps, NULL); - gst_caps_unref(caps); + + g_object_set(new_core->capsfilter, "caps", new_core->caps, NULL); _mc_gst_feed_task_new(new_core); @@ -1880,6 +1968,8 @@ mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle) _mc_gst_set_flush_input(core); + _mc_gst_video_info_free(core); + ret = _mc_gst_destroy_pipeline(core); /* unset callback */ @@ -2155,14 +2245,14 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) core->audioconvert = gst_element_factory_make("audioconvert", NULL); if (!core->audioconvert) { - LOGE("capsfilter can't create"); + LOGE("audioconvert can't create"); goto ERROR; } core->audioresample = gst_element_factory_make("audioresample", NULL); if (!core->audioresample) { - LOGE("capsfilter can't create"); + LOGE("audioresample can't create"); goto ERROR; } } @@ -2340,6 +2430,7 @@ mc_ret_e _mc_gst_destroy_pipeline(mc_gst_core_t *core) MEDIACODEC_ELEMENT_SET_STATE(core->pipeline, GST_STATE_NULL); gst_object_unref(GST_OBJECT(core->pipeline)); + if (core->caps) { gst_caps_unref(core->caps); core->caps = NULL; @@ -2776,7 +2867,6 @@ static GstMemory *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, GstMCBuffer *mcb { int ret = MEDIA_PACKET_ERROR_NONE; tbm_surface_h surface = NULL; - GstVideoInfo vinfo; GstMemory *mem = NULL; if (!mcbuffer->packet) { @@ -2784,19 +2874,19 @@ static GstMemory *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, GstMCBuffer *mcb return NULL; } - ret = media_packet_get_tbm_surface(mcbuffer->packet, &surface); - if (ret != MEDIA_PACKET_ERROR_NONE) { - LOGE("Failed to get tbm surface"); + if (!_mc_gst_video_info_check_and_new(core, mcbuffer)) { + LOGE("video info failed"); return NULL; } - if (!gst_video_info_from_caps(&vinfo, core->caps)) { - LOGE("Failed to get video info"); + ret = media_packet_get_tbm_surface(mcbuffer->packet, &surface); + if (ret != MEDIA_PACKET_ERROR_NONE) { + LOGE("Failed to get tbm surface"); return NULL; } mem = gst_tizen_allocator_alloc_surface(core->allocator, - &vinfo, surface, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb); + core->video_info, surface, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb); return mem; } -- 2.7.4