From ba500b816ad25bc8d839f1b1c024d7ec5213d4fb Mon Sep 17 00:00:00 2001 From: Vivia Nikolaidou Date: Thu, 18 Jun 2020 21:11:17 +0300 Subject: interlace: Only half the framerate for 1:1 field pattern 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: --- gst/interlace/gstinterlace.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'gst/interlace') diff --git a/gst/interlace/gstinterlace.c b/gst/interlace/gstinterlace.c index 31760ac12..c4f6175e8 100644 --- a/gst/interlace/gstinterlace.c +++ b/gst/interlace/gstinterlace.c @@ -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); -- cgit v1.2.1