Scheduling of pipelines in GStreamer is done by using a thread for each "group", where a group is a set of elements separated by "queue" elements. Within such a group, scheduling is either push-based or pull-based, depending on which mode is supported by the particular element. If elements support random access to data, such as file sources, then elements downstream in the pipeline become the entry point of this group (i.e. the element controlling the scheduling of other elements). The entry point pulls data from upstream and pushes data downstream, thereby calling data handling functions on either type of element.
In practice, most elements in GStreamer, such as decoders, encoders, etc. only support push-based scheduling, which means that in practice, GStreamer uses a push-based scheduling model.