pad-monitor: first buffer checks
authorThiago Santos <thiago.sousa.santos@collabora.com>
Wed, 17 Jul 2013 02:19:13 +0000 (23:19 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Wed, 17 Jul 2013 02:19:13 +0000 (23:19 -0300)
Check that a newsegment is received before the first buffer and that
the first buffer running time is 0

validate/gst/qa/gst-qa-pad-monitor.c
validate/gst/qa/gst-qa-pad-monitor.h

index d7fb81b..6dc656c 100644 (file)
@@ -105,6 +105,7 @@ static void
 gst_qa_pad_monitor_init (GstQaPadMonitor * pad_monitor)
 {
   gst_segment_init (&pad_monitor->segment, GST_FORMAT_BYTES);
+  pad_monitor->first_buffer = TRUE;
 }
 
 /**
@@ -126,6 +127,28 @@ gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner,
   return monitor;
 }
 
+static void
+gst_qa_pad_monitor_check_first_buffer (GstQaPadMonitor * pad_monitor,
+    GstBuffer * buffer)
+{
+  if (G_UNLIKELY (pad_monitor->first_buffer)) {
+    pad_monitor->first_buffer = FALSE;
+
+    if (!pad_monitor->has_segment) {
+      GST_QA_MONITOR_REPORT_WARNING (pad_monitor, EVENT, EXPECTED,
+          "Received buffer before Segment event");
+    }
+    if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))) {
+      gint64 running_time = gst_segment_to_running_time (&pad_monitor->segment,
+          pad_monitor->segment.format, GST_BUFFER_TIMESTAMP (buffer));
+      if (running_time != 0) {
+        GST_QA_MONITOR_REPORT_WARNING (pad_monitor, BUFFER, TIMESTAMP,
+            "First buffer running time is not 0");
+      }
+    }
+  }
+}
+
 static gboolean
 gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor,
     GstEvent * event, GstPadEventFunction handler)
@@ -348,6 +371,9 @@ gst_qa_pad_monitor_chain_func (GstPad * pad, GstBuffer * buffer)
   GstQaPadMonitor *pad_monitor =
       g_object_get_data ((GObject *) pad, "qa-monitor");
   GstFlowReturn ret;
+
+  gst_qa_pad_monitor_check_first_buffer (pad_monitor, buffer);
+
   ret = pad_monitor->chain_func (pad, buffer);
   return ret;
 }
@@ -410,6 +436,8 @@ gst_qa_pad_monitor_buffer_probe (GstPad * pad, GstBuffer * buffer,
 {
   GstQaPadMonitor *monitor = udata;
 
+  gst_qa_pad_monitor_check_first_buffer (monitor, buffer);
+
   /* TODO should we assume that a pad-monitor should always have an
    * element-monitor as a parent? */
   if (G_LIKELY (GST_QA_MONITOR_GET_PARENT (monitor))) {
index 9f256ab..114c9a4 100644 (file)
@@ -70,6 +70,8 @@ struct _GstQaPadMonitor {
   gulong event_probe_id;
 
   /*< private >*/
+  gboolean first_buffer;
+
   gboolean has_segment;
   GstSegment segment;