webrtcbin create-answer returns unknown SDP type

Matthew Waters ystreet00 at gmail.com
Thu Jul 7 00:14:34 UTC 2022


Hi,

Yes, I think that would be a good idea.  However gst-python is now
located in the same place as gstreamer (as of 1.20) so this should be
filed under:
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/new with the
'Python' label.

Cheers
-Matt

On 7/7/22 03:00, Alexei Golovko wrote:
> Great thanks for the workaround!
>
> Should I report this as a bug on
> https://gitlab.freedesktop.org/groups/gstreamer/-/issues with
> gst-python as a project?
>
> ср, 6 июл. 2022 г. в 14:40, Matthew Waters <ystreet00 at gmail.com>:
>
>     Interesting.
>
>     If you separate out this line:
>
>     answer = promise.get_reply().get_value("answer")
>
>     to:
>
>     reply = promise.get_reply()
>     answer = reply.get_value("answer")
>
>     Then it will work.
>
>     I think this has to do with the temporary copy that python makes
>     when calling get_reply() that disappears too early?  This is
>     likely a bug somewhere in the python bindings.
>
>     This is the good case:
>
>     0:00:26.515777326 221861 0x555555684f00 ERROR             
>     webrtcbin gstwebrtcbin.c:4584:_create_sdp_task: returning
>     application/x-gst-promise, answer=(GstWebRTCSessionDescription)NULL;
>     INFO     __main__:on answer: <Gst.Promise object at 0x7fffe8c593c0
>     (GstPromise at 0x555555ade1b0)> <__gi__.GstWebRTCBin object at
>     0x7fffe9a43400 (GstWebRTCBin at 0x555555ac4120)> None
>
>     Thread 3 "wrb:pc" hit Breakpoint 1,
>     gst_webrtc_session_description_copy (src=0x7fffd81147b0) at
>     ../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/rtcsessiondescription.c:72
>     72      if (!src)
>     (gdb)
>     Continuing.
>     0:00:31.294220789 221861 0x555555684f00 WARN              
>     structure
>     gststructure.c:2093:priv_gst_structure_append_to_gstring: No value
>     transform to serialize field 'answer' of type
>     'GstWebRTCSessionDescription'
>     INFO     __main__:reply: application/x-gst-promise,
>     answer=(GstWebRTCSessionDescription)NULL;
>     INFO     __main__:answer: <GstWebRTC.WebRTCSessionDescription
>     object at 0x7fffe8c5a9e0 (GstWebRTCSessionDescription at
>     0x7fffd8116b20)>
>     INFO     __main__:answer fields: <enum GST_WEBRTC_SDP_TYPE_ANSWER
>     of type GstWebRTC.WebRTCSDPType>
>     INFO     __main__:answer fields: <enum GST_WEBRTC_SDP_TYPE_ANSWER
>     of type GstWebRTC.WebRTCSDPType> 3
>     INFO     __main__:answer fields: <enum GST_WEBRTC_SDP_TYPE_ANSWER
>     of type GstWebRTC.WebRTCSDPType> answer
>     INFO     __main__:answer sdp is None: False
>     INFO     __main__:answer fields: <GstSdp.SDPMessage object at
>     0x7fffe8c5aa40 (GstSDPMessage at 0x7fffd811a740)>
>     INFO     __main__:answer sdp: v=0
>
>     Bad case:
>
>     0:00:36.984435665 222001 0x555555685300 ERROR             
>     webrtcbin gstwebrtcbin.c:4584:_create_sdp_task: returning
>     application/x-gst-promise, answer=(GstWebRTCSessionDescription)NULL;
>     INFO     __main__:on answer: <Gst.Promise object at 0x7fffe8c593c0
>     (GstPromise at 0x555555aca2c0)> <__gi__.GstWebRTCBin object at
>     0x7fffe8c199c0 (GstWebRTCBin at 0x555555ac4120)> None
>
>     Thread 3 "wrb:pc" hit Breakpoint 1,
>     gst_webrtc_session_description_copy (src=0x7fffd8116150) at
>     ../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/rtcsessiondescription.c:72
>     72      if (!src)
>     (gdb)
>     Continuing.
>
>     Thread 3 "wrb:pc" hit Breakpoint 2,
>     gst_webrtc_session_description_free (desc=0x7fffd8116760) at
>     ../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/rtcsessiondescription.c:92
>     92      g_return_if_fail (desc != NULL);
>     (gdb) bt
>     #0  gst_webrtc_session_description_free (desc=0x7fffd8116760) at
>     ../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/rtcsessiondescription.c:92
>     #1  0x00007fffe9e30008 in g_value_unset
>     (value=value at entry=0x7fffd8118330) at
>     ../subprojects/glib/gobject/gvalue.c:311
>     #2  0x00007fffe8f4f4be in gst_structure_free
>     (structure=0x7fffd8118300) at
>     ../subprojects/gstreamer/gst/gststructure.c:538
>     #3  0x00007fffe9fd71db in boxed_clear (self=0x7fffe8c5a980) at
>     ../subprojects/pygobject/gi/pygi-boxed.c:51
>     #4  boxed_dealloc (self=0x7fffe8c5a980) at
>     ../subprojects/pygobject/gi/pygi-boxed.c:69
>     #5  0x00007ffff7d29076 in subtype_dealloc () from
>     /lib64/libpython3.10.so.1.0
>     #6  0x00007fffe9fcc475 in _Py_DECREF (op=<optimized out>) at
>     /usr/include/python3.10/object.h:500
>     #7  _callable_info_dealloc (self=0x7fffe8c39bf0) at
>     ../subprojects/pygobject/gi/pygi-info.c:685
>     #8  0x00007ffff7d17b00 in _PyEval_EvalFrameDefault () from
>     /lib64/libpython3.10.so.1.0
>     #9  0x00007ffff7d118d3 in _PyEval_Vector () from
>     /lib64/libpython3.10.so.1.0
>     #10 0x00007fffe9fd7d41 in _pygi_closure_handle (cif=<optimized
>     out>, result=<optimized out>, args=<optimized out>,
>     data=<optimized out>) at
>     ../subprojects/pygobject/gi/pygi-closure.c:582
>     #11 0x00007ffff7fb0322 in ffi_closure_unix64_inner () from
>     /lib64/libffi.so.8
>     #12 0x00007ffff7fb0968 in ffi_closure_unix64 () from
>     /lib64/libffi.so.8
>     #13 0x00007fffe9182bc1 in _execute_op (op=0x555555aca3a0) at
>     ../subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c:1007
>     #14 0x00007fffe9ecc19f in g_main_dispatch (context=0x7fffd8000b70)
>     at ../subprojects/glib/glib/gmain.c:3417
>     #15 g_main_context_dispatch (context=0x7fffd8000b70) at
>     ../subprojects/glib/glib/gmain.c:4135
>     #16 0x00007fffe9ecc528 in g_main_context_iterate
>     (context=0x7fffd8000b70, block=block at entry=1,
>     dispatch=dispatch at entry=1, self=<optimized out>) at
>     ../subprojects/glib/glib/gmain.c:4211
>     #17 0x00007fffe9ecc7cf in g_main_loop_run (loop=0x7fffd8002580) at
>     ../subprojects/glib/glib/gmain.c:4411
>     #18 0x00007fffe9185146 in _gst_pc_thread (webrtc=0x555555ac4120)
>     at ../subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c:928
>     #19 0x00007fffe9ef4fad in g_thread_proxy (data=0x555555685300) at
>     ../subprojects/glib/glib/gthread.c:827
>     #20 0x00007ffff788ce2d in start_thread () from /lib64/libc.so.6
>     #21 0x00007ffff7912620 in clone3 () from /lib64/libc.so.6
>     (gdb) c
>     Continuing.
>     INFO     __main__:answer: <GstWebRTC.WebRTCSessionDescription
>     object at 0x7fffe8c5a9e0 (GstWebRTCSessionDescription at
>     0x7fffd8116760)>
>     INFO     __main__:answer fields: <enum 669822870 of type
>     GstWebRTC.WebRTCSDPType>
>     INFO     __main__:answer fields: <enum 669822870 of type
>     GstWebRTC.WebRTCSDPType> 669822870
>     INFO     __main__:answer fields: <enum 669822870 of type
>     GstWebRTC.WebRTCSDPType> unknown
>     INFO     __main__:answer sdp is None: True
>     INFO     __main__:answer fields: None
>     Traceback (most recent call last):
>
>     Cheers
>     -Matt
>
>     On 6/7/22 20:55, Alexei Golovko wrote:
>>     `apt show python3-gst-1.0` gives me version 1.20.1
>>
>>     Also I made a minimal example without external dependencies: just
>>     set hardcoded SDP as local-description and emit create-answer.
>>     https://pastebin.com/9xPk6EkY
>>     It also prints unknown SDP type, new enum value each run:
>>     https://pastebin.com/zKhDsLZZ
>>
>>     This behaviour also reproduces with python 3.9 on NixOS 22.05
>>     (I've used the following shell.nix: https://pastebin.com/vsBG5RXR).
>>
>>     вт, 5 июл. 2022 г. в 17:33, Matthew Waters <ystreet00 at gmail.com>:
>>
>>         Looks like you are looking for python3-gst-1.0:
>>         https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=python3-gst&searchon=names
>>         <https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=python3-gst&searchon=names>.
>>
>>         I don't know how exactly the python bindings operate so
>>         cannot give you that information.  Others on this list may be
>>         able to point you in the right direction.
>>
>>         On 5/7/22 23:19, Alexei Golovko wrote:
>>>         I have installed python3-gi package from apt repository,
>>>         version 3.42.0-3build1.
>>>         Yes, value for the enum changes each run.
>>>         Could you give advice on how to check if this is a python
>>>         binding problem or lower-level one?
>>>
>>>         вт, 5 июл. 2022 г. в 16:02, Matthew Waters
>>>         <ystreet00 at gmail.com>:
>>>
>>>             Please keep the list in CC so others searching for the
>>>             same issue might find a solution.
>>>
>>>             PyGObject is not gst-python.  gst-python provides some
>>>             convenience API on top of PyGObject and may be required
>>>             in this case.
>>>
>>>             That log is expected for your case (no existing
>>>             transceiver or pad).
>>>
>>>             The value for the enum is different from your last run. 
>>>             This points to uninitialized/random memory being
>>>             accessed.  You would need to figure out if that's in the
>>>             python translation layer or not.
>>>
>>>             Cheers
>>>             -Matt
>>>
>>>             On 5/7/22 22:41, Alexei Golovko wrote:
>>>>             Here is the log with GST_DEBUG=3,*webrtc*:7 —
>>>>             https://pastebin.com/RshtnqQx
>>>>             I use PyGObject 3.42.1.
>>>>
>>>>             I see in logs following lines:
>>>>             2022-07-05 15:15:57.949 jord ERROR| 0:00:01.214992971  
>>>>               9 0x55e2cbd19980 DEBUG              webrtcbin
>>>>             gstwebrtcbin.c:1874:_find_codec_preferences:<webrtctransceiver0>
>>>>             Could not find caps for mline 0
>>>>             2022-07-05 15:15:57.949 jord ERROR| 0:00:01.215007126  
>>>>               9 0x55e2cbd19980 TRACE              webrtcbin
>>>>             gstwebrtcbin.c:4071:_create_answer_task:<wrb> trying to
>>>>             compare application/x-rtp, media=(string)video,
>>>>             payload=(int)96, clock-rate=(int)90000,
>>>>             encoding-name=(string)H264,
>>>>             profile-level-id=(string)42e01f,
>>>>             packetization-mode=(string)1,
>>>>             rtcp-fb-nack=(boolean)true,
>>>>             rtcp-fb-nack-pli=(boolean)true,
>>>>             rtcp-fb-goog-remb=(boolean)true; application/x-rtp,
>>>>             media=(string)video, payload=(int)97,
>>>>             clock-rate=(int)90000, encoding-name=(string)RTX,
>>>>             apt=(string)96 and (NULL)
>>>>
>>>>             Maybe they are related to the problem, though I am not
>>>>             sure.
>>>>
>>>>             вт, 5 июл. 2022 г. в 15:12, Matthew Waters
>>>>             <ystreet00 at gmail.com>:
>>>>
>>>>                 Hi,
>>>>
>>>>                 That SDP doesn't actually exist as a valid value. 
>>>>                 You can enable
>>>>                 GStreamer debugging with GST_DEBUG=3,*webrtc*:7 and
>>>>                 that may show
>>>>                 something interesting.
>>>>
>>>>                 Otherwise, one has to figure out if the python
>>>>                 bindings are doing
>>>>                 something weird here.  I assume you have a relevant
>>>>                 gst-python
>>>>                 installation available and in use.
>>>>
>>>>                 Cheers
>>>>                 -Matt
>>>>
>>>>                 On 5/7/22 02:44, Alexei Golovko via gstreamer-devel
>>>>                 wrote:
>>>>                 > Hi,
>>>>                 > I try to use webrtcbin with Janus.
>>>>                 > I've found examples like
>>>>                 >
>>>>                 https://github.com/centricular/gstwebrtc-demos/blob/master/janus/janusvideoroom.py,
>>>>                 >
>>>>                 https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/blob/master/tests/examples/webrtc/webrtcrenego.c,
>>>>                 >
>>>>                 https://github.com/centricular/gstwebrtc-demos/blob/master/sendrecv/gst-rust/src/main.rs,
>>>>                 >
>>>>                 https://gitlab.freedesktop.org/gstreamer/gst-examples/-/blob/master/webrtc/sendrecv/gst/webrtc_sendrecv.py.
>>>>                 >
>>>>                 > They tend to create an offer locally, send it to
>>>>                 Janus, receive an
>>>>                 > answer and set it as a remote description. I
>>>>                 would like to mimic
>>>>                 > behaviour, which we used to use with python's
>>>>                 aiortc: get an offer
>>>>                 > from Janus, generate an answer and send it back.
>>>>                 >
>>>>                 > I set SDP offer from Janus with
>>>>                 set-remote-description, then emit
>>>>                 > create-answer; but I get an answer
>>>>                 WebRTCSessionDescription with an
>>>>                 > empty SDP and a very strange
>>>>                 WebRTCSDPType=-43384639 (non-existing enum?).
>>>>                 >
>>>>                 > What am I doing wrong and how to fix this?
>>>>                 >
>>>>                 > The python script used is here:
>>>>                 https://pastebin.com/WGPcF64m
>>>>                 > Module dvr_processor.dvr_processor.janus contains
>>>>                 communication with
>>>>                 > Janus: https://pastebin.com/KAhTv8Lq
>>>>                 > Logs are here: https://pastebin.com/QVegDhRZ
>>>>                 >
>>>>                 > It is gstreamer 1.20.1 on ubuntu-22.04 based image.
>>>>                 >
>>>>                 > Regards,
>>>>                 > Alexei Golovko.
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20220707/82b14cc2/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20220707/82b14cc2/attachment-0001.sig>


More information about the gstreamer-devel mailing list