rtpopusdepay: bug when receiving stereo packets
I am trying to send stereo opus encoded packets over udp and receive them from another pipeline. When I run this on my macOS with Gstreamer 1.18.5 everything works as expected. But when I run the same pipeline on docker running ubuntu 18.04 with Gstreamer 1.20.0 I get only mono audio.
Sender:
gst-launch-1.0 --verbose filesrc location= waterloo.wav ! wavparse ! audioconvert ! audio/x-raw,format=S16LE,channels=2 ! audiopanorama panorama=-1 ! audiomixer ! audio/x-raw,channels=2 ! opusenc ! rtpopuspay ! application/x-rtp,channels=2 ! udpsink host=0.0.0.0 port=44444
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstWavParse:wavparse0.GstPad:src: caps = audio/x-raw, format=(string)F32LE, layout=(string)interleaved, channels=(int)1, rate=(int)16000
/GstPipeline:pipeline0/GstAudioConvert:audioconvert0.GstPad:src: caps = audio/x-raw, rate=(int)16000, format=(string)S16LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = audio/x-raw, rate=(int)16000, format=(string)S16LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstAudioPanorama:audiopanorama0.GstPad:src: caps = audio/x-raw, rate=(int)16000, format=(string)S16LE, channels=(int)2, layout=(string)interleaved
/GstPipeline:pipeline0/GstAudioMixer:audiomixer0.GstAudioMixerPad:sink_0: caps = audio/x-raw, rate=(int)16000, format=(string)S16LE, channels=(int)2, layout=(string)interleaved
/GstPipeline:pipeline0/GstAudioPanorama:audiopanorama0.GstPad:sink: caps = audio/x-raw, rate=(int)16000, format=(string)S16LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = audio/x-raw, rate=(int)16000, format=(string)S16LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstAudioConvert:audioconvert0.GstPad:sink: caps = audio/x-raw, format=(string)F32LE, layout=(string)interleaved, channels=(int)1, rate=(int)16000
/GstPipeline:pipeline0/GstAudioMixer:audiomixer0.GstAudioAggregatorConvertPad:src: caps = audio/x-raw, format=(string)S16LE, rate=(int)48000, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = audio/x-raw, format=(string)S16LE, rate=(int)48000, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstOpusEnc:opusenc0.GstPad:sink: caps = audio/x-raw, format=(string)S16LE, rate=(int)48000, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = audio/x-raw, format=(string)S16LE, rate=(int)48000, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003
Redistribute latency...
/GstPipeline:pipeline0/GstOpusEnc:opusenc0.GstPad:src: caps = audio/x-opus, rate=(int)48000, channels=(int)2, channel-mapping-family=(int)0, stream-count=(int)1, coupled-count=(int)1, streamheader=(buffer)< 4f707573486561640102380180bb0000000000, 4f707573546167731e000000456e636f6465642077697468204753747265616d6572206f707573656e630000000001 >
/GstPipeline:pipeline0/GstRtpOPUSPay:rtpopuspay0.GstPad:src: caps = application/x-rtp, media=(string)audio, clock-rate=(int)48000, encoding-name=(string)OPUS, sprop-stereo=(string)1, encoding-params=(string)2, sprop-maxcapturerate=(string)48000, payload=(int)96, channels=(int)2, ssrc=(uint)1681427225, timestamp-offset=(uint)2123595937, seqnum-offset=(uint)3126
/GstPipeline:pipeline0/GstCapsFilter:capsfilter2.GstPad:src: caps = application/x-rtp, media=(string)audio, clock-rate=(int)48000, encoding-name=(string)OPUS, sprop-stereo=(string)1, encoding-params=(string)2, sprop-maxcapturerate=(string)48000, payload=(int)96, channels=(int)2, ssrc=(uint)1681427225, timestamp-offset=(uint)2123595937, seqnum-offset=(uint)3126
/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)audio, clock-rate=(int)48000, encoding-name=(string)OPUS, sprop-stereo=(string)1, encoding-params=(string)2, sprop-maxcapturerate=(string)48000, payload=(int)96, channels=(int)2, ssrc=(uint)1681427225, timestamp-offset=(uint)2123595937, seqnum-offset=(uint)3126
/GstPipeline:pipeline0/GstCapsFilter:capsfilter2.GstPad:sink: caps = application/x-rtp, media=(string)audio, clock-rate=(int)48000, encoding-name=(string)OPUS, sprop-stereo=(string)1, encoding-params=(string)2, sprop-maxcapturerate=(string)48000, payload=(int)96, channels=(int)2, ssrc=(uint)1681427225, timestamp-offset=(uint)2123595937, seqnum-offset=(uint)3126
/GstPipeline:pipeline0/GstRtpOPUSPay:rtpopuspay0.GstPad:sink: caps = audio/x-opus, rate=(int)48000, channels=(int)2, channel-mapping-family=(int)0, stream-count=(int)1, coupled-count=(int)1, streamheader=(buffer)< 4f707573486561640102380180bb0000000000, 4f707573546167731e000000456e636f6465642077697468204753747265616d6572206f707573656e630000000001 >
/GstPipeline:pipeline0/GstRtpOPUSPay:rtpopuspay0: timestamp = 2123595937
/GstPipeline:pipeline0/GstRtpOPUSPay:rtpopuspay0: seqnum = 3126
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Redistribute latency...
New clock: GstSystemClock
handling interrupt.06.0 (62.9 %)
Interrupt: Stopping pipeline ...
Execution ended after 0:00:03.799375027
Setting pipeline to NULL ...
Freeing pipeline ...
Receiver:
gst-launch-1.0 --verbose udpsrc port=44444 ! application/x-rtp,media=audio,payload=96,encoding-name=OPUS,sprop-stereo=1,encoding-params=2,sprop-maxcapturerate=48000,format=S16LE ! rtpopusdepay ! opusdec ! wavenc ! filesink location=kek.wav
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = application/x-rtp, media=(string)audio, payload=(int)96, encoding-name=(string)OPUS, sprop-stereo=(int)1, encoding-params=(int)2, sprop-maxcapturerate=(int)48000, format=(string)S16LE, clock-rate=(int)48000
/GstPipeline:pipeline0/GstRTPOpusDepay:rtpopusdepay0.GstPad:src: caps = audio/x-opus, channel-mapping-family=(int)0, channels=(int)1
/GstPipeline:pipeline0/GstOpusDec:opusdec0.GstPad:sink: caps = audio/x-opus, channel-mapping-family=(int)0, channels=(int)1
/GstPipeline:pipeline0/GstRTPOpusDepay:rtpopusdepay0.GstPad:sink: caps = application/x-rtp, media=(string)audio, payload=(int)96, encoding-name=(string)OPUS, sprop-stereo=(int)1, encoding-params=(int)2, sprop-maxcapturerate=(int)48000, format=(string)S16LE, clock-rate=(int)48000
/GstPipeline:pipeline0/GstOpusDec:opusdec0.GstPad:src: caps = audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)48000, channels=(int)1
/GstPipeline:pipeline0/GstWavEnc:wavenc0.GstPad:sink: caps = audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)48000, channels=(int)1
/GstPipeline:pipeline0/GstWavEnc:wavenc0.GstPad:src: caps = audio/x-wav
/GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = audio/x-wav
Redistribute latency...
^Chandling interrupt.
Interrupt: Stopping pipeline ...
Execution ended after 0:00:03.707621104
Setting pipeline to NULL ...
Freeing pipeline ...
As you see sender caps are correct:
/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)audio, clock-rate=(int)48000, encoding-name=(string)OPUS, sprop-stereo=(string)1, encoding-params=(string)2, sprop-maxcapturerate=(string)48000, payload=(int)96, channels=(int)2, ssrc=(uint)1681427225, timestamp-offset=(uint)2123595937, seqnum-offset=(uint)3126
But receiver has mono caps:
/GstPipeline:pipeline0/GstRTPOpusDepay:rtpopusdepay0.GstPad:src: caps = audio/x-opus, channel-mapping-family=(int)0, channels=(int)1
Edited by David Grinberg