static const char *Gstreamer_FindMatch(const char *strcaps) { struct typeinfo data; GList *list, *copy; guint bestrank = 0; GstElementFactory *bestfactory = NULL; GstCaps *caps = gst_caps_from_string(strcaps); data.caps = caps; data.type = "Decoder"; copy = gst_default_registry_feature_filter(match_element, 0, &data); for (list = copy; list; list = list->next) { GstElementFactory *factory = (GstElementFactory*)list->data; guint rank; rank = gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory)); if (rank > bestrank || !bestrank) { bestrank = rank; bestfactory = factory; } } gst_caps_unref(caps); g_list_free(copy); if (!bestfactory) { FIXME("Could not find plugin for %s\n", strcaps); return NULL; } return gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(bestfactory)); }
GList* GStreamerFormatHelper::GetFactories() { NS_ASSERTION(sLoadOK, "GStreamer library not linked"); #if GST_VERSION_MAJOR >= 1 uint32_t cookie = gst_registry_get_feature_list_cookie(gst_registry_get()); #else uint32_t cookie = gst_default_registry_get_feature_list_cookie(); #endif if (cookie != mCookie) { g_list_free(mFactories); #if GST_VERSION_MAJOR >= 1 mFactories = gst_registry_feature_filter(gst_registry_get(), (GstPluginFeatureFilter)FactoryFilter, false, nullptr); #else mFactories = gst_default_registry_feature_filter((GstPluginFeatureFilter)FactoryFilter, false, nullptr); #endif mCookie = cookie; } return mFactories; }
/** * gst_factory_list_get_elements: * @type: a #GstFactoryListType * * Get a sorted list of factories of @type. * * Returns: a #GValueArray of #GstElementFactory elements. Use * g_value_array_free() after usage. */ GValueArray * gst_factory_list_get_elements (GstFactoryListType type) { GValueArray *result; GList *walk, *list; FilterData data; result = g_value_array_new (0); /* prepare type */ data.type = type; /* get the feature list using the filter */ list = gst_default_registry_feature_filter ((GstPluginFeatureFilter) element_filter, FALSE, &data); /* convert to an array */ for (walk = list; walk; walk = g_list_next (walk)) { GstElementFactory *factory = GST_ELEMENT_FACTORY (walk->data); GValue val = { 0, }; g_value_init (&val, G_TYPE_OBJECT); g_value_set_object (&val, factory); g_value_array_append (result, &val); g_value_unset (&val); } gst_plugin_feature_list_free (list); /* sort on rank and name */ g_value_array_sort (result, (GCompareFunc) compare_ranks); return result; }
static gpointer _get_decoder_factories (gpointer arg) { GstElementClass *klass = arg; GList *factories; GstPadTemplate *templ = gst_element_class_get_pad_template (klass, "sink"); RsnDecFactoryFilterCtx ctx = { NULL, }; GstCaps *raw; gboolean raw_audio; ctx.desired_caps = gst_pad_template_get_caps (templ); raw = gst_caps_from_string ("audio/x-raw-float"); raw_audio = gst_caps_can_intersect (raw, ctx.desired_caps); if (raw_audio) { GstCaps *sub = gst_caps_subtract (ctx.desired_caps, raw); ctx.desired_caps = sub; } else { gst_caps_ref (ctx.desired_caps); } gst_caps_unref (raw); /* Set decoder caps to empty. Will be filled by the factory_filter */ ctx.decoder_caps = gst_caps_new_empty (); GST_DEBUG ("Finding factories for caps: %" GST_PTR_FORMAT, ctx.desired_caps); factories = gst_default_registry_feature_filter ( (GstPluginFeatureFilter) rsndec_factory_filter, FALSE, &ctx); /* If these are audio caps, we add audioconvert, which is not a decoder, but allows raw audio to go through relatively unmolested - this will come handy when we have to send placeholder silence to allow preroll for those DVDs which have titles with no audio track. */ if (raw_audio) { GstPluginFeature *feature; GST_DEBUG ("These are audio caps, adding audioconvert"); feature = gst_default_registry_find_feature ("audioconvert", GST_TYPE_ELEMENT_FACTORY); if (feature) { factories = g_list_append (factories, feature); } else { GST_WARNING ("Could not find feature audioconvert"); } } factories = g_list_sort (factories, (GCompareFunc) sort_by_ranks); GST_DEBUG ("Available decoder caps %" GST_PTR_FORMAT, ctx.decoder_caps); gst_caps_unref (ctx.decoder_caps); gst_caps_unref (ctx.desired_caps); return factories; }
GList* GStreamerFormatHelper::GetFactories() { NS_ASSERTION(sLoadOK, "GStreamer library not linked"); uint32_t cookie = gst_default_registry_get_feature_list_cookie (); if (cookie != mCookie) { g_list_free(mFactories); mFactories = gst_default_registry_feature_filter((GstPluginFeatureFilter)FactoryFilter, false, nullptr); mCookie = cookie; } return mFactories; }
/** * gst_element_factory_list_get_elements: * @type: a #GstElementFactoryListType * @minrank: Minimum rank * * Get a list of factories that match the given @type. Only elements * with a rank greater or equal to @minrank will be returned. * The list of factories is returned by decreasing rank. * * Returns: (transfer full) (element-type Gst.ElementFactory): a #GList of * #GstElementFactory elements. Use gst_plugin_feature_list_free() after * usage. * * Since: 0.10.31 */ GList * gst_element_factory_list_get_elements (GstElementFactoryListType type, GstRank minrank) { GList *result; FilterData data; /* prepare type */ data.type = type; data.minrank = minrank; /* get the feature list using the filter */ result = gst_default_registry_feature_filter ((GstPluginFeatureFilter) element_filter, FALSE, &data); /* sort on rank and name */ result = g_list_sort (result, gst_plugin_feature_rank_compare_func); return result; }