# GstPipeline A `GstPipeline` is usually a toplevel bin and provides all of its children with a clock. A `GstPipeline` also provides a toplevel `GstBus` (see [gstbus](design/gstbus.md)) The pipeline also calculates the `running_time` based on the selected clock (see also clocks.txt and [synchronisation](design/synchronisation.md)). The pipeline will calculate a global latency for the elements in the pipeline. (See also [latency](design/latency.md)). ## State changes In addition to the normal state change procedure of its parent class `GstBin`, the pipeline performs the following actions during a state change: - `NULL` → `READY`: - set the bus to non-flushing - `READY` → `PAUSED`: - reset the `running_time` to 0 - `PAUSED` → `PLAYING`: - Select a clock. - calculate `base_time` using the `running_time`. - calculate and distribute latency. - set clock and `base_time` on all elements before performing the state change. - `PLAYING` → `PAUSED`: - calculate the `running_time` when the pipeline was `PAUSED`. - `READY` → `NULL`: - set the bus to flushing (when auto-flushing is enabled) The `running_time` represents the total elapsed time, measured in clock units, that the pipeline spent in the PLAYING state (see [synchronisation](design/synchronisation.md)). The `running_time` is set to 0 after a flushing seek. ## Clock selection Since all of the children of a `GstPipeline` must use the same clock, the pipeline must select one. This clock selection happens when the pipeline goes to the `PLAYING` state. The default clock selection algorithm works as follows: - If the application selected a clock, use that clock. (see below) - Use the clock of the most upstream element that can provide one. This selection is performed by iterating the element starting from the sinks going upstream. - since this selection procedure happens in the `PAUSED` → `PLAYING` state change, all the sinks are prerolled and we can thus be sure that each sink is linked to some upstream element. - in the case of a live pipeline (`NO_PREROLL`), the sink will not yet be prerolled and the selection process will select the clock of a more upstream element. - Use `GstSystemClock`, this only happens when no element provides a usable clock. The application can influence this clock selection with two methods: `gst_pipeline_use_clock()` and `gst_pipeline_auto_clock()`. The `_use_clock()` method forces the use of a specific clock on the pipeline regardless of what clock providers are available. Passing a NULL `GstClock *clock` parameter to this method disables all clocking and makes the pipeline run as fast as possible. The `_auto_clock()` method removes the fixed clock and reactivates the auto- matic clock selection algorithm described above. ## GstBus A `GstPipeline` provides a `GstBus` to the application. The bus can be retrieved with `gst_pipeline_get_bus()` and can then be used to retrieve messages posted by the elements in the pipeline (see [gstbus](design/gstbus.md)).