[gst-devel] Any ways to add/remove branches to/from a running pipeline

Aurelien Grimaud gstelzz at yahoo.fr
Fri Oct 16 18:06:50 CEST 2009

Le 13/10/2009 20:23, Shiping a écrit :
> Thanks Aurelien for your suggestion, and many thanks to all the answers
> posted here.  I really appreciated.  This makes me feel I am not alone,
> there are still many experts out there willing to provide help. :-)
> I tried the method, and here are the results:
> First let me put my pipeline here:
> video source ->  tee ->  record bin
>                               ->  preview bin
>                               ->  stream bin
> I tried to add preview bin when recode bin was running, first I blocked the
> tee->src to preview bin, BUT it stopped the whole pipeline, including record
> bin.  I tried several times, but could not figure out why, and no error
> messages printed out when I set debug level to 3.
> Then I tried adding preview bin directly to running pipeline, it worked
> unexpectedly.  I do not know why it worked, it should not according the
> documents you pointed.  Removing preview bin from running pipeline was also
> working.
If you do your stuff (link/unlink) between two buffers, it will be ok.
But a buffer arrives on tee:sink, then you had a src pad and tee 
forwards to the new src pad which is NOT LINKED. Therefore you get the 
internal data flow problem.
Moreover this error is carried on all upstream elements and your whole 
pipeline stops !

I used tee to forward the same stream to many udpsrc which were 
linked/unlinked dynamically.
Without blocking stream, sometimes, the streaming process for all udpsrc 
stopped for the reason mentionned before.

You have to make sure no buffer arrives to tee, therefore block your tee 
input (sink pad).
When blocked (in the blocked call back for instance), link or unlink as 
needed, the (always in your callback) unblock the tee:sink pad.

Non blocking the pad will work only to remove a downstream bin, if you 
remove the tee:src request pad while pipeline is running.
The locks used in tee ensure (I think) that it works.

To be sure : use block.

> Then when I tried to add stream bin, it became more difficult.  I tried many
> methods - blocking, unblocking, directly adding to running pipeline, etc.
> None of them worked, and the most problems were like this:
> <udpsink0>  warning: Internal data flow problem.
> WARN     basesink gstbasesink.c:3279:gst_base_sink_chain_unlocked:<udpsink0>
> warning: Received buffer without a new-segment. Assuming timestamps start
> from 0.
> gstelement.c:1763:gst_element_message_full:<udpsink0>  posting message:
> Internal data flow problem.
> gstelement.c:1786:gst_element_message_full:<udpsink0>  posted warning
> message: Internal data flow problem.
> So I am  technically stuck here for a couple of days now.
> Could you guys please shad a light on me?
> Many thanks
> Shiping
> Aurelien Grimaud (elzz) wrote:
>> Le 07/10/2009 23:14, Shiping a écrit :
>>> Hi, there:
>>> I am trying to record live video, so a pipeline is setup to record video
>>> continuously.
>>> And during this process, I would like to preview the video from source.
>>> So
>>> I add a tee to the recording pipeline and branch out for previewing.
>>> When
>>> preview stopped, the branch was removed from the pipeline.
>>> I tried hard not to pause recording pipeline, but got all kinds of errors
>>> and unstable recording.  Currently all I can do is pause recording,
>>> inset/remove branch, and restart the whole pipeline.
>>> Of cause, I lost some frames in above process.
>>> My question is:  Is there a way to do it without pausing the recording?
>>> Any suggestions?
>>> Thanks
>>> Shiping
>> Hi,
>> You should read
>> http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt
>> Dynamically changing a PLAYING pipeline should be done with pad block to
>> prevent any error.
>> Block your tee sink pad, link/unlink your preview branch, unblock.
>> Aurelien
>> ------------------------------------------------------------------------------
>> Come build with us! The BlackBerry(R) Developer Conference in SF, CA
>> is the only developer event you need to attend this year. Jumpstart your
>> developing skills, take BlackBerry mobile applications to market and stay
>> ahead of the curve. Join us from November 9 - 12, 2009. Register now!
>> http://p.sf.net/sfu/devconference
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel

More information about the gstreamer-devel mailing list