From b84c4296ec0c195202684e5ecec8cda488bc50a6 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 6 Jul 2021 17:01:12 +0900 Subject: [PATCH 01/16] Fix coverity issue - Unchecked return value [Version] 0.6.18 [Issue Type] Coverity Change-Id: I335336489d9e0781c47541b4fa13ca71c1980083 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index db1277c..1c1d0ba 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.17 +Version: 0.6.18 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 6465c59..9455e22 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2474,26 +2474,24 @@ GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) void *data = NULL; gint size = 0; - - mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(*mcbuffer)); - - if (mcbuffer == NULL) { - LOGE("malloc fail"); - return NULL; - } - mem = gst_buffer_peek_memory(buffer, 0); if (gst_is_tizen_memory(mem)) { data = (void *)gst_tizen_memory_get_surface(mem); size = tbm_surface_internal_get_size((tbm_surface_h)data); } else { - gst_memory_map(mem, &map, GST_MAP_READ); + if (!gst_memory_map(mem, &map, GST_MAP_READ)) { + LOGE("gst_memory_map failed for buffer[%p]", buffer); + return NULL; + } + data = map.data; size = map.size; gst_memory_unmap(mem, &map); } + mcbuffer = g_new0(GstMCBuffer, 1); + mcbuffer->buffer = buffer; mcbuffer->core = core; mcbuffer->buf_size = size; -- 2.7.4 From 8233b50d75531b6d52b1488d0d6b12cb41eea6a6 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 6 Jul 2021 17:42:35 +0900 Subject: [PATCH 02/16] Replace g_malloc0 by g_new0 for GstMCBuffer allocation [Version] 0.6.19 [Issue Type] Update Change-Id: I01ba8151a8c7613f6eb7c93ac3df6ed378e58be1 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 1c1d0ba..8280257 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.18 +Version: 0.6.19 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 9455e22..8b17f7f 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2572,7 +2572,7 @@ gboolean __mc_gst_bus_callback(GstBus *bus, GstMessage *msg, gpointer data) case GST_MESSAGE_EOS: _mc_send_eos_signal(core); - mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(GstMCBuffer)); + mcbuffer = g_new0(GstMCBuffer, 1); if (__mc_gst_create_eos_packet(core->output_fmt, mcbuffer) == MC_ERROR_NONE) { __mc_push_output_to_queue(core, mcbuffer); LOGD("send eos packet."); @@ -2747,12 +2747,7 @@ static GstMCBuffer *gst_mediacodec_buffer_new(mc_gst_core_t *core, media_packet_ { GstMCBuffer *mcbuffer = NULL; - mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(GstMCBuffer)); - - if (mcbuffer == NULL) { - LOGE("malloc fail"); - return NULL; - } + mcbuffer = g_new0(GstMCBuffer, 1); mcbuffer->buffer = gst_buffer_new(); mcbuffer->buf_size = 0; -- 2.7.4 From 25fa26af9689eb4f9841a59b75780bd09421d225 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 6 Jul 2021 17:48:41 +0900 Subject: [PATCH 03/16] Fix memory leak [Version] 0.6.20 [Issue Type] Bug fix Change-Id: Ib41d5dc91e9478fa6a2fd8ac704998f0c2f8bc4c Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 8280257..cf5fbf3 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.19 +Version: 0.6.20 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 8b17f7f..110003f 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2499,6 +2499,7 @@ GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) ret = __mc_fill_output_buffer(core, data, mcbuffer->buf_size, mcbuffer); if (ret != MC_ERROR_NONE) { LOGW("failed to fill outbuf: %s (ox%08x)", _mc_error_to_string(ret), ret); + g_free(mcbuffer); return NULL; } -- 2.7.4 From 1cd52c840d97f70705725470e7f8ea28baf28a23 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 2 Aug 2021 18:16:39 +0900 Subject: [PATCH 04/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 05/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 06/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 07/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 08/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 09/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 10/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 11/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 12/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 13/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 14/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 15/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 16/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