rawparse: fix event order

Delay forwarding the segment event until we pushed caps.
Send STREAM_START in pull mode.
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 @@
   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 @@
   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 @@
         }
         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_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 @@
   GstEvent *start_segment;
 
   gboolean negotiated;
+  gboolean push_stream_start;
 };
 
 struct _GstRawParseClass