summaryrefslogtreecommitdiff
path: root/docs/design/part-gstbus.txt
blob: 8e8064e8d33b321d303b510841e3e540f5f817ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
GstBus
------

The GstBus is an object responsible for delivering GstMessages in
a first-in first-out way from the streaming threads to the application.

Since the application typically only wants to deal with delivery of these
messages from one thread, the GstBus will marshall the messages between
different threads. This is important since the actual streaming of media
is done in another threads (streaming threads) than the application. It is
also important to not block the streaming threads while the application deals
with the message.

The GstBus provides support for GSource based notifications. This makes it
possible to handle the delivery in the glib mainloop. Different GSources 
can be added to the same bin provided they listen to different message types.

A message is posted on the bus with the gst_bus_post() method. With the
gst_bus_peek() and _pop() methods one can look at or retrieve a previously
posted message.

The bus can be polled with the gst_bus_poll() method. This methods blocks
up to the specified timeout value until one of the specified messages types
is posted on the bus. The application can then _pop() the messages from the
bus to handle them. 

It is also possible to get messages from the bus without any thread 
marshalling with the gst_bus_set_sync_handler() method. This makes it
possible to react to a message in the same thread that posted the
message on the bus. This should only be used if the application is able
to deal with messages from different threads.

If no messages are popped from the bus with either a GSource or gst_bus_pop(),
they remain on the bus.

When a pipeline or bin goes from READY into NULL state, it will set its bus
to flushing, ie. the bus will drop all existing and new messages on the bus,
This is necessary because bus messages hold references to the bin/pipeline
or its elements, so there are circular references that need to be broken if
one ever wants to be able to destroy a bin or pipeline properly.