-*- outline -*- * Creating Elements Without Factories ** The purpose of factories On a typical GStreamer system, there are approximately 6.022*10^23 plugins. GStreamer knows about all of them because of the registry. The goal is to avoid initializing each one of them, when maybe for your application you only need one or two. The problem becomes, how do you create an instance of the plugin? The normal way to instantiate a class is via g_object_new (TYPE, ARGS...). In the case that the plugin isn't loaded, you don't know its type, and can't even get it from the type name. Element factories exist to solve this problem by associating names (like "sinesrc" or "identity") with certain types that are provided by the plugin. Then when the user asks for "sinesrc", the appropriate plugin is loaded, its types are initialized, and then gst_element_factory_create creates the object for you. ** Why not factories? To review, factories (1) allow plugins to remain unloaded if not necessary, and (2) make it easy to create elements. If you are writing an application that has custom elements (as is the case with most serious applications), you will probably have the plugin loaded up already, and you will have access to the type of the element. To muck about creating a plugin for the app, registering the element with the plugin, and then creating it with the element factory API actually takes more work than the normal way. ** g_object_new So you want to avoid factories. To create objects with a simple g_object_new call is our strategy. However, to preserve the same semantics as gst_element_factory_create, we need to know what else is needed to initialize a GStreamer element. The other things that gst_element_factory_create does are as follows: *** Sets the ->elementfactory member on the element class Note that anything trying to get the factory won't work (e.g. gst_element_get_factory). Thankfully this is less of a problem after the 0.7 plugin system changes. *** Initializes the name of the element To do this ourselves, we either call gst_object_set_name, or when we set the "name" property when creating the object. ** Summary To create a GStreamer element when you know the type, you can just use g_object_new (get_type_of_my_element (), "name", the_name_you_want_possibly_null, ... any other properties ... NULL);