gboolean gst_vaapidecode_register (GstPlugin * plugin, GArray * decoders) { gboolean ret = FALSE; guint i, codec, rank; gchar *type_name, *element_name; const gchar *name; GType type; GTypeInfo typeinfo = { sizeof (GstVaapiDecodeClass), NULL, NULL, (GClassInitFunc) gst_vaapidecode_class_init, NULL, NULL, sizeof (GstVaapiDecode), 0, (GInstanceInitFunc) gst_vaapidecode_init, }; for (i = 0; i < G_N_ELEMENTS (vaapi_decode_map); i++) { codec = vaapi_decode_map[i].codec; rank = vaapi_decode_map[i].rank; name = vaapi_decode_map[i].name; if (codec && !gst_vaapi_codecs_has_codec (decoders, codec)) continue; if (codec) { type_name = g_strdup_printf ("GstVaapiDecode_%s", name); element_name = g_strdup_printf ("vaapi%sdec", name); } else { type_name = g_strdup ("GstVaapiDecode"); element_name = g_strdup_printf ("vaapidecode"); } type = g_type_from_name (type_name); if (!type) { /* create the gtype now */ type = g_type_register_static (GST_TYPE_VIDEO_DECODER, type_name, &typeinfo, 0); gst_vaapi_plugin_base_init_interfaces (type); g_type_set_qdata (type, GST_VAAPI_DECODE_PARAMS_QDATA, (gpointer) & vaapi_decode_map[i]); } /* Register GstVaapiDecode as GObject type, but not in GStreamer, so * vaapidecodebin can use it internally, but no exposed as a plugin * feature */ if (codec) ret |= gst_element_register (plugin, element_name, rank, type); g_free (element_name); g_free (type_name); } return ret; }
static GArray * profiles_get_codecs (GArray * profiles) { guint i; GArray *codecs; GstVaapiProfile profile; GstVaapiCodec codec; codecs = g_array_new (FALSE, FALSE, sizeof (GstVaapiCodec)); if (!codecs) return NULL; for (i = 0; i < profiles->len; i++) { profile = g_array_index (profiles, GstVaapiProfile, i); codec = gst_vaapi_profile_get_codec (profile); if (gst_vaapi_codecs_has_codec (codecs, codec)) continue; g_array_append_val (codecs, codec); } return codecs; }