baseparse: Set the private duration before posting a duration-changed message
authorZebediah Figura <z.figura12@gmail.com>
Mon, 10 Feb 2020 22:35:06 +0000 (16:35 -0600)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 14 Feb 2020 18:17:38 +0000 (18:17 +0000)
Otherwise an application cannot rely on a subsequent call to e.g. gst_pad_query_duration() succeeding.

libs/gst/base/gstbaseparse.c

index 86c1e18996b408177f0043382cca6e05c3457142..d0910a5085806d45aa166a1e4a5ab416e3e2127b 100644 (file)
@@ -3840,6 +3840,8 @@ void
 gst_base_parse_set_duration (GstBaseParse * parse,
     GstFormat fmt, gint64 duration, gint interval)
 {
+  gint64 old_duration;
+
   g_return_if_fail (parse != NULL);
 
   if (parse->priv->upstream_has_duration) {
@@ -3847,14 +3849,8 @@ gst_base_parse_set_duration (GstBaseParse * parse,
     goto exit;
   }
 
-  if (duration != parse->priv->duration) {
-    GstMessage *m;
+  old_duration = parse->priv->duration;
 
-    m = gst_message_new_duration_changed (GST_OBJECT (parse));
-    gst_element_post_message (GST_ELEMENT (parse), m);
-
-    /* TODO: what about duration tag? */
-  }
   parse->priv->duration = duration;
   parse->priv->duration_fmt = fmt;
   GST_DEBUG_OBJECT (parse, "set duration: %" G_GINT64_FORMAT, duration);
@@ -3866,6 +3862,14 @@ gst_base_parse_set_duration (GstBaseParse * parse,
   }
   GST_DEBUG_OBJECT (parse, "set update interval: %d", interval);
   parse->priv->update_interval = interval;
+  if (duration != old_duration) {
+    GstMessage *m;
+
+    m = gst_message_new_duration_changed (GST_OBJECT (parse));
+    gst_element_post_message (GST_ELEMENT (parse), m);
+
+    /* TODO: what about duration tag? */
+  }
 exit:
   return;
 }