summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/vaapi/gstvaapidecode.c34
1 files 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);