docs/design/part-activation.txt: Notes on how activation should work -- not quite...
[platform/upstream/gstreamer.git] / docs / design / part-activation.txt
1 Pad activation
2 --------------
3
4 When changing states, a bin will set the state on all of its children in
5 sink-to-source order. As elements undergo the READY->PAUSED transition,
6 their pads are activated so as to prepare for data flow. Some pads will
7 start tasks to drive the data flow.
8
9 Pads can be activated in one of two modes, PUSH and PULL. PUSH pads are
10 the normal case, where the source pad in a link sends data to the sink
11 pad via gst_pad_push(). PULL pads instead have sink pads request data
12 from the source pads via gst_pad_pull_range().
13
14 To activate a pad, the core will call gst_pad_set_active() with a TRUE
15 argument, indicating that the pad should be active. If the pad is
16 already active, be it in a PUSH or PULL mode, gst_pad_set_active() will
17 return without doing anything. Otherwise it will call the activation
18 function of the pad.
19
20 Because the core does not know in which mode to activate a pad (PUSH or
21 PULL), it delegates that choice to a method on the pad, activate(). The
22 activate() function of a pad should choose whether to operate in PUSH or
23 PULL mode. Once the choice is made, it should call one of the two
24 mode-specific activation functions, activate_push() or activate_pull().
25 The default activate() function will call activate_push(), as it is the
26 default mechanism for data flow. A sink pad that supports either mode of
27 operation might call activate_pull() if calling check_get_range()
28 returns TRUE, and activate_push() otherwise.
29
30 Consider the case fakesrc ! fakesink, where fakesink is configured to
31 operate in PULL mode. State changes in the pipeline will start with
32 fakesink, which is the most downstream element. The core will call
33 activate() on fakesink's sink pad. For fakesink to go into PULL mode, it
34 needs to implement a custom activate() function that will call
35 activate_pull() on its sink pad (because the default is to use PUSH
36 mode). activate_pull() is then responsible for starting the task that
37 pulls from fakesrc:src. Clearly, fakesrc needs to be notified that
38 fakesrc is about to pull on its src pad, even though the pipeline has
39 not yet changed fakesrc's state. For this reason, activate_pull() must
40 first call activate_pull() on fakesink:sink's peer before starting
41 fakesink's task.
42
43 In short, upstream elements operating in PULL mode must be ready to
44 produce data in READY, after having activate_pull() called on their
45 source pad. Also, a call to activate_pull() needs to propagate through
46 the pipeline to every pad that a gst_pad_pull() will reach. In the case
47 fakesrc ! identity ! fakesink, calling activate_pull() on identity's
48 source pad would need to activate its sink pad in pull mode as well,
49 which should propagate all the way to fakesrc.
50
51 If, on the other hand, fakesrc ! fakesink is operating in PUSH mode, the
52 activation sequence is different. First, activate() on fakesink:sink
53 calls activate_push() on fakesink:sink. Then fakesrc's pads are
54 activated: sources first, then sinks (of which fakesrc has none).
55 fakesrc:src's activation function is then called.
56
57 Note that it does not make sense to set an activation function on a
58 source pad. The peer of a source pad is downstream, meaning it should
59 have been activated first. If it was activated in PULL mode, the the
60 source pad should have already had activate_pull() called on it, and
61 thus needs no further activation. Otherwise it should be in PUSH mode,
62 which is the choice of the default activation function.
63
64 So, in the PUSH case, the default activation function chooses PUSH mode,
65 which calls activate_push(), which will then start a task on the source
66 pad and begin pushing. In this way PUSH scheduling is a bit easier,
67 because it follows the order of state changes in a pipeline. fakesink is
68 already in PAUSED with an active sink pad by the time fakesrc starts
69 pushing data.
70
71 Deactivation
72 ------------
73
74 Pad deactivation occurs when a pad is unlinked, or when its parent goes
75 into the READY state. gst_pad_set_active() is called with a FALSE
76 argument, which then calls activate_push() or activate_pull() with a
77 FALSE argument, depending on the activation mode of the pad.
78
79 Mode switching
80 --------------
81
82 Changing from push to pull modes needs a bit of thought.