summaryrefslogtreecommitdiff
path: root/subprojects/gstreamer/docs/random/wtay/events
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/gstreamer/docs/random/wtay/events')
-rw-r--r--subprojects/gstreamer/docs/random/wtay/events138
1 files changed, 138 insertions, 0 deletions
diff --git a/subprojects/gstreamer/docs/random/wtay/events b/subprojects/gstreamer/docs/random/wtay/events
new file mode 100644
index 0000000000..09e022ee43
--- /dev/null
+++ b/subprojects/gstreamer/docs/random/wtay/events
@@ -0,0 +1,138 @@
+This is a round up from our IRC session on events. It's open for
+discussion of course.
+
+Definition
+----------
+
+The event system is designed to be a mechanism for _inter_plugin_
+communication. Their scope is therefore limited in a way that they do
+not serve as a way to communicate between plugins and the app (signals
+and properties are still used for plugin-app communication).
+
+Events will be generated by either a plugin or the app. It should be
+possible for a plugin to generate an event on one of its pads and it
+should be possible for an app to insert an event on an arbitrary pad in
+the pipeline.
+
+
+Event handling
+--------------
+
+Events can both travel upstream or downstream. Some events, by nature,
+only travel in one direction.
+
+* downstream events
+
+ - Travel in the same way buffers do. This includes that they are handled
+ by the scheduler. The rationale is that the events should be kept
+ as close to the buffers are possible.
+
+ - plugins should check the type of the GstData passed in the _chain
+ or _loop function and act appropriately. This can be done by either
+ doing their own stuff or by calling the default handler.
+
+ - are handled on the sink pad.
+
+* upstream events
+
+ - are handled with an event handler attached to the srcpad. A default
+ handler will be implemented for pads that don't implement their own
+ handler.
+
+ - travel as fast as possible. the rationale is that a seek event should
+ get to the src element ASAP.
+
+
+Possible candidates for events
+------------------------------
+
+ - QoS
+ quality of service. Plugins can notify other plugins about the quality
+ of the pipeline. A video element can for example say that it receives
+ too much frames and that plugins connected to it need to slow down.
+
+ - EOS
+ A plugin can notify other plugins that it has run out-of-data.
+
+ - Seek
+ Used to notify plugins that they need to seek to a certain byte offset
+ or timestamp.
+
+ - discontinuous
+ A plugin has detected a discontinuity in the stream. Other plugins
+ might need to resync.
+
+ - flush
+ Plugins need to get rid of any buffered data ASAP.
+
+ - caps nego??
+ - bufferpool get??
+ - ...
+
+
+application generated events
+----------------------------
+
+The application can insert events into the pipeline at arbitrary
+places. This will be done by calling gst_pad_event() on a pad.
+
+A first implementation will only cover inserting events on src pads
+since inserting events on sinkpads needs changes to the scheduler.
+
+
+Effects of events on plugins
+----------------------------
+
+some events are going to change the state of an element. The EOS event
+will for example change the state of an element to the PAUSED state. Not
+sure when or how this will happen.
+
+
+use cases
+---------
+
+1) filesrc ! fakesink
+
+filesrc will read until it reaches EOF. It will then create a GstEvent
+of type EOS and return it in the _get function. The event will travel
+downstream and will reach the fakesink element. Fakesink will detect
+the event in the _chain function and will call the default handler. The
+default handler will set the element to the paused state. filesrc will
+eventually change its state to PAUSED, probably before sending out the
+event (TBD)
+
+2) filesrc ! fakesink
+
+The app wants to perform a seek on filesrc. It'll call the gst_pad_event()
+on filesrcs src pad with the SEEK event type. The event handler will
+react and change filesrcs internal status. filesrc will return a DISCONT
+event before returning the buffer with the new offset.
+
+3) filesrc ! mpeg2parse video_0! queue ! { mpeg2dec ! xvideosink }
+
+lost of possibilities here: The app can choose to insert a seek event
+on the filesrc element (byte offset), it can insert a byte/time offset
+seek on the video_0 pad of mpeg2parse or it can insert a time seek event
+on mpeg2decs src pad.
+
+the event will travel upstream using the handlers and the intermediate
+elements can convert the event from a time to a byte offset (possibly
+using GstTimeCache to speed up things).
+
+Filesrc will get a byte seek event on its src pad and will proceed as
+in case 2.
+
+As can be seen from this example the app will generate an event in another
+context than those of the plugins, so this will need proper locking.
+
+The app can also choose to insert a flush event on one of the src
+pads. The plugins would clear their cached data and forward the event
+to their upstream peer pad(s).
+
+4)...
+
+Insert impossible case here..
+
+
+
+