slomo pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=01389b1d00da898a48c89355877308e9a2561f87

commit 01389b1d00da898a48c89355877308e9a2561f87
Author: Sebastian Dröge <[email protected]>
Date:   Sun Jan 12 19:18:37 2014 +0100

    emotion gstreamer1: Use refcounting instead of in/out variable counting
---
 src/modules/emotion/gstreamer1/emotion_alloc.c     | 12 +-----
 src/modules/emotion/gstreamer1/emotion_gstreamer.c | 45 +++++++++++++---------
 src/modules/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 6b8339d..ea85e6c 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 9ae04cd..7133ffa 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;
      }
 
-   em_cleanup(ev);
+   ev->shutdown = EINA_TRUE;
 
-   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 85e4d4f..cd4f058 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

-- 


Reply via email to