v4l2object: append non colorimetry structure to probed caps

If the stream has a special colorimetry that is not in the colorimetry
list, it will cause negotiation to fail. We should allow passing any
colorimetry, so add an extra structure without the colorimetry field.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7570>
This commit is contained in:
Shengqi Yu 2024-07-29 09:07:40 +08:00 committed by Backport Bot
parent c9d1a1d53c
commit 7a37b27c67

View file

@ -1832,6 +1832,31 @@ add_alternate_variant (GstV4l2Object * v4l2object, GstCaps * caps,
gst_caps_features_new (GST_CAPS_FEATURE_FORMAT_INTERLACED, NULL));
}
static void
add_non_colorimetry_caps (GstV4l2Object * v4l2object, GstCaps * caps)
{
gint caps_size;
gint i;
caps_size = gst_caps_get_size (caps);
for (i = 0; i < caps_size; i++) {
GstStructure *structure = gst_caps_get_structure (caps, i);
GstCapsFeatures *features = gst_caps_get_features (caps, i);
if (gst_structure_has_name (structure, "video/x-raw")
&& gst_structure_has_field (structure, "colorimetry")) {
GstStructure *alt_s = gst_structure_copy (structure);
gst_structure_remove_field (alt_s, "colorimetry");
if (gst_caps_features_contains (features,
GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY))
gst_caps_append_structure (caps, alt_s);
else
gst_caps_append_structure_full (caps, alt_s,
gst_caps_features_copy (features));
}
}
}
static GstCaps *
gst_v4l2_object_get_caps_helper (GstV4L2FormatFlags flags)
{
@ -5154,6 +5179,13 @@ gst_v4l2_object_probe_caps (GstV4l2Object * v4l2object, GstCaps * filter)
gst_caps_unref (tmp);
}
/* Add a variant of the caps without the colorimetry so that we can negotiate
successfully even if the detected colorimetry from upstream is not supported
by the device */
if (ret) {
add_non_colorimetry_caps (v4l2object, ret);
}
GST_INFO_OBJECT (v4l2object->dbg_obj, "probed caps: %" GST_PTR_FORMAT, ret);
return ret;