| |
| The autoplugger is a custom bin with a set of custom add/remove methods. |
| The point is to virtually add a set of plugins that should take part in |
| the autoplugging (like the src, sink elements). The autoplugger should |
| try hard to included these plugins in the final pipeline. |
| |
| The autoplugger has to be a bin because else we cannot put it into the |
| paused state when dynamically connecting elements. |
| |
| We cannot include the intermediate elements or sink/src elements to the bin |
| right away because else they will be scheduled by the scheduler. |
| |
| The bin will use the elementfactory klass field to get a basic idea about |
| the plugin: |
| |
| - the 'Source' keyword is used to detect source elements |
| - the 'Sink' keyword is used to detect the sink elements or targets |
| of the autoplugging. |
| - other elements are considered intermediate elements and will be |
| inserted when possible. |
| |
| |
| algorithm: |
| |
| - Autoplugging starts from a source element, it will be added to the real bin. |
| - for all unconnected pads: |
| - if pad has NULL padtemplate caps add typefind + autoplugcache to the pad |
| - if unconnected pad has fixed caps, find element in repository that can |
| connect. |
| - first check elements added to the bin |
| - test elements ordered by rank |
| - favour 'Demux' type elements close to sources, 'Decoder' elements after |
| that and 'Filter' elements close to sinks. |
| - link dummy element with pads with non-fixed caps. The dummy element getcaps |
| function will use the repository to return a list of compatible caps, so that |
| the element can choose freely. The dummy element is replaced with a real |
| element when caps become fixed. |
| - all new_pad signals and caps notifications trigger the above actions. |