| Time in Gstreamer |
| |
| When talking about time in streams (or "clocking"), people often confuse 3 |
| different things that need to be treated seperately. Older designs in GStreamer |
| confused those and this made it difficult to design solutions for time |
| management. |
| |
| 1) clock time |
| There are many clock providers in GStreamer. In normal circumstances there is |
| only one clock, commonly referred to as the system clock. But in the GStreamer |
| case there are others - like a sound card. If a sound card claims to output |
| 44100 samples/sec, one second in the sound cards clock has elapsed when 44100 |
| samples have been processed. If a webcam claims to deliver 25 pictures/sec a |
| second has elapsed after processing 25 pictures. This concept is useful in |
| starvation cases - when you use the clock of the sound card and due to high |
| load (or the hard disc of your laptop needing to start spinning again to read |
| in an mp3) no samples are processed, the clock does not advance. A system clock |
| would merrily go on ticking and make your song jump. |
| |
| 2) element time |
| Some elements need to know when to output a buffer. Therefore buffers have |
| timestamps. But there needs to be a way those timestamps to the time reported by |
| clocks. This is were element time comes in. GStreamer takes transparently care |
| of this by remembering at what clock time you set your element to PLAYING and |
| computes the time that has passed since then automatically. It takes care of the |
| PAUSE state, too. There is even a way to adjust the time in the case of a |
| discontinuity event (which most likely happens after seeking). |
| |
| 3) synchronization |
| It is a common case (especially in video playback) that people want to |
| synchronize two elements (audio and video output), so that they report the same |
| time. This is an unsolved problem in GStreamer and is only handled implicitly. |
| To aid in this, clocks have "clock events". An event happens when an element |
| does something, for example changing states. Because people want to set the |
| states of multiple elements at once, but computers serialize everything, the |
| actual state setting on the elements is serialized, too. If however such events |
| happen shortly after each other, GStreamer assumes they were meant to happen at |
| the same time and handles this as such. |
| |