docs: manual: fix formatting
[platform/upstream/gstreamer.git] / docs / pwg / advanced-clock.xml
index e69de29..a0ffc4f 100644 (file)
@@ -0,0 +1,173 @@
+<chapter id="chapter-advanced-clock">
+  <title>Clocking</title>
+
+  <para>
+    When playing complex media, each sound and video sample must be played in a
+    specific order at a specific time. For this purpose, GStreamer provides a
+    synchronization mechanism.
+  </para>
+
+  <sect1 id="section-clocks" xreflabel="Clocks">
+    <title>Clocks</title>
+    <para>
+      Time in &GStreamer; is defined as the value returned from a particular 
+      <classname>GstClock</classname> object from the method
+      <function>gst_clock_get_time ()</function>. 
+    </para>
+    <para>
+      In a typical computer, there are many sources that can be used as a
+      time source, e.g., the system time, soundcards, CPU performance
+      counters, ... For this reason, there are many
+      <classname>GstClock</classname> implementations available in &GStreamer;.
+      The clock time doesn't always start from 0 or from some known value.
+      Some clocks start counting from some known start date, other clocks start
+      counting since last reboot, etc...
+    </para>
+    <para>
+      As clocks return an absolute measure of time, they are not usually used
+      directly. Instead, differences between two clock times are used to
+      measure elapsed time according to a clock.
+    </para>
+  </sect1>
+
+  <sect1 id="section-clock-time-types" xreflabel="Clock running-time"> 
+    <title> Clock running-time </title>
+    <para>
+      A clock returns the <emphasis role="strong">absolute-time</emphasis>
+      according to that clock with <function>gst_clock_get_time ()</function>.
+      From the absolute-time is a <emphasis role="strong">running-time</emphasis>
+      calculated, which is simply the difference between a previous snapshot
+      of the absolute-time called the <emphasis role="strong">base-time</emphasis>.
+      So:
+    </para>
+    <para>
+      running-time = absolute-time - base-time
+    </para>
+    <para>
+      A &GStreamer; <classname>GstPipeline</classname> object maintains a 
+      <classname>GstClock</classname> object and a base-time when it goes
+      to the PLAYING state.  The pipeline gives a handle to the selected
+      <classname>GstClock</classname> to each element in the pipeline along
+      with selected base-time. The pipeline will select a base-time in such
+      a way that the running-time reflects the total time spent in the
+      PLAYING state. As a result, when the pipeline is PAUSED, the
+      running-time stands still.
+    </para>
+    <para>
+      Because all objects in the pipeline have the same clock and base-time,
+      they can thus all calculate the running-time according to the pipeline
+      clock.
+    </para>
+  </sect1>
+
+  <sect1 id="section-buffer-time-types" xreflabel="Buffer running-time"> 
+    <title> Buffer running-time </title>
+    <para>
+      To calculate a buffer running-time, we need a buffer timestamp and
+      the SEGMENT event that preceded the buffer. First we can convert
+      the SEGMENT event into a <classname>GstSegment</classname> object
+      and then we can use the
+      <function>gst_segment_to_running_time ()</function> function to
+      perform the calculation of the buffer running-time.
+    </para>
+    <para>
+      Synchronization is now a matter of making sure that a buffer with a
+      certain running-time is played when the clock reaches the same
+      running-time. Usually this task is done by sink elements. Sink also
+      have to take into account the latency configured in the pipeline and
+      add this to the buffer running-time before synchronizing to the
+      pipeline clock.
+    </para>
+  </sect1>
+  
+  
+  <sect1 id="section-clock-obligations-of-each-element" xreflabel="Obligations
+    of each element">
+    <title>
+      Obligations of each element.
+    </title>
+    
+    <para>
+      Let us clarify the contract between GStreamer and each element in the
+      pipeline.
+    </para>
+    
+    <sect2>
+      <title>Non-live source elements </title>
+      <para>
+        Non-live source elements must place a timestamp in each buffer that
+        they deliver when this is possible.  They must choose the timestamps
+        and the values of the SEGMENT event in such a way that the
+        running-time of the buffer starts from 0.
+      </para>
+      <para>
+        Some sources, such as filesrc, is not able to generate timestamps
+        on all buffers. It can and must however create a timestamp on the
+        first buffer (with a running-time of 0).
+      </para>
+      <para>
+        The source then pushes out the SEGMENT event followed by the
+        timestamped buffers.
+      </para>
+    </sect2>
+
+    <sect2>
+      <title>Live source elements </title>
+      <para>
+        Live source elements must place a timestamp in each buffer that
+        they deliver. They must choose the timestamps and the values of the
+        SEGMENT event in such a way that the running-time of the buffer
+        matches exactly the running-time of the pipeline clock when the first 
+        byte in the buffer was captured.
+      </para>
+    </sect2>
+
+    <sect2>
+      <title>Parser/Decoder/Encoder elements </title>
+      <para>
+        Parser/Decoder elements must use the incoming timestamps and transfer
+        those to the resulting output buffers. They are allowed to interpolate
+        or reconstruct timestamps on missing input buffers when they can.
+      </para>
+    </sect2>
+
+    <sect2>
+      <title>Demuxer elements </title>
+      <para>
+        Demuxer elements can usually set the timestamps stored inside the media
+        file onto the outgoing buffers. They need to make sure that outgoing
+        buffers that are to be played at the same time have the same
+        running-time. Demuxers also need to take into account the incoming
+        timestamps on buffers and use that to calculate an offset on the outgoing
+        buffer timestamps.
+      </para>
+    </sect2>
+
+    <sect2>
+      <title>Muxer elements</title>
+      <para>
+        Muxer elements should use the incoming buffer running-time to mux the
+        different streams together. They should copy the incoming running-time
+        to the outgoing buffers.
+      </para>
+    </sect2>
+    
+    <sect2>
+      <title>Sink elements</title>
+      <para>
+       If the element is intended to emit samples at a specific time (real time
+       playing), the element should require a clock, and thus implement the
+       method <function>set_clock</function>.
+      </para>
+      <para>
+        The sink should then make sure that the sample with running-time is played
+        exactly when the pipeline clock reaches that running-time + latency.
+        Some elements might use the clock API such as
+        <function>gst_clock_id_wait()</function>
+        to perform this action. Other sinks might need to use other means of
+        scheduling timely playback of the data.
+      </para>
+    </sect2>
+  </sect1>
+  
+</chapter>