v4l2: videodec: Fix broken template caps
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 21 May 2020 21:12:55 +0000 (17:12 -0400)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 22 May 2020 19:11:47 +0000 (19:11 +0000)
The profiles and levels were applied to the common caps instead of the copy.
That had the side effect of setting profiles/level from one CODEC onto
another. Leaving to encoder not being registered or not-negotiated errors.

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

sys/v4l2/gstv4l2videoenc.c

index f89d021..ea574de 100644 (file)
@@ -1176,20 +1176,20 @@ gst_v4l2_video_enc_register (GstPlugin * plugin, GType type,
   GstV4l2VideoEncCData *cdata;
   GValue value = G_VALUE_INIT;
 
+  filtered_caps = gst_caps_intersect (src_caps, codec_caps);
+
   if (codec != NULL && video_fd != -1) {
     if (gst_v4l2_codec_probe_levels (codec, video_fd, &value)) {
-      gst_caps_set_value (src_caps, "level", &value);
+      gst_caps_set_value (filtered_caps, "level", &value);
       g_value_unset (&value);
     }
 
     if (gst_v4l2_codec_probe_profiles (codec, video_fd, &value)) {
-      gst_caps_set_value (src_caps, "profile", &value);
+      gst_caps_set_value (filtered_caps, "profile", &value);
       g_value_unset (&value);
     }
   }
 
-  filtered_caps = gst_caps_intersect (src_caps, codec_caps);
-
   cdata = g_new0 (GstV4l2VideoEncCData, 1);
   cdata->device = g_strdup (device_path);
   cdata->sink_caps = gst_caps_ref (sink_caps);