WebRTCBin not receiving caps signal
Michiel Konstapel
michiel at aanmelder.nl
Tue Mar 16 20:14:59 UTC 2021
Oh, the producer pipeline in the example was not quite correct: it
should include key frames, a profile specification and config-interval
for the h264 parser and payloader:
... nvh264enc gop-size=50 ! video/x-h264, profile=baseline ! h264parse config-interval=-1 ! rtph264pay config-interval=-1 ...
Updated version is attached. But even then, it still breaks.
On 16-03-2021 20:51, Michiel Konstapel wrote:
>
> After several days of banging my head on the wall, I've gone and split
> off the webrtc part into a separate pipeline, connected to the main
> one through udpsink/udpsrc. However, even then adding webrtcbins will
> randomly lock up. I've narrowed it down to a pretty small testcase in
> the attached python file.
>
> In my environment (1.18.3 built from source) I had to run
>
> export GI_TYPELIB_PATH=/usr/local/lib/x86_64-linux-gnu/girepository-1.0
>
> or it fails with:
>
> ValueError: Namespace GstWebRTC not available
>
> Run it once as a producer pipeline:
>
> python3 testcase.py producer
>
> And then run the consumer:
>
> python3 testcase.py consumer
>
> This will just add a whole bunch of webrtcbins to the running pipeline.
>
> Occasionally, this will successfully add 100 webrtcbins to the
> pipeline, but usually, it'll lock up:
>
> gstwebrtcbin.c:319:gst_webrtc_bin_pad_new:<'':sink_0> new visible pad with direction sink
> gstwebrtcbin.c:469:_find_transceiver_for_mline:<webrtcbin97> Found transceiver (NULL) for mlineindex 0
> gstwebrtcbin.c:5823:gst_webrtc_bin_request_new_pad:<webrtcbin97> Created new transceiver <webrtctransceiver97> for mline 0
> gstwebrtcbin.c:5737:gst_webrtc_bin_change_state: changing state: NULL => READY
> gstwebrtcbin.c:1354:_check_if_negotiation_is_needed:<webrtcbin97> checking if negotiation is needed
> gstwebrtcbin.c:1360:_check_if_negotiation_is_needed:<webrtcbin97> no negotiation possible until caps have been received on all sink pads
> gstwebrtcbin.c:5737:gst_webrtc_bin_change_state: changing state: READY => PAUSED
> gstwebrtcbin.c:5737:gst_webrtc_bin_change_state: changing state: PAUSED => PLAYING
>
> And then it just freezes.
>
> Sometimes it's the 98th, sometimes it's the 10th. I've ran it with
> maximum GST_DEBUG, added print statements to gstwebrtcbin.c, and I
> can't find anything that sets apart the successful and failing
> attempts. Adding sleeps seems to help, but it's not foolproof and I
> have no idea why it would help.
>
> Matthew or other experts, any ideas? Is there an issue tracker I
> should add this to? Is there something wrong with this approach?
>
> I did find a workaround: if I pause the whole consumer pipeline, add
> the webrtcbin, and then set the pipeline playing, that appears to
> prevent the race condition. Now that it's in a separate pipeline,
> that's a viable option, but it still doesn't sit right with me that it
> just randomly... stops.
>
> Kind regards,
> Michiel
>
> On 14-01-2021 12:04, Michiel Konstapel wrote:
>> Apologies, that lost a lot of context since it references an old
>> email to the list. It concerns this message by Dominik:
>> http://gstreamer-devel.966125.n4.nabble.com/WebRTCBin-not-receiving-caps-signal-tt4689946.html
>>
>> Quoting:
>>> I am working on a python app that turns an rtsp stream from a
>>> networked camera into a stream that you can access through the
>>> browser via WebRTC.
>>>
>>> For that, I am using a dynamic pipeline, the rtp audio and video
>>> streams go to a fakesink through a tee element. For each incoming
>>> websocket connection, I build an WebRTC connection: I am adding two
>>> queues, one for audio, one for video to the tee elements and connect
>>> them to a new WebRTC element. Then I exchange the SDP offer and
>>> response via websockets.
>>>
>>> Now, in some situations, after quick reloads of the web page that
>>> brokers the connection, the newest added WebRTCBin element does not
>>> send the “on-negotiation-neeed” signal. I am assuming this is
>>> because it did not receive caps on the newly requested pad, thus the
>>> gst_webrtcbin_sink_event method did not get triggered and the
>>> WebRTCBin is not checking whether a negotiation is needed.
>>>
>>> A PDF of the pipeline is here:
>>> http://roettsch.es/debug_gst_webrtcbin.pdf and an image of the
>>> relevant portions is attached.
>>>
>>> The WebRTCBin element sendrecv-2-772371 has blocked pads, as it
>>> hasn’t done any negotiation and unblocked its pads, but also the
>>> CAPS on the links to the queue elements only show “ANY”.
>>>
>>> I have a few questions to further investigate this:
>>>
>>> What could be the reason the caps event is not received by the
>>> GstWebRTCBin?
>>> When is the caps event usually sent downstream? Is it sent only once
>>> and could it be that the GstWebRTCBin somehow missed it through some
>>> race condition?
>>> When connecting queue and webrtcbin to the tee element, do I need to
>>> follow a certain order? Do I need to insert probes in order not to
>>> miss the caps event?
>>
>>
>> On 14-01-2021 12:00, mkonstapel wrote:
>>> Hi Dominik et al,
>>>
>>> I think I am running into the exact same problem - quickly reloading
>>> the
>>> "player" page (thus adding webrtcbins) eventually, and apparently
>>> randomly,
>>> locks up the pipeline. Did you ever find a solution?
>>>
>>> Kind regards,
>>> Michiel Konstapel
--
Michiel Konstapel
/Lead Software Developer/
aanmelder.nl <https://www.aanmelder.nl>
T: +31(0)15 2400 119
E: michiel at aanmelder.nl
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210316/bb97fa5f/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: testcase.py
Type: text/x-python
Size: 4298 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210316/bb97fa5f/attachment-0001.py>
More information about the gstreamer-devel
mailing list