vaapi: plugin: Handle when no encoders/decoders available.
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Thu, 11 Aug 2022 19:22:12 +0000 (21:22 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 17 Aug 2022 10:57:37 +0000 (10:57 +0000)
Nouveau driver currently only exposes postproc entry. But
vaapidecodebin is registered independent if there are decoders or not,
exposing a segmentation fault.

This patch removes the encoder/decoder/codec arrays if no entries are
found, and if no decoders are found vaapidecodebin is not
registered. Also for vaapipostproc if no postproc entry is found.

Also, if general decoder, used by vaapidecodebin, doesn't have a sink
pad string, don't register the glib type.

Fixes: #1349
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2865>

subprojects/gstreamer-vaapi/gst-libs/gst/vaapi/gstvaapidisplay.c
subprojects/gstreamer-vaapi/gst/vaapi/gstvaapi.c
subprojects/gstreamer-vaapi/gst/vaapi/gstvaapidecode.c

index 878761a..5bf4b13 100644 (file)
@@ -557,6 +557,13 @@ ensure_profiles (GstVaapiDisplay * display)
   }
   success = TRUE;
 
   }
   success = TRUE;
 
+  if (priv->encoders->len == 0)
+    g_clear_pointer (&priv->encoders, g_ptr_array_unref);
+  if (priv->decoders->len == 0)
+    g_clear_pointer (&priv->decoders, g_ptr_array_unref);
+  if (priv->codecs->len == 0)
+    g_clear_pointer (&priv->codecs, g_array_unref);
+
 cleanup:
   g_free (profiles);
   g_free (entrypoints);
 cleanup:
   g_free (profiles);
   g_free (entrypoints);
index 3532624..c45fd0a 100644 (file)
@@ -200,17 +200,17 @@ plugin_init (GstPlugin * plugin)
   decoders = display_get_decoder_codecs (display);
   if (decoders) {
     gst_vaapidecode_register (plugin, decoders);
   decoders = display_get_decoder_codecs (display);
   if (decoders) {
     gst_vaapidecode_register (plugin, decoders);
+    gst_element_register (plugin, "vaapidecodebin",
+        GST_RANK_PRIMARY + 2, GST_TYPE_VAAPI_DECODE_BIN);
     g_array_unref (decoders);
   }
 
     g_array_unref (decoders);
   }
 
-  if (_gst_vaapi_has_video_processing)
+  if (_gst_vaapi_has_video_processing) {
     gst_vaapioverlay_register (plugin, display);
 
     gst_vaapioverlay_register (plugin, display);
 
-  gst_element_register (plugin, "vaapipostproc",
-      GST_RANK_NONE, GST_TYPE_VAAPIPOSTPROC);
-
-  gst_element_register (plugin, "vaapidecodebin",
-      GST_RANK_PRIMARY + 2, GST_TYPE_VAAPI_DECODE_BIN);
+    gst_element_register (plugin, "vaapipostproc",
+        GST_RANK_NONE, GST_TYPE_VAAPIPOSTPROC);
+  }
 
   rank = GST_RANK_SECONDARY;
   if (g_getenv ("WAYLAND_DISPLAY"))
 
   rank = GST_RANK_SECONDARY;
   if (g_getenv ("WAYLAND_DISPLAY"))
index 2ce31d9..578e68b 100644 (file)
@@ -1614,6 +1614,8 @@ gst_vaapidecode_register (GstPlugin * plugin, GArray * decoders)
       sink_caps_str = g_strconcat (gst_vaapidecode_sink_caps_str, "; ",
           vaapi_decode_map[i].caps_str, NULL);
       g_clear_pointer (&gst_vaapidecode_sink_caps_str, g_free);
       sink_caps_str = g_strconcat (gst_vaapidecode_sink_caps_str, "; ",
           vaapi_decode_map[i].caps_str, NULL);
       g_clear_pointer (&gst_vaapidecode_sink_caps_str, g_free);
+      if (!sink_caps_str)
+        break;
       gst_vaapidecode_sink_caps_str = sink_caps_str;
     }
 
       gst_vaapidecode_sink_caps_str = sink_caps_str;
     }