forked from enlightenment/efl
emotion gstreamer1: Use refcounting instead of in/out variable counting
This commit is contained in:
parent
85b17ff7c1
commit
01389b1d00
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue