monoscope: Forward the SEGMENT event from the chain function

Otherwise we'll break the event order and forward the SEGMENT event
before sending a CAPS event.
diff --git a/gst/monoscope/gstmonoscope.c b/gst/monoscope/gstmonoscope.c
index 0cbde74..e06196b 100644
--- a/gst/monoscope/gstmonoscope.c
+++ b/gst/monoscope/gstmonoscope.c
@@ -163,6 +163,7 @@
 
   gst_adapter_clear (monoscope->adapter);
   gst_segment_init (&monoscope->segment, GST_FORMAT_UNDEFINED);
+  monoscope->segment_pending = FALSE;
 
   GST_OBJECT_LOCK (monoscope);
   monoscope->proportion = 1.0;
@@ -345,6 +346,12 @@
     goto out;
   }
 
+  if (monoscope->segment_pending) {
+    gst_pad_push_event (monoscope->srcpad,
+        gst_event_new_segment (&monoscope->segment));
+    monoscope->segment_pending = FALSE;
+  }
+
   /* don't try to combine samples from discont buffer */
   if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_DISCONT)) {
     gst_adapter_clear (monoscope->adapter);
@@ -470,7 +477,12 @@
        * we can do QoS */
       gst_event_copy_segment (event, &monoscope->segment);
 
-      res = gst_pad_push_event (monoscope->srcpad, event);
+      /* We forward the event from the chain function after caps are
+       * negotiated. Otherwise we would potentially break the event order and
+       * send the segment event before the caps event */
+      monoscope->segment_pending = TRUE;
+      gst_event_unref (event);
+      res = TRUE;
       break;
     }
     case GST_EVENT_CAPS:
diff --git a/gst/monoscope/gstmonoscope.h b/gst/monoscope/gstmonoscope.h
index b66a6d2..da23327 100644
--- a/gst/monoscope/gstmonoscope.h
+++ b/gst/monoscope/gstmonoscope.h
@@ -54,6 +54,7 @@
   GstBufferPool *pool;
 
   GstSegment   segment;
+  gboolean     segment_pending;
 
   /* QoS stuff *//* with LOCK */
   gdouble      proportion;