| Autoplugger V2 |
| ============== |
| |
| The current autoplugger as described in autoplug1 has some |
| serious shortcommings: |
| |
| - it is embedded in GstPipeline and cannot be used with a |
| generic interface. A lot of complexity is inside the |
| pipeline, more specifically the creation of threads and |
| subbins and the pad connections. |
| - it is not (easily) pluggable. |
| |
| |
| |
| 1) definition |
| ------------- |
| |
| We want to define a plugable framework for autoplugging this |
| includes: |
| |
| - autoplugging algorithms can be added and removed at run time. |
| - autoplugging algorithms can be defined by plugins. |
| |
| The autoplugger is build to handle simple media playback but |
| could also be used to create more complex pipelines. |
| |
| The main focus will be on creating an element (can be a bin) |
| that has *one* input pad and *one or more* output pads. |
| |
| It must be possible for a user app to insert its own elements in |
| the autogenerated element. |
| |
| The autoplugger will be an interface to the low level plugin |
| system based on the functional requirements of the user app. |
| the app will for example request an object that can convert |
| media type X to media type Y, the user app is not interested in |
| any intermediate steps to accomplish this conversion. |
| |
| |
| 2) the API |
| ---------- |
| |
| The API for the user apps should be no more then this: |
| |
| GstElement* gst_autoplug_caps_list (GstAutoplug *autoplug, |
| GList *incaps, |
| GList *outcaps, ...); |
| |
| autoplug is a reference to the autoplug implementation |
| incaps is a GList of GstCaps* for the source pad, the last set |
| of arguments is a va_list of destination caps lists. |
| |
| A handle to the autoplugger implementation can be obtained |
| with |
| |
| GList* gst_autoplugfactory_get_list (void); |
| |
| which will return a GList* of autopluggers. |
| |
| GstAutoplug* gst_autoplugfactory_make ("name"); |
| |
| or |
| |
| GstAutoplug* gst_autoplugfactory_create (GstAutoplugFactory *autoplug); |
| |
| is used to get an autoplugger. |
| |
| |
| 3) the plugins API |
| ------------------ |
| |
| plugins can add their own autoplugger implementation by |
| subclassing an abstract autoplugger class and implementing/ |
| overriding various methods. |
| |
| the autoplugger can be registered with: |
| |
| gst_plugin_add_autoplugger (GstPlugin *plugin, |
| GstAutoplugFactory *autoplug); |
| |
| This will allow us to only load the autoplugger when needed. |
| |
| |
| |
| 4) implementation |
| ----------------- |
| |
| We will implement two autopluggers: |
| |
| - a static autoplugger. This autoplugger recursively adds |
| elements to the target element until all of the possible |
| pads are connected to something. The static autoplugger |
| only operates on padtemplates and ALWAYS pads. The pipeline |
| is not started before all elements are connected, hence |
| the 'static' autoplugger. This autoplugger will be a rework |
| of the current autoplugger. |
| |
| - a dynamic autoplugger. This autoplugger configures the |
| pipeline at runtime based on the pad capabilities when they |
| become available. this allows for more fine grained |
| autoplugging than can be achieved with the static one because |
| it can be based on the actual media stream you are handling. |
| |
| the autopluggers will be implemented in their separate plugins, |
| outside of the core libraries and are therefore optional. |
| |
| |
| 5) the autoplugger object |
| ------------------------- |
| |
| the autoplugger object will be an abstract class with the following |
| properties: |
| |
| - name, description, more text to identify the autoplugger. |
| |
| - a class method autoplug_caps_list that has to be implemented by |
| the real autoplugger. |
| |
| optionally, the core autoplugger code can provide convenience |
| functions to implement custom autopluggers. The shortest path |
| algorithm with pluggable weighting and list functions come to |
| mind. |
| |
| signals will be added to the autoplugger so that user apps can |
| modify the constructed pipeline by adding extra objects. |
| A possible use case would be to let gstmediaplay perform an |
| autoplug on the media stream and insert a custom sound/video |
| effect in the pipeline when an appropriate element is created. |
| |
| the "new_object" signal will be fired by the autoplugger whenever |
| a new object has been created. This signal can be caught by the |
| user app to perform an introspection on the newly created object. |
| |
| |
| |