Cothreads Cothreads are user-space threads that greatly reduce context switching overhead introduced by regular kernel threads. Cothreads are also used to handle the more complex elements. A cothread is created by a GstBin whenever an element is found inside the bin that has one or more of the following properties: The element is loop-based instead of chain-based The element has multiple input pads The element has the MULTI_IN flag set The GstBin will create a cothread context for all the elements in the bin so that the elements will interact in cooperative multithreading. Before proceding to the concept of loop-based elements we will first explain the chain-based elements Chain-based elements Chain based elements receive a buffer of data and are supposed to handle the data and perform a gst_pad_push. The basic main function of a chain-based element is like: static void chain_function (GstPad *pad, GstBuffer *buffer) { GstBuffer *outbuffer; .... // process the buffer, create a new outbuffer ... gst_pad_push (srcpad, outbuffer); } Loop-based elements As opposed to chain-based elements, Loop-based elements enter an infinite loop that looks like this: GstBuffer *buffer, *outbuffer; while (1) { buffer = gst_pad_pull (sinkpad); ... // process buffer, create outbuffer ... gst_pad_push (srcpad, outbuffer); } The loop-based elements request a buffer whenever they need one. When the request for a buffer cannot immedialty satisfied, the control will be given to the source element of the loop-based element until it performs a push on its source pad. At that time the control is handed back to the loop-based element, etc... The the execution trace can get fairly complex using cothreads when there are multiple input/output pads for the loop-based element. There is no problem in putting cothreaded elements into a GstThread to create even more complex pipelines with both user and kernel space threads.