Initialize Tizen 2.3
[framework/multimedia/gstreamer0.10.git] / mobile / docs / pwg / advanced-clock.xml
1 <chapter id="chapter-advanced-clock">
2   <title>Clocking</title>
3
4   <para>
5     When playing complex media, each sound and video sample must be played in a
6     specific order at a specific time. For this purpose, GStreamer provides a
7     synchronization mechanism.
8   </para>
9
10   <sect1 id="section-clock-time-types" xreflabel="Types of time"> 
11     <title> Types of time </title>
12
13     <para>
14       There are two kinds of time in GStreamer. <emphasis
15         role="strong">Clock time</emphasis> is an absolute time. By contrast,
16       <emphasis role="strong">element time</emphasis> is the relative time,
17       usually to the start of the current media stream. The element time
18       represents the time that should have a media sample that is being
19       processed by the element at this time. The element time is calculated by
20       adding an offset to the clock time.
21     </para>
22   </sect1>
23   <sect1 id="section-clocks" xreflabel="Clocks">
24     <title>Clocks</title>
25     <para>
26       GStreamer can use different clocks. Though the system time can be used
27       as a clock, soundcards and other devices provides a better time source. For
28       this reason some elements provide a clock. The method
29       <function>get_clock</function> is implemented in elements that provide
30       one.
31     </para>
32     
33     <para>
34       As clocks return an absolute measure of time, they are not usually used
35       directly. Instead, a reference to a clock is stored in any element that needs
36       it, and it is used internally by GStreamer to calculate the element time.
37     </para>
38   </sect1>
39   
40   <sect1 id="section-time-data-flow" xreflabel="Flow of data between elements
41     and time">
42     <title>
43       Flow of data between elements and time
44     </title>
45     <para>
46       Now we will see how time information travels the pipeline in different states.
47     </para>
48     
49     <para>
50       The pipeline starts playing.
51       The source element typically knows the time of each sample. 
52       <footnote> 
53         <para>
54           Sometimes it
55           is a parser element the one that knows the time, for instance if a pipeline
56           contains a filesrc element connected to a MPEG decoder element, the former 
57           is the one that knows the time of each sample, because the knowledge of
58           when to play each sample is embedded in the MPEG format. In this case this
59           element will be regarded as the source element for this discussion.
60         </para>
61       </footnote> 
62       First, the source element sends a newsegment event. This event carries information
63       about the current relative time of the next sample. This relative time is
64       arbitrary, but it must be consistent with the timestamp that will be
65       placed in buffers. It is expected to be the relative time to the start
66       of the media stream, or whatever makes sense in the case of each media.
67       When receiving it, the other elements adjust their offset of the element time so that this
68       time matches the time written in the event.
69     </para>
70
71     <para>
72       Then the source element sends media samples in buffers. This element places a
73       timestamp in each buffer saying when the sample should be played. When the
74       buffer reaches the sink pad of the last element, this element compares the
75       current element time with the timestamp of the buffer. If the timestamp is
76       higher or equal it plays the buffer, otherwise it waits until the time to
77       place the buffer arrives with <function>gst_element_wait()</function>.
78     </para>
79     
80     
81     <para>
82       If the stream is seeked, the next samples sent will have a timestamp that
83       is not adjusted with the element time. Therefore, the source element must
84       send a newsegment event.
85     </para>
86   </sect1>
87   <sect1 id="section-clock-obligations-of-each-element" xreflabel="Obligations
88     of each element">
89     <title>
90       Obligations of each element.
91     </title>
92     
93     <para>
94       Let us clarify the contract between GStreamer and each element in the
95       pipeline.
96     </para>
97     
98     <sect2>
99       <title>Source elements </title>
100       <para>
101         Source elements (or parsers of formats that provide notion of time, such
102         as MPEG, as explained above) must place a timestamp in each buffer that
103         they deliver. The origin of the time used is arbitrary, but it must
104         match the time delivered in the newsegment event (see below).
105         However, it is expected that the origin is the origin of the media
106         stream.
107       </para>
108       <para>
109         In order to initialize the element time of the rest of the pipeline, a
110         source element must send a newsegment event before starting to play.
111         In addition, after seeking, a newsegment event must be sent, because
112         the timestamp of the next element does not match the element time of the
113         rest of the pipeline.
114       </para>
115       
116     </sect2>
117     
118     <sect2> <title> Sink elements </title>
119       <para>
120         If the element is intended to emit samples at a specific time (real time
121         playing), the element should require a clock, and thus implement the
122         method <function>set_clock</function>.
123       </para>
124       
125       <para>
126         In addition, before playing each sample, if the current element time is
127         less than the timestamp in the sample, it wait until the current time
128         arrives should call <function>gst_element_wait()</function>
129         <footnote>
130           <para>
131             With some schedulers, <function>gst_element_wait()</function> 
132             blocks the pipeline. For instance, if there is one audio sink element
133             and one video sink element, while the audio element is waiting for a
134             sample the video element cannot play other sample. This behaviour is
135             under discussion, and might change in a future release.
136           </para>
137         </footnote>
138       </para>
139     </sect2>
140   </sect1>
141   
142 </chapter>