| Events |
| ------ |
| |
| Events are objects passed around in parallel to the buffer dataflow to |
| notify elements of various events. |
| |
| Events are received on pads using the event function. Some events should |
| be interleaved with the data stream so they require taking the STREAM_LOCK, |
| others don't. |
| |
| Different types of events exist to implement various functionalities. |
| |
| GST_EVENT_FLUSH_START: data is to be discarded |
| GST_EVENT_FLUSH_STOP: data is allowed again |
| GST_EVENT_CAPS: Format information about the following buffers |
| GST_EVENT_SEGMENT: Timing information for the following buffers |
| GST_EVENT_TAG: Stream metadata. |
| GST_EVENT_BUFFERSIZE: Buffer size requirements |
| GST_EVENT_SINK_MESSAGE: An event turned into a message by sinks |
| GST_EVENT_EOS: no more data is to be expected on a pad. |
| GST_EVENT_QOS: A notification of the quality of service of the stream |
| GST_EVENT_SEEK: A seek should be performed to a new position in the stream |
| GST_EVENT_NAVIGATION: A navigation event. |
| GST_EVENT_LATENCY: Configure the latency in a pipeline |
| GST_EVENT_STEP: Stepping event |
| GST_EVENT_RECONFIGURE: stream reconfigure event |
| |
| * GST_EVENT_DRAIN: Play all data downstream before returning. |
| |
| * not yet implemented, under investigation, might be needed to do still frames |
| in DVD. |
| |
| |
| src pads |
| -------- |
| |
| A gst_pad_push_event() on a srcpad will first store the sticky event in the |
| sticky array before sending the event to the peer pad. If there is no peer pad |
| and the event was not stored in the sticky array, FALSE is returned. |
| |
| Flushing pads will refuse the events and will not store the sticky events. |
| |
| |
| sink pads |
| --------- |
| |
| A gst_pad_send_event() on a sinkpad will call the event function on the pad. If |
| the event function returns success, the sticky event is stored in the sticky |
| event array and the event is marked for update. |
| |
| When the pad is flushing, the _send_event() function returns FALSE immediately. |
| |
| When the next data item is pushed, the pending events are pushed first. |
| |
| This ensures that the event function is never called for flushing pads and that |
| the sticky array only contains events for which the event function returned |
| success. |
| |
| |
| pad link |
| -------- |
| |
| When linking pads, the srcpad sticky events are marked for update when they are |
| different from the sinkpad events. The next buffer push will push the events to |
| the sinkpad. |
| |
| |
| FLUSH_START/STOP |
| ~~~~~~~~~~~~~~~~ |
| |
| A flush event is sent both downstream and upstream to clear any pending data |
| from the pipeline. This might be needed to make the graph more responsive |
| when the normal dataflow gets interrupted by for example a seek event. |
| |
| Flushing happens in two stages. |
| |
| 1) a source element sends the FLUSH_START event to the downstream peer element. |
| The downstream element starts rejecting buffers from the upstream elements. It |
| sends the flush event further downstream and discards any buffers it is |
| holding as well as return from the chain function as soon as possible. |
| This makes sure that all upstream elements get unblocked. |
| This event is not synchronized with the STREAM_LOCK and can be done in the |
| application thread. |
| |
| 2) a source element sends the FLUSH_STOP event to indicate |
| that the downstream element can accept buffers again. The downstream |
| element sends the flush event to its peer elements. After this step dataflow |
| continues. The FLUSH_STOP call is synchronized with the STREAM_LOCK so any |
| data used by the chain function can safely freed here if needed. Any |
| pending EOS events should be discarded too. |
| |
| After the flush completes the second stage, data is flowing again in the pipeline |
| and all buffers are more recent than those before the flush. |
| |
| For elements that use the pullrange function, they send both flush events to |
| the upstream pads in the same way to make sure that the pullrange function |
| unlocks and any pending buffers are cleared in the upstream elements. |
| |
| A FLUSH_START may instruct the pipeline to distribute a new base_time to |
| elements so that the running_time is reset to 0. |
| (see part-clocks.txt and part-synchronisation.txt). |
| |
| |
| EOS |
| ~~~ |
| |
| The EOS event can only be sent on a sinkpad. It is typically emitted by the |
| source element when it has finished sending data. This event is mainly sent |
| in the streaming thread but can also be sent from the application thread. |
| |
| The downstream element should forward the EOS event to its downstream peer |
| elements. This way the event will eventually reach the sinks which should |
| then post an EOS message on the bus when in PLAYING. |
| |
| An element might want to flush its internally queued data before forwarding |
| the EOS event downstream. This flushing can be done in the same thread as |
| the one handling the EOS event. |
| |
| For elements with multiple sink pads it might be possible to wait for EOS on |
| all the pads before forwarding the event. |
| |
| The EOS event should always be interleaved with the data flow, therefore the |
| GStreamer core will take the STREAM_LOCK. |
| |
| Sometimes the EOS event is generated by another element than the source, for |
| example a demuxer element can generate an EOS event before the source element. |
| This is not a problem, the demuxer does not send an EOS event to the upstream |
| element but returns GST_FLOW_EOS, causing the source element to stop |
| sending data. |
| |
| An element that sends EOS on a pad should stop sending data on that pad. Source |
| elements typically pause() their task for that purpose. |
| |
| By default, a GstBin collects all EOS messages from all its sinks before |
| posting the EOS message to its parent. |
| |
| The EOS is only posted on the bus by the sink elements in the PLAYING state. If |
| the EOS event is received in the PAUSED state, it is queued until the element |
| goes to PLAYING. |
| |
| A FLUSH_STOP event on an element flushes the EOS state and all pending EOS messages. |
| |
| |
| SEGMENT |
| ~~~~~~~ |
| |
| A segment event is sent downstream by an element to indicate that the following |
| group of buffers start and end at the specified positions. The newsegment event |
| also contains the playback speed and the applied rate of the stream. |
| |
| Since the stream time is always set to 0 at start and after a seek, a 0 |
| point for all next buffer's timestamps has to be propagated through the |
| pipeline using the SEGMENT event. |
| |
| Before sending buffers, an element must send a SEGMENT event. An element is |
| free to refuse buffers if they were not preceded by a SEGMENT event. |
| |
| Elements that sync to the clock should store the SEGMENT start and end values |
| and subtract the start value from the buffer timestamp before comparing |
| it against the stream time (see part-clocks.txt). |
| |
| An element is allowed to send out buffers with the SEGMENT start time already |
| subtracted from the timestamp. If it does so, it needs to send a corrected |
| SEGMENT downstream, ie, one with start time 0. |
| |
| A SEGMENT event should be generated as soon as possible in the pipeline and |
| is usually generated by a demuxer or source. The event is generated before |
| pushing the first buffer and after a seek, right before pushing the new buffer. |
| |
| The SEGMENT event should be sent from the streaming thread and should be |
| serialized with the buffers. |
| |
| Buffers should be clipped within the range indicated by the newsegment event |
| start and stop values. Sinks must drop buffers with timestamps out of the |
| indicated segment range. |
| |
| |
| TAG |
| ~~~ |
| |
| The tag event is sent downstream when an element has discovered metadata |
| tags in a media file. Encoders can use this event to adjust their tagging |
| system. A tag is serialized with buffers. |
| |
| |
| BUFFERSIZE |
| ~~~~~~~~~~ |
| |
| NOTE: This event is not yet implemented. |
| |
| An element can suggest a buffersize for downstream elements. This is |
| typically done by elements that produce data on multiple source pads |
| such as demuxers. |
| |
| |
| QOS |
| ~~~ |
| |
| A QOS, or quality of service message, is generated in an element to report |
| to the upstream elements about the current quality of real-time performance |
| of the stream. This is typically done by the sinks that measure the amount |
| of framedrops they have. (see part-qos.txt) |
| |
| |
| SEEK |
| ~~~~ |
| |
| A seek event is issued by the application to configure the playback range |
| of a stream. It is called form the application thread and travels upstream. |
| |
| The seek event contains the new start and stop position of playback |
| after the seek is performed. Optionally the stop position can be left |
| at -1 to continue playback to the end of the stream. The seek event |
| also contains the new playback rate of the stream, 1.0 is normal playback, |
| 2.0 double speed and negative values mean backwards playback. |
| |
| A seek usually flushes the graph to minimize latency after the seek. This |
| behaviour is triggered by using the SEEK_FLUSH flag on the seek event. |
| |
| The seek event usually starts from the sink elements and travels upstream |
| from element to element until it reaches an element that can perform the |
| seek. No intermediate element is allowed to assume that a seek to this |
| location will happen. It is allowed to modify the start and stop times if it |
| needs to do so. this is typically the case if a seek is requested for a |
| non-time position. |
| |
| The actual seek is performed in the application thread so that success |
| or failure can be reported as a return value of the seek event. It is |
| therefore important that before executing the seek, the element acquires |
| the STREAM_LOCK so that the streaming thread and the seek get serialized. |
| |
| The general flow of executing the seek with FLUSH is as follows: |
| |
| 1) unblock the streaming threads, they could be blocked in a chain |
| function. This is done by sending a FLUSH_START on all srcpads or by pausing |
| the streaming task, depending on the seek FLUSH flag. |
| The flush will make sure that all downstream elements unlock and |
| that control will return to this element chain/loop function. |
| We cannot lock the STREAM_LOCK before doing this since it might |
| cause a deadlock. |
| |
| 2) acquire the STREAM_LOCK. This will work since the chain/loop function |
| was unlocked/paused in step 1). |
| |
| 3) perform the seek. since the STREAM_LOCK is held, the streaming thread |
| will wait for the seek to complete. Most likely, the stream thread |
| will pause because the peer elements are flushing. |
| |
| 4) send a FLUSH_STOP event to all peer elements to allow streaming again. |
| |
| 5) create a SEGMENT event to signal the new buffer timestamp base time. |
| This event must be queued to be sent by the streaming thread. |
| |
| 6) start stopped tasks and unlock the STREAM_LOCK, dataflow will continue |
| now from the new position. |
| |
| More information about the different seek types can be found in |
| part-seeking.txt. |
| |
| |
| NAVIGATION |
| ~~~~~~~~~~~ |
| |
| A navigation event is generated by a sink element to signal the elements |
| of a navigation event such as a mouse movement or button click. |
| Navigation events travel upstream. |
| |
| |
| LATENCY |
| ~~~~~~~ |
| |
| A latency event is used to configure a certain latency in the pipeline. It |
| contains a single GstClockTime with the required latency. The latency value is |
| calculated by the pipeline and distributed to all sink elements before they are |
| set to PLAYING. The sinks will add the configured latency value to the |
| timestamps of the buffer in order to delay their presentation. |
| (See also part-latency.txt). |
| |
| |
| DRAIN |
| ~~~~~ |
| |
| NOTE: This event is not yet implemented. |
| |
| Drain event indicates that upstream is about to perform a real-time event, such |
| as pausing to present an interactive menu or such, and needs to wait for all |
| data it has sent to be played-out in the sink. |
| |
| Drain should only be used by live elements, as it may otherwise occur during |
| prerolling. |
| |
| Usually after draining the pipeline, an element either needs to modify timestamps, |
| or FLUSH to prevent subsequent data being discarded at the sinks for arriving |
| late (only applies during playback scenarios). |
| |