2. Now all elements *EXCEPT* the sink elements (fakesink in this case), will
go from READY to PAUSED. The sink element will stay in the READY state for
now (while the other elements returned GST_STATE_CHANGE_SUCCESS when
changing from READY to PAUSED, the sink will return GST_STATE_CHANGE_ASYNC,
because it will change its state later when it receives a buffer).
queue: creates its streaming thread
queue: READY -> PAUSED
fakesrc: creates its streaming thread
fakesrc: READY -> PAUSED
queue: enter its streaming thread
fakesrc: enter its streaming thread
3. Now fakesrc will start pushing buffers. Yes, in the PAUSED state. The
PAUSED state and PLAYING state are the "same thing" for non-sink elements.
When the sink, that still is the READY state, receives the first buffer, it
will block its sink pad and proceed to (finally) change its state to PAUSED.
fakesrc: push buffers
fakesink: receives first buffer then blocks
fakesink: READY -> PAUSED
pipeline: READY -> PAUSED
4. Now the pipeline is ready to go to the PLAYING state. The pipeline will
choose a clock from the most upstream element available and it each element
will change its state.
fakesink: unblocks its sink pad
fakesink: PAUSED -> PLAYING
queue: PAUSED -> PLAYING
fakesrc: PAUSED -> PLAYING
pipeline: PAUSED -> PLAYING
There's also another case to consider when the source element is a live
element. In this case, the sink element will go from READY to PAUSED then to
PLAYING only when the pipeline is already in the PLAYING state, because it's
only in this state that live source can produce data (while non-live sources
can produce data in the PAUSED state).