PUSH vs PULL (This is a writedown of ideas I plan to update whenever I find issues. This should be fleshed out when doing the threadsafety / buffer passing changes.) GStreamer allows 3 different forms of elements: - loopbased: Loopbased elements may push and pull from every pad however they want. They're therefore heaviest on the scheduler and for latency or similar considerations. - chainbased: Chainbased elements have one sinkpad. Data gets pushed into a function attached to the pad. => PUSH based - getbased: Getbased elements have no sinkpads. Every sourcepad has a getfunction that produces data on request. => PULL based The current problem is that PUSH and PULL based elements are quite limited in what they may or may not do (especially PULL based elements). Some libraries elements link to might also expect the architecture around them to work in a specific way (libogg requires the ogg input to be pull-based, JACK is PULL-based on sinks and PUSH-based on sinks). This often requires costly wrapping. Inside a scheduler cothread switches can be avoided (which makes the pipeline faster and scheduling less error-prone) if a PUSH-based element is connected on the push-side of the pipeline. (Same goes with PULL-based on the pull-side). So a pipeline with elements like "pull-pull-loop-push" works without cothread switches while a pipeline like "push-loop-pull" needs 2. Even "push-pull" needs one. I'm under the impression that push-vs-pull is often best decided by the application in use. (Video players probably prefer PULL because they display on demand, live recorders prefer PUSH.) Since many elements probably don't care if they're PUSH or PULL based it would be nice if an element could implement both and use whatever suits better. (The code to achieve this should obviously be abstracted into superclasses like videofilter.) references: MPlayer (http://www.mplayerhq.hu) - push-based architecture on version 1, switching to PULL-based on version 2.