[gst-devel] Element states
Stefan Kost
ensonic at hora-obscura.de
Mon Feb 13 07:54:03 CET 2006
hi all,
I had an irc discussion this morning with a new application developer. He faces
a problem a bit similar to what I stuggle with.
He tries to write gstreamer backend for a dj-mixing application. For this app he
needs to start the playback of a sources at specific times:
+------+
| src1 |-------
+------+ v
+-------+ +-----------+
| adder |---| audiosink |
+-------+ +-----------+
+------+ ^
| src2 |------
+------+
where src2 is paused and starts at some streamtime.
I've re-read
http://cvs.freedesktop.org/gstreamer/gstreamer/docs/design/part-clocks.txt?view=markup
Still I see problems here:
1.) gstreamer doesn't like to have paused elements in a pipeline that is
playing. Don't know it it is a bug in adder or elsewhere. On the other hand this
looks like it requires the sparse streams feature.
2.) if we could start src2 later it needs to stamp its buffer to be in sync with
those of src1. How to do that? Buffers should not be late in adder. The src need
to maintain is local timstamp (e.g. to seek in its filesrc) and a global stream
time for the buffers.
From the part-clocks.txt file it looks like buffers can have a local timestamp,
if there is segented playback, where the segment has the offset. Is that right?
In buzztard its a bit similar. I've described this several times already. We
want to mute sources (make them emit nothing for a while). This sounds like an
application for sparse streams too. Additionally for effect we like mute or
bypass them. Where mute kind of turns the effect into a sparse source (we don't
want anything behind the effect to render data). Bypass should just pass data
through.
Right now I've tried to implement this element independently. For mute I've
hot-swapped the element with a audiotest-src that played silence. For bypass I
'bypassed the effect'. Problem here is that when temporarily taking source out
of the pipeline they don't increment their timestamps and if you link them in
again they send old-data :(
An alternative could be to have elements support this via an interface (good
name needed, as GstMixer is alredy taken). The iface would just force sources to
have a boolean mute property and transformers to have a tristate normal, mute
and bypass.
Mute can for the time-beeing send silence and later be turned into sparse stream
handling. I am not sure if we can properly handle it for effects (avoid upstream
elements to do calculations).
Bypass is easy to do, just exchange the process function to return the buffer it
just received. This could even go into the baseclass (maybe).
What do you think/recommend.
Stefan
More information about the gstreamer-devel
mailing list