Merge remote-tracking branch 'origin/0.10'
[platform/upstream/gstreamer.git] / docs / design / part-qos.txt
1 Quality-of-Service
2 ------------------
3
4 Quality of service is about measuring and adjusting the real-time
5 performance of a pipeline.
6
7 The real-time performance is always measured relative to the pipeline
8 clock and typically happens in the sinks when they synchronize buffers
9 against the clock.
10
11 The measurements result in QOS events that aim to adjust the datarate
12 in one or more upstream elements. Two types of adjustments can be
13 made:
14
15   - short time "emergency" corrections based on latest observation
16     in the sinks.
17   - long term rate corrections based on trends observed in the sinks.
18
19 It is also possible for the application to artificially introduce delay
20 between synchronized buffers, this is called throttling. It can be used
21 to reduce the framerate, for example.
22
23
24 Sources of quality problems
25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
26
27  - High CPU load
28  - Network problems
29  - Other resource problems such as disk load, memory bottlenecks etc.
30  - application level throttling
31
32
33 QoS event
34 ~~~~~~~~~
35
36 The QoS event is generated by an element that synchronizes against the clock. It
37 travels upstream and contains the following fields:
38
39  - type, GST_TYPE_QOS_TYPE:
40       The type of the QoS event, we have the following types and the default type
41       is GST_QOS_TYPE_UNDERFLOW:
42
43       GST_QOS_TYPE_OVERFLOW:  an element is receiving buffers too fast and can't
44                               keep up processing them. Upstream should reduce the
45                               rate.
46       GST_QOS_TYPE_UNDERFLOW: an element is receiving buffers too slowly and has
47                               to drop them because they are too late. Upstream should
48                               increase the processing rate.
49       GST_QOS_TYPE_THROTTLE:  the application is asking to add extra delay between
50                               buffers, upstream is allowed to drop buffers
51
52  - timestamp, G_TYPE_UINT64:
53       The timestamp on the buffer that generated the QoS event. These timestamps
54       are expressed in total running_time in the sink so that the value is ever
55       increasing.
56
57  - jitter, G_TYPE_INT64:
58       The difference of that timestamp against the current clock time.  Negative
59       values mean the timestamp was on time. Positive values indicate the
60       timestamp was late by that amount. When buffers are received in time and 
61       throttling is not enabled, the QoS type field is set to OVERFLOW.
62       When throttling, the jitter contains the throttling delay added by the 
63       application and the type is set to THROTTLE.
64
65  - proportion, G_TYPE_DOUBLE:
66       Long term prediction of the ideal rate relative to normal rate to get
67       optimal quality.
68
69 The rest of this document deals with how these values can be calculated
70 in a sink and how the values can be used by other elements to adjust their
71 operations.
72
73
74 QoS message
75 ~~~~~~~~~~~
76
77 A QOS message is posted on the bus whenever an element decides to:
78
79  - drop a buffer because of QoS reasons
80  - change its processing strategy because of QoS reasons (quality)
81
82 It should be expected that creating and posting the QoS message is reasonably
83 fast and does not significantly contribute to the QoS problems. Options to
84 disable this feature could also be presented on elements.
85
86 This message can be posted by a sink/src that performs synchronisation against the
87 clock (live) or it could be dropped by an upstream element that performs QoS
88 because of QOS events received from a downstream element (!live).
89
90 The GST_MESSAGE_QOS contains at least the following info:
91
92  - live: G_TYPE_BOOLEAN:
93       If the QoS message was dropped by a live element such as a sink or a live
94       source. If the live property is FALSE, the QoS message was generated as a
95       response to a QoS event in a non-live element.
96
97  - running-time, G_TYPE_UINT64:
98       The running_time of the buffer that generated the QoS message.
99
100  - stream-time, G_TYPE_UINT64:
101       The stream_time of the buffer that generated the QoS message.
102
103  - timestamp, G_TYPE_UINT64:
104       The timestamp of the buffer that generated the QoS message.
105
106  - duration, G_TYPE_UINT64:
107       The duration of the buffer that generated the QoS message.
108
109
110  - jitter, G_TYPE_INT64:
111       The difference of the running-time against the deadline.  Negative
112       values mean the timestamp was on time. Positive values indicate the
113       timestamp was late (and dropped) by that amount. The deadline can be
114       a realtime running_time or an estimated running_time.
115
116  - proportion, G_TYPE_DOUBLE:
117       Long term prediction of the ideal rate relative to normal rate to get
118       optimal quality.
119
120  - quality, G_TYPE_INT:
121       An element dependent integer value that specifies the current quality
122       level of the element. The default maximum quality is 1000000. 
123
124
125  - format, GST_TYPE_FORMAT
126       Units of the 'processed' and 'dropped' fields. Video sinks and video
127       filters will use GST_FORMAT_BUFFERS (frames). Audio sinks and audio filters
128       will likely use GST_FORMAT_DEFAULT (samples).
129
130  - processed: G_TYPE_UINT64:
131       Total number of units correctly processed since the last state change to
132       READY or a flushing operation.
133
134  - dropped: G_TYPE_UINT64:
135       Total number of units dropped since the last state change to READY or a
136       flushing operation.
137
138 The 'running-time' and 'processed' fields can be used to estimate the average
139 processing rate (framerate for video).
140
141 Elements might add additional fields in the message which are documented in the
142 relevant elements or baseclasses.
143
144
145 Collecting statistics
146 ~~~~~~~~~~~~~~~~~~~~~
147
148 A buffer with timestamp B1 arrives in the sink at time T1. The buffer
149 timestamp is then synchronized against the clock which yields a jitter J1
150 return value from the clock. The jitter J1 is simply calculated as
151
152   J1 = CT - B1
153
154 Where CT is the clock time when the entry arrives in the sink. This value
155 is calculated inside the clock when we perform gst_clock_entry_wait().
156
157 If the jitter is negative, the entry arrived in time and can be rendered
158 after waiting for the clock to reach time B1 (which is also CT - J1).
159
160 If the jitter is positive however, the entry arrived too late in the sink 
161 and should therefore be dropped. J1 is the amount of time the entry was late.
162
163 Any buffer that arrives in the sink should generate a QoS event upstream.
164
165 Using the jitter we can calculate the time when the buffer arrived in the
166 sink: 
167      
168   T1 = B1 + J1.                                (1)
169
170 The time the buffer leaves the sink after synchronisation is measured as:
171
172   T2 = B1 + (J1 < 0 ? 0 : J1)                  (2)
173
174 For buffers that arrive in time (J1 < 0) the buffer leaves after synchronisation
175 which is exactly B1. Late buffers (J1 >= 0) leave the sink when they arrive,
176 whithout any synchronisation, which is T2 = T1 = B1 + J1.
177
178 Using a previous T0 and a new T1, we can calculate the time it took for
179 upstream to generate a buffer with timestamp B1.
180
181   PT1 = T1 - T0                                (3)
182
183 We call PT1 the processing time needed to generate buffer with timestamp B1.
184
185 Moreover, given the duration of the buffer D1, the current data rate (DR1) of 
186 the upstream element is given as:
187
188        PT1   T1 - T0
189  DR1 = --- = -------                           (4)
190        D1      D1
191
192 For values 0.0 < DR1 <= 1.0 the upstream element is producing faster than
193 real-time. If DR1 is exactly 1.0, the element is running at a perfect speed.
194
195 Values DR1 > 1.0 mean that the upstream element cannot produce buffers of
196 duration D1 in real-time. It is exactly DR1 that tells the amount of speedup
197 we require from upstream to regain real-time performance.
198
199 An element that is not receiving enough data is said to be underflowed.
200
201
202 Element measurements
203 ~~~~~~~~~~~~~~~~~~~~
204
205 In addition to the measurements of the datarate of the upstream element, a
206 typical element must also measure its own performance. Global pipeline 
207 performance problems can indeed also be caused by the element itself when it
208 receives too much data it cannot process in time. The element is then said to
209 be overflowed.
210
211
212 Short term correction
213 ---------------------
214
215 The timestamp and jitter serve as short term correction information
216 for upstream elements. Indeed, given arrival time T1 as given in (1)
217 we can be certain that buffers with a timestamp B2 < T1 will be too late
218 in the sink.
219
220 In case of a positive jitter we can therefore send a QoS event with
221 a timestamp B1, jitter J1 and proportion given by (4).
222
223 This allows an upstream element to not generate any data with timestamps
224 B2 < T1, where the element can derive T1 as B1 + J1.
225
226 This will effectively result in frame drops.
227
228 The element can even do a better estimation of the next valid timestamp it
229 should output.
230
231 Indeed, given the element generated a buffer with timestamp B0 that arrived
232 in time in the sink but then received a QoS event stating B1 arrived J1
233 too late. This means generating B1 took (B1 + J1) - B0 = T1 - T0 = PT1, as 
234 given in (3). Given the buffer B1 had a duration D1 and assuming that
235 generating a new buffer B2 will take the same amount of processing time,
236 a better estimation for B2 would then be:
237
238   B2 = T1 + D2 * DR1
239
240  expanding gives:
241
242   B2 = (B1 + J1) + D2 * (B1 + J1 - B0)
243                         --------------  
244                              D1
245
246  assuming the durations of the frames are equal and thus D1 = D2:
247
248   B2 = (B1 + J1) + (B1 + J1 - B0)
249
250   B2 =  2 * (B1 + J1) - B0
251
252  also:
253
254   B0 = B1 - D1
255
256  so:
257
258   B2 =  2 * (B1 + J1) - (B1 - D1)
259
260 Which yields a more accurate prediction for the next buffer given as:
261
262   B2 =  B1 + 2 * J1 + D1                          (5)
263
264
265 Long term correction
266 --------------------
267
268 The datarate used to calculate (5) for the short term prediction is based
269 on a single observation. A more accurate datarate can be obtained by
270 creating a running average over multiple datarate observations.
271
272 This average is less susceptible to sudden changes that would only influence
273 the datarate for a very short period.
274
275 A running average is calculated over the observations given in (4) and is
276 used as the proportion member in the QoS event that is sent upstream.
277
278 Receivers of the QoS event should permanently reduce their datarate 
279 as given by the proportion member. Failure to do so will certainly lead to
280 more dropped frames and a generally worse QoS.
281
282
283 Throttling
284 ----------
285
286 In throttle mode, the time distance between buffers is kept to a configurable
287 throttle interval. This means that effectively the buffer rate is limited
288 to 1 buffer per throttle interval. This can be used to limit the framerate,
289 for example.
290
291 When an element is configured in throttling mode (this is usually only
292 implemented on sinks) it should produce QoS events upstream with the jitter
293 field set to the throttle interval. This should instruct upstream elements to
294 skip or drop the remaining buffers in the configured throttle interval.
295
296 The proportion field is set to the desired slowdown needed to get the
297 desired throttle interval. Implementations can use the QoS Throttle type,
298 the proportion and the jitter member to tune their implementations. 
299
300
301 QoS strategies
302 --------------
303
304 Several strategies exist to reduce processing delay that might affect
305 real time performance.
306
307  - lowering quality
308    - dropping frames (reduce CPU/bandwidth usage)
309    - switch to a lower decoding/encoding quality (reduce algorithmic
310      complexity)
311    - switch to a lower quality source (reduce network usage)
312  - increasing thread priorities
313    - switch to real-time scheduling
314    - assign more CPU cycles to critial pipeline parts
315    - assign more CPU(s) to critical pipeline parts
316
317
318 QoS implementations
319 -------------------
320
321 Here follows a small overview of how QoS can be implemented in a range of
322 different types of elements.
323
324
325 GstBaseSink
326 -----------
327
328 The primary implementor of QoS is GstBaseSink. It will calculate the following
329 values:
330
331  - upstream running average of processing time (5) in stream time.
332  - running average of buffer durations.
333  - running average of render time (in system time)
334  - rendered/dropped buffers
335
336 The processing time and the average buffer durations will be used to
337 calculate a proportion.
338
339 The processing time in system time is compared to render time to decide if
340 the majority of the time is spend upstream or in the sink itself. This value
341 is used to decide overflow or underflow.
342
343 The number of rendered and dropped buffers is used to query stats on the sink.
344
345 A QoS event with the most current values is sent upstream for each buffer 
346 that was received by the sink.
347
348 Normally QoS is only enabled for video pipelines. The reason being that drops
349 in audio are more disturbing than dropping video frames. Also video requires in 
350 general more processing than audio.
351
352 Normally there is a threshold for when buffers get dropped in a video sink. Frames
353 that arrive 20 milliseconds late are still rendered as it is not noticeable for
354 the human eye.
355
356 A QoS message is posted whenever a (part of a) buffer is dropped.
357
358 In throttle mode, the sink sends QoS event upstream with the timestamp set to
359 the running_time of the latest buffer and the jitter set to the throttle interval.
360 If the throttled buffer is late, the lateness is subtracted from the throttle
361 interval in order to keep the desired throttle interval. 
362
363
364 GstBaseTransform
365 ----------------
366
367 Transform elements can entirely skip the transform based on the timestamp and
368 jitter values of recent QoS event since these buffers will certainly arrive
369 too late.
370
371 With any intermediate element, the element should measure its performance to
372 decide if it is responsible for the quality problems or any upstream/downstream
373 element.
374
375 some transforms can reduce the complexity of their algorithms. Depending on the
376 algorithm, the changes in quality may have disturbing visual or audible effect 
377 that should be avoided.
378
379 A QoS message should be posted when a frame is dropped or when the quality
380 of the filter is reduced. The quality member in the QOS message should reflect
381 the quality setting of the filter.
382
383
384 Video Decoders
385 --------------
386
387 A video decoder can, based on the codec in use, decide to not decode intermediate
388 frames. A typical codec can for example skip the decoding of B-frames to reduce
389 the CPU usage and framerate.
390
391 If each frame is independantly decodable, any arbitrary frame can be skipped based
392 on the timestamp and jitter values of the latest QoS event. In addition can the
393 proportion member be used to permanently skip frames.
394
395 It is suggested to adjust the quality field of the QoS message with the expected
396 amount of dropped frames (skipping B and/or P frames). This depends on the
397 particular spacing of B and P frames in the stream. If the quality control would
398 result in half of the frames to be dropped (typical B frame skipping), the
399 quality field would be set to 1000000 * 1/2 = 500000. If a typical I frame spacing
400 of 18 frames is used, skipping B and P frames would result in 17 dropped frames
401 or 1 decoded frame every 18 frames. The quality member should be set to
402 1000000 * 1/18 = 55555.
403
404  - skipping B frames: quality = 500000
405  - skipping P/B frames: quality = 55555 (for I-frame spacing of 18 frames)
406
407
408 Demuxers
409 --------
410
411 Demuxers usually cannot do a lot regarding QoS except for skipping frames to the next
412 keyframe when a lateness QoS event arrives on a source pad.
413
414 A demuxer can however measure if the performance problems are upstream or downstream
415 and forward an updated QoS event upstream.
416
417 Most demuxers that have multiple output pads might need to combine the QoS
418 events on all the pads and derive an aggregated QoS event for the upstream element.
419
420
421 Sources
422 -------
423
424 The QoS events only apply to push based sources since pull based sources are entirely
425 controlled by another downstream element.
426
427 Sources can receive a overflow or underflow event that can be used to switch to
428 less demanding source material. In case of a network stream, a switch could be done
429 to a lower or higher quality stream or additional enhancement layers could be used
430 or ignored.
431
432 Live sources will automatically drop data when it takes too long to process the data 
433 that the element pushes out. 
434
435 Live sources should post a QoS message when data is dropped.
436