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

Håvard Graff havard.graff at tandberg.com
Sat Oct 17 01:46:55 CEST 2009


Hi.

I posted this a while back in this mailinglist.

The problem with the "block-pad" soultion is that you are dependant of getting another buffer on the tee srcpad after you block it. If this is no problem, then this solution is the easiest one. If there is a chance no more buffers will arrive on the src-pad you can do:

1. Attach an event-probe to the tee srcpad you want to unlink.
2. Send a custom downstream serialized event on the tee sinkpad 
3. Inside the callback of the event-prove, confirm the arrival of your custom event and:
	a) Unlink the branch from the tee srcpad
	b) remove the probe
	c) release the tee srcpad (note that this is actually safe to do inside the callback!)
	d) return FALSE (so you don't pass that event downstream)

For us this is absolutely necessary, since the call can be ended at any time, and hence you can't know if you get another buffer.

Håvard

-----Original Message-----
From: Shiping [mailto:shiping.li at gmail.com] 
Sent: 16. oktober 2009 18:34
To: gstreamer-devel at lists.sourceforge.net
Subject: Re: [gst-devel] Any ways to add/remove branches to/from a running pipeline


Thanks sledge and Aurelien for quick reply.  I will give it a shot ASAP and,
may come back with a successful story :handshake: or more questions.
:confused:


Aurelien Grimaud (elzz) wrote:
> 
> 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.
> 
> Aurelien
>> 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.
>> INFO        GST_ERROR_SYSTEM
>> gstelement.c:1763:gst_element_message_full:<udpsink0>  posting message:
>> Internal data flow problem.
>> INFO        GST_ERROR_SYSTEM
>> 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
>>>
>>>
>>>      
>>    
> 
> 
> ------------------------------------------------------------------------------
> 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
> 
> 

-- 
View this message in context: http://www.nabble.com/Any-ways-to-add-remove-branches-to-from-a-running-pipeline-tp25794577p25928355.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


------------------------------------------------------------------------------
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