video-info: check if alternate caps has the feature as well

It's invalid to have a 'interlace-mode=alternate' without the Interlaced caps
feature as well.
Modify gst_video_info_from_caps() to reject such case so we can easily
spot them in bugged elements.
This commit is contained in:
Guillaume Desmottes 2018-12-11 11:37:36 +01:00
parent 6ba860021c
commit 10ce73b6eb
2 changed files with 36 additions and 0 deletions

View file

@ -455,6 +455,17 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
else else
info->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; info->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
/* Interlaced feature is mandatory for raw alternate streams */
if (info->interlace_mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE &&
format != GST_VIDEO_FORMAT_ENCODED) {
GstCapsFeatures *f;
f = gst_caps_get_features (caps, 0);
if (!f
|| !gst_caps_features_contains (f, GST_CAPS_FEATURE_FORMAT_INTERLACED))
goto alternate_no_feature;
}
if ((info->interlace_mode == GST_VIDEO_INTERLACE_MODE_INTERLEAVED || if ((info->interlace_mode == GST_VIDEO_INTERLACE_MODE_INTERLEAVED ||
info->interlace_mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE) && info->interlace_mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE) &&
(s = gst_structure_get_string (structure, "field-order"))) { (s = gst_structure_get_string (structure, "field-order"))) {
@ -541,6 +552,12 @@ no_height:
GST_ERROR ("no height property given"); GST_ERROR ("no height property given");
return FALSE; return FALSE;
} }
alternate_no_feature:
{
GST_ERROR
("caps has 'interlace-mode=alternate' but doesn't have the Interlaced feature");
return FALSE;
}
} }
/** /**

View file

@ -1309,6 +1309,25 @@ GST_START_TEST (test_interlace_mode)
GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST); GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST);
gst_caps_unref (caps); gst_caps_unref (caps);
/* gst_video_info_from_caps() fails if an alternate stream doesn't contain
* the caps feature. */
caps =
gst_caps_from_string
("video/x-raw, format=NV12, width=320, height=240, interlace-mode=alternate");
fail_unless (caps);
fail_if (gst_video_info_from_caps (&vinfo, caps));
gst_caps_unref (caps);
/* ... but it's ok for encoded video */
caps =
gst_caps_from_string
("video/x-h265, width=320, height=240, interlace-mode=alternate");
fail_unless (caps);
fail_unless (gst_video_info_from_caps (&vinfo, caps));
gst_caps_unref (caps);
} }
GST_END_TEST; GST_END_TEST;