mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-21 18:04:00 +00:00
assrender: Implement srcpad event functions for seeking and correct event forwarding
Copied from textoverlay.
This commit is contained in:
parent
830187fc0d
commit
44aba00375
1 changed files with 52 additions and 0 deletions
|
@ -105,6 +105,7 @@ static GstFlowReturn gst_ass_render_chain_text (GstPad * pad, GstBuffer * buf);
|
||||||
|
|
||||||
static gboolean gst_ass_render_event_video (GstPad * pad, GstEvent * event);
|
static gboolean gst_ass_render_event_video (GstPad * pad, GstEvent * event);
|
||||||
static gboolean gst_ass_render_event_text (GstPad * pad, GstEvent * event);
|
static gboolean gst_ass_render_event_text (GstPad * pad, GstEvent * event);
|
||||||
|
static gboolean gst_ass_render_event_src (GstPad * pad, GstEvent * event);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_ass_render_base_init (gpointer gclass)
|
gst_ass_render_base_init (gpointer gclass)
|
||||||
|
@ -199,6 +200,8 @@ gst_ass_render_init (GstAssRender * render, GstAssRenderClass * gclass)
|
||||||
GST_DEBUG_FUNCPTR (gst_ass_render_event_video));
|
GST_DEBUG_FUNCPTR (gst_ass_render_event_video));
|
||||||
gst_pad_set_event_function (render->text_sinkpad,
|
gst_pad_set_event_function (render->text_sinkpad,
|
||||||
GST_DEBUG_FUNCPTR (gst_ass_render_event_text));
|
GST_DEBUG_FUNCPTR (gst_ass_render_event_text));
|
||||||
|
gst_pad_set_event_function (render->srcpad,
|
||||||
|
GST_DEBUG_FUNCPTR (gst_ass_render_event_src));
|
||||||
|
|
||||||
gst_element_add_pad (GST_ELEMENT (render), render->srcpad);
|
gst_element_add_pad (GST_ELEMENT (render), render->srcpad);
|
||||||
gst_element_add_pad (GST_ELEMENT (render), render->video_sinkpad);
|
gst_element_add_pad (GST_ELEMENT (render), render->video_sinkpad);
|
||||||
|
@ -349,6 +352,55 @@ gst_ass_render_change_state (GstElement * element, GstStateChange transition)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_ass_render_event_src (GstPad * pad, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad));
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
|
||||||
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
|
case GST_EVENT_SEEK:{
|
||||||
|
GstSeekFlags flags;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (render, "seek received, driving from here");
|
||||||
|
|
||||||
|
gst_event_parse_seek (event, NULL, NULL, &flags, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
/* Flush downstream, only for flushing seek */
|
||||||
|
if (flags & GST_SEEK_FLAG_FLUSH)
|
||||||
|
gst_pad_push_event (render->srcpad, gst_event_new_flush_start ());
|
||||||
|
|
||||||
|
/* Mark subtitle as flushing, unblocks chains */
|
||||||
|
g_mutex_lock (render->subtitle_mutex);
|
||||||
|
if (render->subtitle_pending)
|
||||||
|
gst_buffer_unref (render->subtitle_pending);
|
||||||
|
render->subtitle_pending = NULL;
|
||||||
|
render->subtitle_flushing = TRUE;
|
||||||
|
g_cond_signal (render->subtitle_cond);
|
||||||
|
g_mutex_unlock (render->subtitle_mutex);
|
||||||
|
|
||||||
|
/* Seek on each sink pad */
|
||||||
|
gst_event_ref (event);
|
||||||
|
ret = gst_pad_push_event (render->video_sinkpad, event);
|
||||||
|
if (ret) {
|
||||||
|
ret = gst_pad_push_event (render->text_sinkpad, event);
|
||||||
|
} else {
|
||||||
|
gst_event_unref (event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
gst_event_ref (event);
|
||||||
|
ret = gst_pad_push_event (render->video_sinkpad, event);
|
||||||
|
gst_pad_push_event (render->text_sinkpad, event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_object_unref (render);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_ass_render_getcaps (GstPad * pad)
|
gst_ass_render_getcaps (GstPad * pad)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue