interlace: Only half the framerate for 1:1 field pattern
authorVivia Nikolaidou <vivia@ahiru.eu>
Thu, 18 Jun 2020 18:11:17 +0000 (21:11 +0300)
committerVivia Nikolaidou <vivia@ahiru.eu>
Wed, 24 Jun 2020 08:15:48 +0000 (11:15 +0300)
Keep the framerate for 2:2 field pattern, and completely remove it from
the caps for all others. Otherwise, negotiation will fail if caps on
both sides of the element specify a framerate.

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

gst/interlace/gstinterlace.c

index 31760ac..c4f6175 100644 (file)
@@ -746,9 +746,19 @@ gst_interlace_getcaps (GstPad * pad, GstInterlace * interlace, GstCaps * filter)
 
   if (filter != NULL) {
     clean_filter = gst_caps_copy (filter);
-    clean_filter =
-        gst_interlace_caps_double_framerate (clean_filter,
-        (pad == interlace->sinkpad));
+    if (interlace->pattern == GST_INTERLACE_PATTERN_1_1) {
+      clean_filter =
+          gst_interlace_caps_double_framerate (clean_filter,
+          (pad == interlace->sinkpad));
+    } else if (interlace->pattern != GST_INTERLACE_PATTERN_2_2) {
+      GST_FIXME_OBJECT (interlace,
+          "Add calculations for telecine framerate conversions");
+      for (i = 0; i < gst_caps_get_size (clean_filter); ++i) {
+        GstStructure *s = gst_caps_get_structure (clean_filter, i);
+
+        gst_structure_remove_field (s, "framerate");
+      }
+    }
 
     if (pad == interlace->sinkpad) {
       /* @filter may contain the different formats supported upstream.
@@ -818,8 +828,18 @@ gst_interlace_getcaps (GstPad * pad, GstInterlace * interlace, GstCaps * filter)
     icaps = gst_caps_merge (icaps, alternate);
   }
 
-  icaps =
-      gst_interlace_caps_double_framerate (icaps, (pad == interlace->srcpad));
+  if (interlace->pattern == GST_INTERLACE_PATTERN_1_1) {
+    icaps =
+        gst_interlace_caps_double_framerate (icaps, (pad == interlace->srcpad));
+  } else if (interlace->pattern != GST_INTERLACE_PATTERN_2_2) {
+    GST_FIXME_OBJECT (interlace,
+        "Add calculations for telecine framerate conversions");
+    for (i = 0; i < gst_caps_get_size (icaps); ++i) {
+      GstStructure *s = gst_caps_get_structure (icaps, i);
+
+      gst_structure_remove_field (s, "framerate");
+    }
+  }
 
   if (clean_filter)
     gst_caps_unref (clean_filter);