From 01389b1d00da898a48c89355877308e9a2561f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 12 Jan 2014 19:18:37 +0100 Subject: [PATCH] emotion gstreamer1: Use refcounting instead of in/out variable counting --- .../emotion/gstreamer1/emotion_alloc.c | 12 +---- .../emotion/gstreamer1/emotion_gstreamer.c | 45 +++++++++++-------- .../emotion/gstreamer1/emotion_gstreamer.h | 10 +++-- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/modules/emotion/gstreamer1/emotion_alloc.c b/src/modules/emotion/gstreamer1/emotion_alloc.c index 6b8339d987..ea85e6cc4a 100644 --- a/src/modules/emotion/gstreamer1/emotion_alloc.c +++ b/src/modules/emotion/gstreamer1/emotion_alloc.c @@ -48,9 +48,7 @@ emotion_gstreamer_message_alloc(Emotion_Gstreamer *ev, send = malloc(sizeof (Emotion_Gstreamer_Message)); if (!send) return NULL; - ev->out++; - - send->ev = ev; + send->ev = emotion_gstreamer_ref(ev); send->msg = gst_message_ref(msg); return send; @@ -59,13 +57,7 @@ emotion_gstreamer_message_alloc(Emotion_Gstreamer *ev, void emotion_gstreamer_message_free(Emotion_Gstreamer_Message *send) { - send->ev->in++; - - if (send->ev->in == send->ev->out - && send->ev->threads == NULL - && send->ev->shutdown) - send->ev->api->del(send->ev); - + emotion_gstreamer_unref(send->ev); gst_message_unref(send->msg); free(send); } diff --git a/src/modules/emotion/gstreamer1/emotion_gstreamer.c b/src/modules/emotion/gstreamer1/emotion_gstreamer.c index 9ae04cdc43..7133ffa977 100644 --- a/src/modules/emotion/gstreamer1/emotion_gstreamer.c +++ b/src/modules/emotion/gstreamer1/emotion_gstreamer.c @@ -71,6 +71,13 @@ emotion_visualization_element_name_get(Emotion_Vis visualisation) } } +Emotion_Gstreamer * +emotion_gstreamer_ref(Emotion_Gstreamer *ev) +{ + g_atomic_int_inc (&ev->ref_count); + return ev; +} + static void em_cleanup(Emotion_Gstreamer *ev) { @@ -91,6 +98,17 @@ em_cleanup(Emotion_Gstreamer *ev) } } +void +emotion_gstreamer_unref(Emotion_Gstreamer *ev) +{ + if (g_atomic_int_dec_and_test(&ev->ref_count)) + { + em_cleanup(ev); + + free(ev); + } +} + static void em_del(void *video) { @@ -103,19 +121,11 @@ em_del(void *video) EINA_LIST_FREE(ev->threads, t) ecore_thread_cancel(t); - ev->shutdown = EINA_TRUE; - return; } - if (ev->in != ev->out) - { - ev->shutdown = EINA_TRUE; - return; - } + ev->shutdown = EINA_TRUE; - em_cleanup(ev); - - free(ev); + emotion_gstreamer_unref(ev); } static Eina_Bool @@ -1024,6 +1034,8 @@ em_add(const Emotion_Engine *api, ev->api = api; ev->obj = obj; + + ev->ref_count = 1; /* Default values */ ev->vis = EMOTION_VIS_NONE; @@ -1365,8 +1377,8 @@ _bus_main_handler(void *data) ev); gst_tag_list_free(new_tags); } - break; } + break; case GST_MESSAGE_ASYNC_DONE: _emotion_seek_done(ev->obj); break; @@ -1603,8 +1615,7 @@ _emotion_gstreamer_cancel(void *data, Ecore_Thread *thread) if (getenv("EMOTION_GSTREAMER_DOT")) GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(ev->pipeline), GST_DEBUG_GRAPH_SHOW_ALL, getenv("EMOTION_GSTREAMER_DOT")); } - if (ev->in == ev->out && ev->shutdown) - ev->api->del(ev); + emotion_gstreamer_unref(ev); } static void @@ -1626,10 +1637,8 @@ _emotion_gstreamer_end(void *data, Ecore_Thread *thread) if (getenv("EMOTION_GSTREAMER_DOT")) GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(ev->pipeline), GST_DEBUG_GRAPH_SHOW_ALL, getenv("EMOTION_GSTREAMER_DOT")); } - if (ev->in == ev->out && ev->shutdown) - ev->api->del(ev); - else - _emotion_gstreamer_video_pipeline_parse(data, EINA_TRUE); + _emotion_gstreamer_video_pipeline_parse(data, EINA_TRUE); + emotion_gstreamer_unref(ev); } static GstElement * @@ -1676,7 +1685,7 @@ _create_pipeline (Emotion_Gstreamer *ev, ecore_thread_run(_emotion_gstreamer_pause, _emotion_gstreamer_end, _emotion_gstreamer_cancel, - ev)); + emotion_gstreamer_ref(ev))); /** NOTE: you need to set: GST_DEBUG_DUMP_DOT_DIR=/tmp EMOTION_ENGINE=gstreamer to save the $EMOTION_GSTREAMER_DOT file in '/tmp' */ /** then call dot -Tpng -oemotion_pipeline.png /tmp/$TIMESTAMP-$EMOTION_GSTREAMER_DOT.dot */ diff --git a/src/modules/emotion/gstreamer1/emotion_gstreamer.h b/src/modules/emotion/gstreamer1/emotion_gstreamer.h index 85e4d4f04f..cd4f05805d 100644 --- a/src/modules/emotion/gstreamer1/emotion_gstreamer.h +++ b/src/modules/emotion/gstreamer1/emotion_gstreamer.h @@ -49,6 +49,8 @@ struct _Emotion_Gstreamer { const Emotion_Engine *api; + volatile int ref_count; + /* Gstreamer elements */ GstElement *pipeline; GstElement *vsink; @@ -64,9 +66,6 @@ struct _Emotion_Gstreamer Emotion_Gstreamer_Metadata *metadata; - int in; - int out; - Emotion_Vis vis; Eina_Bool play : 1; @@ -74,7 +73,7 @@ struct _Emotion_Gstreamer Eina_Bool audio_mute : 1; Eina_Bool play_started : 1; Eina_Bool pipeline_parsed : 1; - Eina_Bool shutdown : 1; + Eina_Bool shutdown : 1; }; struct _EmotionVideoSink { @@ -204,6 +203,9 @@ Emotion_Gstreamer_Message *emotion_gstreamer_message_alloc(Emotion_Gstreamer *ev GstMessage *msg); void emotion_gstreamer_message_free(Emotion_Gstreamer_Message *send); +Emotion_Gstreamer * emotion_gstreamer_ref (Emotion_Gstreamer *ev); +void emotion_gstreamer_unref (Emotion_Gstreamer *ev); + typedef struct _ColorSpace_Format_Convertion ColorSpace_Format_Convertion; struct _ColorSpace_Format_Convertion