--- /dev/null
+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.