dynamic plugging

Tonu Jaansoo tonu.jaansoo at gmail.com
Wed Aug 30 07:25:57 UTC 2017


Hm

By catching error on the bus you mean relinking the pipeline with fakesinks, or do I have to do anything else like acknowledge or drop this message?
Also can I remove all elements from bus callback and relink and set PLAYING states (same thread)?  Bus callback runs in main thread.

When I remove something from bin while playing and without any blocking probes, doesn't this create a situation where pipeline sometimes just crash? 

I have attached very ugly hack that 

* Creates pipeline where it writes to file and to rtspclientsink. Rtspclientsink connects to the server.
* After startup, i quicly shut down rtsp server
* When rtspclientsink generates error on bus, I replace audio and video branches with fakesinks.. (this works sometimes and rest of the pipeline still writing to file)
* After 30s timeout from startup, from callback I try to replace fakesinks with the pipeline that originally was in place. This has worked once … dont know what I was doing :-D

Tõnu


-------------- next part --------------
A non-text attachment was scrubbed...
Name: gst.cpp
Type: application/octet-stream
Size: 8969 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170830/fe9417c8/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: gst.h
Type: application/octet-stream
Size: 3528 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170830/fe9417c8/attachment-0003.obj>
-------------- next part --------------



> On 28 Aug 2017, at 20:50, Tim Müller <tim at centricular.com> wrote:
> 
> On Wed, 2017-08-23 at 14:08 +0300, Tonu Jaansoo wrote:
> 
> Hi Tonu,
> 
>> (snip pipeline)
>> 
>> Now this commandline has problem. When internet connection fails for
>> a second, rtspclientsink tears down everything - also writing to
>> files. I want that when internet fails, audio+video is still being
>> captured into files. Currently I have different commandline without
>> rtspclientsink branches that I use when there is no internet.
>> 
>> I am trying to rewrite this in C, but so that I intercept
>> rtspclientsink having no connection and dynamically unpluging RTSP
>> branches of the pipeline.
>> 
>> Something like this is correct way to do it?
>> 
>> * wait on bus for error message from rtspclientsink
>> * when error comes, set all elements from q1 and q3 to rtspclientsink
>> to NULL
>> * also remove those elements from bin
>> * wait 10s to retry connection
>> * dynamically add all elements that were removed 
>> * set set their status to PLAYING
>> 
>> I have tried something like this. I get no errors, but no luck
>> getting stream going.
> 
> There are two parts to this:
> 
> 1) catching the error message on the bus in your application, and then
> doing something smarter than just stopping the entire pipeline; and
> 
> 2) making sure that a 'flow error' return from rtspclientsink doesn't
> make the upstream elements stop streaming.
> 
> There is an 'errorignore' element that can do 2. You'll want one of
> those in each branch before the rtspclientsink. When an error happens
> you should be able to unlink the sink and stop it, and then restart it
> and re-link. The errorignore element will make sure the error flow
> return is not propagated to the rest of the pipeline.
> 
> Cheers
> -Tim
> 
> -- 
> Tim Müller, Centricular Ltd - http://www.centricular.com
> 
> Join us at the GStreamer Conference!
> 21-22 October 2017 in Prague, Czech Republic
> http://gstreamer.freedesktop.org/conference/
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



More information about the gstreamer-devel mailing list