From 4dc3f5171eb6fb16b2c52151a0188300c3a7fdb3 Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Mon, 25 Nov 2013 13:55:10 +0000 Subject: [PATCH] validate-scenario: only use valid position/duration Position/duration query may fail, or yield unknown values (eg, unknown duration for live streams). In these cases, we must ensure we do not use those invalid values. https://bugzilla.gnome.org/show_bug.cgi?id=715160 --- validate/gst/validate/gst-validate-scenario.c | 28 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/validate/gst/validate/gst-validate-scenario.c b/validate/gst/validate/gst-validate-scenario.c index 3eecace..6b2cb73 100644 --- a/validate/gst/validate/gst-validate-scenario.c +++ b/validate/gst/validate/gst-validate-scenario.c @@ -649,7 +649,7 @@ get_position (GstValidateScenario * scenario) GstValidateAction *act = NULL; gint64 start_with_tolerance, stop_with_tolerance; gint64 position, duration; - GstFormat format = GST_FORMAT_TIME; + gboolean has_pos, has_dur; GstValidateScenarioPrivate *priv = scenario->priv; GstElement *pipeline = scenario->pipeline; @@ -671,20 +671,28 @@ get_position (GstValidateScenario * scenario) gst_query_unref (query); if (scenario->priv->actions) act = scenario->priv->actions->data; - gst_element_query_position (pipeline, format, &position); - - format = GST_FORMAT_TIME; - gst_element_query_duration (pipeline, format, &duration); - if (position > duration) { - GST_VALIDATE_REPORT (scenario, - QUERY_POSITION_SUPERIOR_DURATION, - "Reported position %" GST_TIME_FORMAT " > reported duration %" - GST_TIME_FORMAT, GST_TIME_ARGS (position), GST_TIME_ARGS (duration)); + has_pos = gst_element_query_position (pipeline, GST_FORMAT_TIME, &position) + && GST_CLOCK_TIME_IS_VALID (position); + has_dur = gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration) + && GST_CLOCK_TIME_IS_VALID (duration); + if (!has_pos) { + GST_LOG ("Unknown position"); return TRUE; } + if (has_pos && has_dur) { + if (position > duration) { + GST_VALIDATE_REPORT (scenario, + QUERY_POSITION_SUPERIOR_DURATION, + "Reported position %" GST_TIME_FORMAT " > reported duration %" + GST_TIME_FORMAT, GST_TIME_ARGS (position), GST_TIME_ARGS (duration)); + + return TRUE; + } + } + GST_LOG ("Current position: %" GST_TIME_FORMAT, GST_TIME_ARGS (position)); /* Check if playback is within seek segment */ -- 2.7.4