Release feed task thread before destroy pipeline 34/275134/2 accepted/tizen/unified/20220525.134541 submit/tizen/20220524.122628
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 17 May 2022 06:12:40 +0000 (15:12 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 17 May 2022 06:45:33 +0000 (15:45 +0900)
- 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 <jm80.yang@samsung.com>
packaging/capi-media-codec.spec
src/media_codec_port_gst.c

index f403b36..8d11131 100644 (file)
@@ -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
index 2746bec..68e9c5e 100644 (file)
@@ -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);