blob: 8749f7bc86c15d5fb926fdd95173036a859e68f3 [file] [log] [blame]
Fixing Performance
------------------
1) Observations
The following observations are made when considering the current (17/11/2004)
problems in gstreamer.
- startup time.
Most of the time is spend in reading the xml registry. Several methods exist
for not using a registry (see testsuite/plugin/).
Since registries are pluggable, one can also write a binary registry which
should significantly reduce the size and the load time.
- Performance in state changes
State changes are pretty heavy currently because negotiation happens at
each state change. The PAUSED->PLAYING state change in particular is
too heavy and should be made more 'snappy'.
- Performance in data passing.
Too much checking is done in the push/pull functions. Most of these checks
can be performed more efficiently in the plugins, like checking if the
element is sufficiently negotiated. The discont event 'invent' hack used
for fixing the synchronisation has to go away.
We also propose a get_range based method for pads so that random-access
in file-based sources can happen more efficiently (typical for muxers).
- Scheduling overhead.
The current default opt scheduler has extensive data-structures and does
uses fairly complicated algorithms for grouping and scheduling elements.
This has performance impact on pipeline constructions and pipeline
execution.
- Events in dataflow.
Because events are put inside the dataflow, a typical chain function has
to check if the GstData object is an event of a buffer.
2) Proposed solutions
- startup time.
Volunteers to implement a binary registry?
- The changes listed in the separate document 'threading' will greatly
reduce the number of negotiation steps during state changes. It will
also reduce the latency between PAUSED<->PLAYING since it basically
involves unlocking a mutex in the sinks.
- adding return values to push/pull will offload some checks to the plugins
that can more efficiently and more accuratly handle most error cases.
With the new sync model in 'threading' it is also not needed to have
the 'invented' events in the pull function.
- The following scheduling policies should be made possible for pads:
1) get_range <-> pull-range-based
2) get <-> pull based
3) push <-> chain-based
The scheduling policies are listed in order of preference. A pad should
export what scheduling it supports and the core will select what
scheduling method to use. It is possible for a pad to support more than
one scheduling method.
It is possible that two elements cannot connect when they do not support
compatible scheduling policies. We require that pull-based pads also
support the chain based methods, at minimal, using a helper function to
queue a buffer and that get-based pads also support a push based implementation.
- With the changes listed in 'threading' the scheduler will be a lot more
simple since it does not have to keep track of groups and connected
elements. Starting and scheduling the pipeline will be a matter of
starting the source/loop GstTasks and they will from there on take
over.
- move events out of the dataflow. Different methods will be used to
send/receive events. This will also remove some of the checks in
the push/pull functions. Note that plugins are still able to serialize
buffers and events because they hold the streaming lock.
3) detailed explanation
TO BE WRITTEN