codecs: mpeg2decoder: Use tsg framerate for latency.
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Tue, 7 Sep 2021 07:45:54 +0000 (09:45 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 17 Sep 2021 12:48:33 +0000 (12:48 +0000)
Latency setting relies on src pad caps, but they aren't set when the
function is called, and latency is never updated.

In order to fix it, this patch uses TSG framerate first, and if it's
not set yet, sinkpad caps are used to get the framerate.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2514>

gst-libs/gst/codecs/gstmpeg2decoder.c

index d9c275349bba481e58a7091cb4100828aafa311c..ae0e331e68af008fae101cb15ff292e190eef8ab 100644 (file)
@@ -404,21 +404,27 @@ gst_mpeg2_decoder_set_latency (GstMpeg2Decoder * decoder)
 {
   GstCaps *caps;
   GstClockTime min, max;
+  GstMpeg2DecoderPrivate *priv = decoder->priv;
   GstStructure *structure;
   gint fps_d = 1, fps_n = 0;
 
-  caps = gst_pad_get_current_caps (GST_VIDEO_DECODER_SRC_PAD (decoder));
-  if (!caps)
-    return;
-
-  structure = gst_caps_get_structure (caps, 0);
-  if (gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d)) {
-    if (fps_n == 0) {
-      /* variable framerate: see if we have a max-framerate */
-      gst_structure_get_fraction (structure, "max-framerate", &fps_n, &fps_d);
+  if (priv->tsg.fps_d > 0 && priv->tsg.fps_n > 0) {
+    fps_n = priv->tsg.fps_n;
+    fps_d = priv->tsg.fps_d;
+  } else {
+    caps = gst_pad_get_current_caps (GST_VIDEO_DECODER_SINK_PAD (decoder));
+    if (caps) {
+      structure = gst_caps_get_structure (caps, 0);
+      if (gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d)) {
+        if (fps_n == 0) {
+          /* variable framerate: see if we have a max-framerate */
+          gst_structure_get_fraction (structure, "max-framerate", &fps_n,
+              &fps_d);
+        }
+      }
+      gst_caps_unref (caps);
     }
   }
-  gst_caps_unref (caps);
 
   /* if no fps or variable, then 25/1 */
   if (fps_n == 0) {