2001-02-06 20:06:22 +00:00
|
|
|
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:
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
GstElement* gst_autoplug_caps_list (GstAutoplug *autoplug,
|
|
|
|
GList *incaps,
|
|
|
|
GList *outcaps, ...);
|
2001-02-06 20:06:22 +00:00
|
|
|
|
|
|
|
autoplug is a reference to the autoplug implementation
|
2001-03-07 21:52:56 +00:00
|
|
|
incaps is a GList of GstCaps* for the source pad, the last set
|
|
|
|
of arguments is a va_list of destination caps lists.
|
2001-02-06 20:06:22 +00:00
|
|
|
|
|
|
|
A handle to the autoplugger implementation can be obtained
|
|
|
|
with
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
GList* gst_autoplugfactory_get_list (void);
|
2001-02-06 20:06:22 +00:00
|
|
|
|
|
|
|
which will return a GList* of autopluggers.
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
GstAutoplug* gst_autoplugfactory_make ("name");
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
GstAutoplug* gst_autoplugfactory_create (GstAutoplugFactory *autoplug);
|
2001-02-06 20:06:22 +00:00
|
|
|
|
|
|
|
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,
|
2001-03-07 21:52:56 +00:00
|
|
|
GstAutoplugFactory *autoplug);
|
2001-02-06 20:06:22 +00:00
|
|
|
|
|
|
|
This will allow us to only load the autoplugger when needed.
|
|
|
|
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
|
2001-02-06 20:06:22 +00:00
|
|
|
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.
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
- a class method autoplug_caps_list that has to be implemented by
|
2001-02-06 20:06:22 +00:00
|
|
|
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.
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
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.
|
|
|
|
|
2001-02-06 20:06:22 +00:00
|
|
|
|
|
|
|
|