From 19f05d77b4028291fb6ed88b749ffab9131636bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Wed, 1 Dec 2021 12:26:11 +0100 Subject: vaapidecode: Autogenerate caps template. vaapidecode is used in vaapidecodebin and it exposes all the theoretically supported caps, but that slows down autoplug. With this autplug is negotiated faster, giving more option to decodebin to select other decoder. Part-of: --- gst/vaapi/gstvaapidecode.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/gst/vaapi/gstvaapidecode.c b/gst/vaapi/gstvaapidecode.c index 329c0e65..1045564d 100644 --- a/gst/vaapi/gstvaapidecode.c +++ b/gst/vaapi/gstvaapidecode.c @@ -64,18 +64,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_debug_vaapidecode); #define GST_CAPS_CODEC(CODEC) CODEC "; " /* *INDENT-OFF* */ -static const char gst_vaapidecode_sink_caps_str[] = - GST_CAPS_CODEC("video/mpeg, mpegversion=2, systemstream=(boolean)false") - GST_CAPS_CODEC("video/mpeg, mpegversion=4") - GST_CAPS_CODEC("video/x-divx") - GST_CAPS_CODEC("video/x-xvid") - GST_CAPS_CODEC("video/x-h263") - GST_CAPS_CODEC("video/x-h264") - GST_CAPS_CODEC("video/x-h265") - GST_CAPS_CODEC("video/x-wmv") - GST_CAPS_CODEC("video/x-vp8") - GST_CAPS_CODEC("video/x-vp9") - ; +char *gst_vaapidecode_sink_caps_str = NULL; static const char gst_vaapidecode_src_caps_str[] = GST_VAAPI_MAKE_SURFACE_CAPS "; " @@ -118,8 +107,7 @@ static const GstVaapiDecoderMap vaapi_decode_map[] = { {GST_VAAPI_CODEC_VP8, GST_RANK_PRIMARY, "vp8", "video/x-vp8", NULL}, {GST_VAAPI_CODEC_VP9, GST_RANK_PRIMARY, "vp9", "video/x-vp9", NULL}, {GST_VAAPI_CODEC_H265, GST_RANK_PRIMARY, "h265", "video/x-h265", NULL}, - {0 /* the rest */ , GST_RANK_PRIMARY + 1, NULL, - gst_vaapidecode_sink_caps_str, NULL}, + {0 /* the rest */ , GST_RANK_PRIMARY + 1, NULL, NULL, NULL}, }; static GstElementClass *parent_class = NULL; @@ -1554,7 +1542,12 @@ gst_vaapidecode_class_init (GstVaapiDecodeClass * klass) map->install_properties (object_class); /* sink pad */ - caps = gst_caps_from_string (map->caps_str); + if (map->caps_str) { + caps = gst_caps_from_string (map->caps_str); + } else { + caps = gst_caps_from_string (gst_vaapidecode_sink_caps_str); + g_free (gst_vaapidecode_sink_caps_str); + } pad_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); gst_caps_unref (caps); @@ -1580,7 +1573,7 @@ gst_vaapidecode_register (GstPlugin * plugin, GArray * decoders) { gboolean ret = FALSE; guint i, codec, rank; - gchar *type_name, *element_name; + gchar *type_name, *element_name, *sink_caps_str; const gchar *name; GType type; GTypeInfo typeinfo = { @@ -1603,6 +1596,15 @@ gst_vaapidecode_register (GstPlugin * plugin, GArray * decoders) if (codec && !gst_vaapi_codecs_has_codec (decoders, codec)) continue; + if (!gst_vaapidecode_sink_caps_str) { + gst_vaapidecode_sink_caps_str = g_strdup (vaapi_decode_map[i].caps_str); + } else { + 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); + gst_vaapidecode_sink_caps_str = sink_caps_str; + } + if (codec) { type_name = g_strdup_printf ("GstVaapiDecode_%s", name); element_name = g_strdup_printf ("vaapi%sdec", name); -- cgit v1.2.1