From b15177645bf8d4cb2e3850e34f122ffa34911f7c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 12 Sep 2013 12:03:45 +0200 Subject: [PATCH] rawparse: fix event order Delay forwarding the segment event until we pushed caps. Send STREAM_START in pull mode. --- gst/rawparse/gstrawparse.c | 29 ++++++++++++++++++++++++++++- gst/rawparse/gstrawparse.h | 1 + 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gst/rawparse/gstrawparse.c b/gst/rawparse/gstrawparse.c index 38e85e8..afefd4a 100644 --- a/gst/rawparse/gstrawparse.c +++ b/gst/rawparse/gstrawparse.c @@ -301,6 +301,12 @@ gst_raw_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) if (!gst_raw_parse_set_src_caps (rp)) goto no_caps; + if (rp->start_segment) { + GST_DEBUG_OBJECT (rp, "sending start segment"); + gst_pad_push_event (rp->srcpad, rp->start_segment); + rp->start_segment = NULL; + } + gst_adapter_push (rp->adapter, buffer); if (rp_class->multiple_frames_per_buffer) { @@ -339,6 +345,22 @@ gst_raw_parse_loop (GstElement * element) GstBuffer *buffer; gint size; + if (G_UNLIKELY (rp->push_stream_start)) { + gchar *stream_id; + GstEvent *event; + + stream_id = + gst_pad_create_stream_id (rp->srcpad, GST_ELEMENT_CAST (rp), NULL); + + event = gst_event_new_stream_start (stream_id); + gst_event_set_group_id (event, gst_util_group_id_next ()); + + GST_DEBUG_OBJECT (rp, "Pushing STREAM_START"); + gst_pad_push_event (rp->srcpad, event); + rp->push_stream_start = FALSE; + g_free (stream_id); + } + if (!gst_raw_parse_set_src_caps (rp)) goto no_caps; @@ -505,6 +527,8 @@ gst_raw_parse_sink_activatemode (GstPad * sinkpad, GstObject * parent, } rp->segment.duration = duration; + rp->push_stream_start = TRUE; + result = gst_raw_parse_handle_seek_pull (rp, NULL); rp->mode = mode; } else { @@ -693,7 +717,10 @@ gst_raw_parse_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_segment_copy_into (&segment, &rp->segment); - ret = gst_pad_push_event (rp->srcpad, event); + if (rp->start_segment) + gst_event_unref (rp->start_segment); + rp->start_segment = event; + ret = TRUE; break; } default: diff --git a/gst/rawparse/gstrawparse.h b/gst/rawparse/gstrawparse.h index 7d2b3a1..f62bb98 100644 --- a/gst/rawparse/gstrawparse.h +++ b/gst/rawparse/gstrawparse.h @@ -69,6 +69,7 @@ struct _GstRawParse GstEvent *start_segment; gboolean negotiated; + gboolean push_stream_start; }; struct _GstRawParseClass -- 2.7.4