send = malloc(sizeof (Emotion_Gstreamer_Message));
if (!send) return NULL;
+ ev->out++;
send->ev = ev;
send->msg = gst_message_ref(msg);
void
emotion_gstreamer_message_free(Emotion_Gstreamer_Message *send)
{
+ send->ev->in++;
+
+ if (send->ev->in == send->ev->out && send->ev->delete_me)
+ em_shutdown(send->ev);
+
gst_message_unref(send->msg);
free(send);
}
void **emotion_video,
Emotion_Module_Options *opt);
-static int em_shutdown (void *video);
-
static unsigned char em_file_open (const char *file,
Evas_Object *obj,
void *video);
ev->vis = EMOTION_VIS_NONE;
ev->volume = 0.8;
ev->play_started = 0;
+ ev->delete_me = EINA_FALSE;
*emotion_video = ev;
return 0;
}
-static int
+int
em_shutdown(void *video)
{
Emotion_Gstreamer_Video *ev;
ev->thread = NULL;
}
+ if (ev->in != ev->out)
+ {
+ ev->delete_me = EINA_TRUE;
+ return 1;
+ }
+
if (ev->eos_bus)
{
gst_object_unref(GST_OBJECT(ev->eos_bus));
ev = send->ev;
msg = send->msg;
- if (ev->play_started)
+ if (ev->play_started && !ev->delete_me)
{
_emotion_playback_started(ev->obj);
ev->play_started = 0;
break;
}
case GST_MESSAGE_EOS:
- ev->play = 0;
- _emotion_decode_stop(ev->obj);
- _emotion_playback_finished(ev->obj);
+ if (!ev->delete_me)
+ {
+ ev->play = 0;
+ _emotion_decode_stop(ev->obj);
+ _emotion_playback_finished(ev->obj);
+ }
break;
case GST_MESSAGE_TAG:
- {
- GstTagList *new_tags;
- gst_message_parse_tag(msg, &new_tags);
- if (new_tags)
- {
- gst_tag_list_foreach(new_tags,
- (GstTagForeachFunc)_for_each_tag,
- ev);
- gst_tag_list_free(new_tags);
- }
- break;
- }
+ if (!ev->delete_me)
+ {
+ GstTagList *new_tags;
+ gst_message_parse_tag(msg, &new_tags);
+ if (new_tags)
+ {
+ gst_tag_list_foreach(new_tags,
+ (GstTagForeachFunc)_for_each_tag,
+ ev);
+ gst_tag_list_free(new_tags);
+ }
+ }
+ break;
case GST_MESSAGE_ASYNC_DONE:
- _emotion_seek_done(ev->obj);
+ if (!ev->delete_me) _emotion_seek_done(ev->obj);
break;
default:
ERR("bus say: %s [%i]",
Emotion_Vis vis;
+ int in;
+ int out;
+
Eina_Bool play : 1;
Eina_Bool play_started : 1;
Eina_Bool video_mute : 1;
Eina_Bool audio_mute : 1;
Eina_Bool pipeline_parsed : 1;
+ Eina_Bool delete_me : 1;
};
struct _EvasVideoSink {
Eina_Bool _emotion_gstreamer_video_pipeline_parse(Emotion_Gstreamer_Video *ev,
Eina_Bool force);
+int em_shutdown(void *video);
+
#endif /* __EMOTION_GSTREAMER_H__ */