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); TRACE("%s\n", strcaps); data.caps = caps; data.type = "Decoder"; copy = gst_registry_feature_filter(gst_registry_get(), 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; }
GstElement* rygel_gst_utils_get_rtp_depayloader (GstCaps* caps) { #line 172 "rygel-gst-utils.c" GstElement* result = NULL; GstRegistry* registry; GList* features; #line 50 "rygel-gst-utils.vala" g_return_val_if_fail (caps != NULL, NULL); #line 51 "rygel-gst-utils.vala" if (!rygel_gst_utils_need_rtp_depayloader (caps)) { #line 180 "rygel-gst-utils.c" result = NULL; #line 52 "rygel-gst-utils.vala" return result; #line 184 "rygel-gst-utils.c" } #line 55 "rygel-gst-utils.vala" registry = gst_registry_get_default (); #line 56 "rygel-gst-utils.vala" features = gst_registry_feature_filter (registry, _rygel_gst_utils_rtp_depay_filter_gst_plugin_feature_filter, FALSE, NULL); #line 190 "rygel-gst-utils.c" result = rygel_gst_utils_get_best_depay (features, caps); __g_list_free_gst_object_unref0 (features); #line 58 "rygel-gst-utils.vala" return result; #line 195 "rygel-gst-utils.c" }
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; GstRegistry *registry = gst_registry_get (); ctx.desired_caps = gst_pad_template_get_caps (templ); raw = gst_caps_from_string ("audio/x-raw,format=(string){ F32LE, F32BE, F64LE, F64BE }"); 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_registry_feature_filter (registry, (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_registry_find_feature (registry, "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; }
void gst_rtsp_ext_list_init (void) { GST_DEBUG_CATEGORY_INIT (rtspext_debug, "rtspext", 0, "RTSP extension"); /* get a list of all extensions */ extensions = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_rtsp_ext_list_filter, FALSE, NULL); }
static void init_factories (void) { /* first filter out the interesting element factories */ factories = gst_registry_feature_filter ( gst_registry_get_default (), (GstPluginFeatureFilter) cb_feature_filter, FALSE, NULL); /* sort them according to their ranks */ factories = g_list_sort (factories, (GCompareFunc) cb_compare_ranks); }
int Uridecodebin::autoplug_continue_cb(GstElement* /*bin */, GstPad* pad, GstCaps* caps, gpointer /*user_data*/) { GList* list = gst_registry_feature_filter( gst_registry_get(), (GstPluginFeatureFilter)sink_factory_filter, FALSE, caps); int length = g_list_length(list); gst_plugin_feature_list_free(list); if (length == 0 || pad_is_image(get_pad_name(pad))) return 0; return 1; }
/** * gst_device_provider_factory_list_get_device_providers: * @minrank: Minimum rank * * Get a list of factories with a rank greater or equal to @minrank. * The list of factories is returned by decreasing rank. * * Returns: (transfer full) (element-type Gst.DeviceProviderFactory): * a #GList of #GstDeviceProviderFactory device providers. Use * gst_plugin_feature_list_free() after usage. * * Since: 1.4 */ GList * gst_device_provider_factory_list_get_device_providers (GstRank minrank) { GList *result; /* get the feature list using the filter */ result = gst_registry_feature_filter (gst_registry_get (), (GstPluginFeatureFilter) device_provider_filter, FALSE, &minrank); /* sort on rank and name */ result = g_list_sort (result, gst_plugin_feature_rank_compare_func); return result; }
GList* GStreamerFormatHelper::GetFactories() { NS_ASSERTION(sLoadOK, "GStreamer library not linked"); uint32_t cookie = gst_registry_get_feature_list_cookie(gst_registry_get()); if (cookie != mCookie) { g_list_free(mFactories); mFactories = gst_registry_feature_filter(gst_registry_get(), (GstPluginFeatureFilter)FactoryFilter, false, nullptr); mCookie = cookie; } return mFactories; }
static GList * gst_auto_video_convert_create_factory_list (GstAutoVideoConvert * autovideoconvert) { GList *result = NULL; /* get the feature list using the filter */ result = gst_registry_feature_filter (gst_registry_get (), (GstPluginFeatureFilter) gst_auto_video_convert_element_filter, FALSE, autovideoconvert); /* sort on rank and name */ result = g_list_sort (result, gst_plugin_feature_rank_compare_func); return result; }
/** * 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. */ 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_registry_feature_filter (gst_registry_get (), (GstPluginFeatureFilter) element_filter, FALSE, &data); /* sort on rank and name */ result = g_list_sort (result, gst_plugin_feature_rank_compare_func); return result; }
GList * get_visualization_features (void) { return gst_registry_feature_filter (gst_registry_get (), filter_features, FALSE, NULL); }
static GstElement * gst_auto_video_src_find_best (GstAutoVideoSrc * src) { GList *list, *item; GstElement *choice = NULL; GstMessage *message = NULL; GSList *errors = NULL; GstBus *bus = gst_bus_new (); GstPad *el_pad = NULL; GstCaps *el_caps = NULL, *intersect = NULL; gboolean no_match = TRUE; list = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_auto_video_src_factory_filter, FALSE, src); list = g_list_sort (list, (GCompareFunc) gst_auto_video_src_compare_ranks); GST_LOG_OBJECT (src, "Trying to find usable video devices ..."); for (item = list; item != NULL; item = item->next) { GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); GstElement *el; if ((el = gst_auto_video_src_create_element_with_pretty_name (src, f))) { GstStateChangeReturn ret; GST_DEBUG_OBJECT (src, "Testing %s", GST_PLUGIN_FEATURE (f)->name); /* If AutoVideoSrc has been provided with filter caps, * accept only sources that match with the filter caps */ if (src->filter_caps) { el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "src"); el_caps = gst_pad_get_caps (el_pad); gst_object_unref (el_pad); GST_DEBUG_OBJECT (src, "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, src->filter_caps, el_caps); intersect = gst_caps_intersect (src->filter_caps, el_caps); no_match = gst_caps_is_empty (intersect); gst_caps_unref (el_caps); gst_caps_unref (intersect); if (no_match) { GST_DEBUG_OBJECT (src, "Incompatible caps"); gst_object_unref (el); continue; } else { GST_DEBUG_OBJECT (src, "Found compatible caps"); } } gst_element_set_bus (el, bus); ret = gst_element_set_state (el, GST_STATE_READY); if (ret == GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (src, "This worked!"); choice = el; break; } /* collect all error messages */ while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { GST_DEBUG_OBJECT (src, "error message %" GST_PTR_FORMAT, message); errors = g_slist_append (errors, message); } gst_element_set_state (el, GST_STATE_NULL); gst_object_unref (el); } } GST_DEBUG_OBJECT (src, "done trying"); if (!choice) { if (errors) { /* FIXME: we forward the first error for now; but later on it might make * sense to actually analyse them */ gst_message_ref (GST_MESSAGE (errors->data)); GST_DEBUG_OBJECT (src, "reposting message %p", errors->data); gst_element_post_message (GST_ELEMENT (src), GST_MESSAGE (errors->data)); } else { /* send warning message to application and use a fakesrc */ GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), ("Failed to find a usable video source")); choice = gst_element_factory_make ("fakesrc", "fake-video-src"); if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) g_object_set (choice, "sync", TRUE, NULL); gst_element_set_state (choice, GST_STATE_READY); } } gst_object_unref (bus); gst_plugin_feature_list_free (list); g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); g_slist_free (errors); return choice; }
static GstElement * gst_auto_audio_sink_find_best (GstAutoAudioSink * sink) { GList *list, *item; GstElement *choice = NULL; GstMessage *message = NULL; GSList *errors = NULL; GstBus *bus = gst_bus_new (); GstPad *el_pad = NULL; GstCaps *el_caps = NULL; gboolean no_match = TRUE; list = gst_registry_feature_filter (gst_registry_get (), (GstPluginFeatureFilter) gst_auto_audio_sink_factory_filter, FALSE, sink); list = g_list_sort (list, (GCompareFunc) gst_auto_audio_sink_compare_ranks); /* We don't treat sound server sinks special. Our policy is that sound * server sinks that have a rank must not auto-spawn a daemon under any * circumstances, so there's nothing for us to worry about here */ GST_LOG_OBJECT (sink, "Trying to find usable audio devices ..."); for (item = list; item != NULL; item = item->next) { GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); GstElement *el; if ((el = gst_auto_audio_sink_create_element_with_pretty_name (sink, f))) { GstStateChangeReturn ret; GST_DEBUG_OBJECT (sink, "Testing %s", GST_OBJECT_NAME (f)); /* If autoaudiosink has been provided with filter caps, * accept only sinks that match with the filter caps */ if (sink->filter_caps) { el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "sink"); el_caps = gst_pad_query_caps (el_pad, NULL); gst_object_unref (el_pad); GST_DEBUG_OBJECT (sink, "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, sink->filter_caps, el_caps); no_match = !gst_caps_can_intersect (sink->filter_caps, el_caps); gst_caps_unref (el_caps); if (no_match) { GST_DEBUG_OBJECT (sink, "Incompatible caps"); gst_object_unref (el); continue; } else { GST_DEBUG_OBJECT (sink, "Found compatible caps"); } } gst_element_set_bus (el, bus); ret = gst_element_set_state (el, GST_STATE_READY); if (ret == GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (sink, "This worked!"); choice = el; break; } /* collect all error messages */ while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { GST_DEBUG_OBJECT (sink, "error message %" GST_PTR_FORMAT, message); errors = g_slist_append (errors, message); } gst_element_set_state (el, GST_STATE_NULL); gst_object_unref (el); } } GST_DEBUG_OBJECT (sink, "done trying"); if (!choice) { if (errors) { /* FIXME: we forward the first error for now; but later on it might make * sense to actually analyse them */ gst_message_ref (GST_MESSAGE (errors->data)); GST_DEBUG_OBJECT (sink, "reposting message %p", errors->data); gst_element_post_message (GST_ELEMENT (sink), GST_MESSAGE (errors->data)); } else { /* send warning message to application and use a fakesink */ GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), ("Failed to find a usable audio sink")); choice = gst_element_factory_make ("fakesink", "fake-audio-sink"); if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) g_object_set (choice, "sync", TRUE, NULL); gst_element_set_state (choice, GST_STATE_READY); } } gst_object_unref (bus); gst_plugin_feature_list_free (list); g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); g_slist_free (errors); return choice; }
int main(int argc, char *argv[]) { GstElement *pipeline, *vis_plugin; GstBus *bus; GstMessage *msg; GList *list, *walk; GstElementFactory *selected_factory = NULL; guint flags; char *pipeline_str; gboolean list_plugins = FALSE; gchar *plugin_name = NULL; GError *error = NULL; GOptionContext *context; GOptionEntry options[] = { { "list-plugins", 'l', 0, G_OPTION_ARG_NONE, &list_plugins, "list available plugins and exits", NULL }, { "plugin", 'p', 0, G_OPTION_ARG_STRING, &plugin_name, "set the desired plugin", NULL }, { NULL } }; context = g_option_context_new(""); g_option_context_add_main_entries(context, options, ""); if (!g_option_context_parse(context, &argc, &argv, &error)) { g_print("option parsing failed: %s\n", error->message); return -1; } g_option_context_free(context); if (argc > 1) { if (g_str_has_prefix(argv[1], "http://") || g_str_has_prefix(argv[1], "ftp://")) pipeline_str = g_strdup_printf("%s uri=\"%s\"", PLAYBIN, argv[1]); else if (argv[1][0] == '~') pipeline_str = g_strdup_printf("%s uri=\"file://%s%s\"", PLAYBIN, g_get_home_dir(), argv[1]+1); else if (g_file_test(argv[1], G_FILE_TEST_IS_REGULAR)) pipeline_str = g_strdup_printf("playbin uri=\"file://%s\"", argv[1]); else pipeline_str = g_strdup_printf("%s uri=%s", PLAYBIN, DEFAULT_URI); } else pipeline_str = g_strdup_printf("%s uri=%s", PLAYBIN, DEFAULT_URI); gst_init(&argc, &argv); list = gst_registry_feature_filter(GET_PLUGIN_REGISTRY, filter_vis_features, FALSE, NULL); if (plugin_name == NULL) plugin_name = "GOOM"; g_print("Available visualization plugins:\n"); for (walk = list; walk != NULL; walk = g_list_next(walk)) { const gchar *name; GstElementFactory *factory; factory = GST_ELEMENT_FACTORY(walk->data); name = gst_element_factory_get_longname(factory); g_print(" %s\n", name); if (selected_factory == NULL || g_str_has_prefix(name, plugin_name)) { selected_factory = factory; } } /* Don't use the factory if it's still empty */ /* e.g. no visualization plugins found */ if (!selected_factory) { g_print("No visualization plugins found!\n"); return -1; } if (list_plugins == TRUE) return 0; g_print("Selected '%s'\n", gst_element_factory_get_longname(selected_factory)); vis_plugin = gst_element_factory_create(selected_factory, NULL); if (!vis_plugin) return -1; pipeline = gst_parse_launch(pipeline_str, NULL); g_object_get(pipeline, "flags", &flags, NULL); flags |= GST_PLAY_FLAG_VIS; g_object_set(pipeline, "flags", flags, NULL); g_object_set(pipeline, "vis-plugin", vis_plugin, NULL); gst_element_set_state(pipeline, GST_STATE_PLAYING); bus = gst_element_get_bus(pipeline); msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS); if (msg != NULL) gst_message_unref(msg); gst_plugin_feature_list_free(list); gst_object_unref(bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return 0; }