* 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);
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();
{
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);
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);
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;
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();
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);