| -*- 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); |