summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2013-09-12 12:03:45 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2013-09-12 14:14:03 +0200
commitb15177645bf8d4cb2e3850e34f122ffa34911f7c (patch)
treea4985a0bc4c187d8e9969f3d96d56814e9c6f356
parent2b94641a421f1aba8c451e718854402b404fe617 (diff)
downloadgstreamer-plugins-bad-b15177645bf8d4cb2e3850e34f122ffa34911f7c.tar.gz
rawparse: fix event order
Delay forwarding the segment event until we pushed caps. Send STREAM_START in pull mode.
-rw-r--r--gst/rawparse/gstrawparse.c29
-rw-r--r--gst/rawparse/gstrawparse.h1
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