diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2013-09-12 12:03:45 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2013-09-12 14:14:03 +0200 |
commit | b15177645bf8d4cb2e3850e34f122ffa34911f7c (patch) | |
tree | a4985a0bc4c187d8e9969f3d96d56814e9c6f356 /gst/rawparse | |
parent | 2b94641a421f1aba8c451e718854402b404fe617 (diff) | |
download | gstreamer-plugins-bad-b15177645bf8d4cb2e3850e34f122ffa34911f7c.tar.gz |
rawparse: fix event order
Delay forwarding the segment event until we pushed caps.
Send STREAM_START in pull mode.
Diffstat (limited to 'gst/rawparse')
-rw-r--r-- | gst/rawparse/gstrawparse.c | 29 | ||||
-rw-r--r-- | gst/rawparse/gstrawparse.h | 1 |
2 files changed, 29 insertions, 1 deletions
diff --git a/gst/rawparse/gstrawparse.c b/gst/rawparse/gstrawparse.c index 38e85e8b8..afefd4a88 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 7d2b3a1bf..f62bb989b 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 |