@@ -12,6 +12,7 @@ import (
1212 "github.com/bluenviron/mediamtx/internal/test"
1313 "github.com/pion/ice/v4"
1414 "github.com/pion/logging"
15+ "github.com/pion/rtcp"
1516 "github.com/pion/rtp"
1617 "github.com/pion/sdp/v3"
1718 "github.com/pion/webrtc/v4"
@@ -234,6 +235,161 @@ func TestPeerConnectionConnectivity(t *testing.T) {
234235 }
235236}
236237
238+ func TestPeerConnectionRead (t * testing.T ) {
239+ settingsEngine := webrtc.SettingEngine {}
240+ settingsEngine .SetLocalRandomUDP (true )
241+
242+ api := webrtc .NewAPI (
243+ webrtc .WithSettingEngine (settingsEngine ))
244+
245+ pub , err := api .NewPeerConnection (webrtc.Configuration {})
246+ require .NoError (t , err )
247+ defer pub .Close () //nolint:errcheck
248+
249+ videoTrack , err := webrtc .NewTrackLocalStaticRTP (
250+ webrtc.RTPCodecCapability {
251+ MimeType : webrtc .MimeTypeVP8 ,
252+ ClockRate : 90000 ,
253+ },
254+ "video" ,
255+ "publisher" )
256+ require .NoError (t , err )
257+
258+ videoSender , err := pub .AddTrack (videoTrack )
259+ require .NoError (t , err )
260+
261+ audioTrack , err := webrtc .NewTrackLocalStaticRTP (
262+ webrtc.RTPCodecCapability {
263+ MimeType : webrtc .MimeTypeOpus ,
264+ ClockRate : 48000 ,
265+ },
266+ "audio" ,
267+ "publisher" )
268+ require .NoError (t , err )
269+
270+ audioSender , err := pub .AddTrack (audioTrack )
271+ require .NoError (t , err )
272+
273+ reader := & PeerConnection {
274+ LocalRandomUDP : true ,
275+ IPsFromInterfaces : true ,
276+ HandshakeTimeout : conf .Duration (10 * time .Second ),
277+ TrackGatherTimeout : conf .Duration (2 * time .Second ),
278+ Publish : false ,
279+ Log : test .NilLogger ,
280+ }
281+ err = reader .Start ()
282+ require .NoError (t , err )
283+ defer reader .Close ()
284+
285+ offer , err := pub .CreateOffer (nil )
286+ require .NoError (t , err )
287+
288+ err = pub .SetLocalDescription (offer )
289+ require .NoError (t , err )
290+
291+ answer , err := reader .CreateFullAnswer (context .Background (), & offer )
292+ require .NoError (t , err )
293+
294+ err = pub .SetRemoteDescription (* answer )
295+ require .NoError (t , err )
296+
297+ err = reader .WaitUntilConnected (context .Background ())
298+ require .NoError (t , err )
299+
300+ go func () {
301+ time .Sleep (100 * time .Millisecond )
302+
303+ err2 := videoTrack .WriteRTP (& rtp.Packet {
304+ Header : rtp.Header {
305+ Version : 2 ,
306+ Marker : true ,
307+ PayloadType : 111 ,
308+ SequenceNumber : 1123 ,
309+ Timestamp : 45343 ,
310+ SSRC : 563424 ,
311+ },
312+ Payload : []byte {5 , 2 },
313+ })
314+ require .NoError (t , err2 )
315+
316+ err2 = audioTrack .WriteRTP (& rtp.Packet {
317+ Header : rtp.Header {
318+ Version : 2 ,
319+ Marker : true ,
320+ PayloadType : 111 ,
321+ SequenceNumber : 1123 ,
322+ Timestamp : 45343 ,
323+ SSRC : 563424 ,
324+ },
325+ Payload : []byte {5 , 2 },
326+ })
327+ require .NoError (t , err2 )
328+ }()
329+
330+ err = reader .GatherIncomingTracks (context .Background ())
331+ require .NoError (t , err )
332+
333+ codecs := gatherCodecs (reader .IncomingTracks ())
334+
335+ sort .Slice (codecs , func (i , j int ) bool {
336+ return codecs [i ].PayloadType < codecs [j ].PayloadType
337+ })
338+
339+ require .Equal (t , []webrtc.RTPCodecParameters {
340+ {
341+ RTPCodecCapability : webrtc.RTPCodecCapability {
342+ MimeType : webrtc .MimeTypeVP8 ,
343+ ClockRate : 90000 ,
344+ RTCPFeedback : codecs [0 ].RTCPFeedback ,
345+ },
346+ PayloadType : 96 ,
347+ },
348+ {
349+ RTPCodecCapability : webrtc.RTPCodecCapability {
350+ MimeType : webrtc .MimeTypeOpus ,
351+ ClockRate : 48000 ,
352+ Channels : 2 ,
353+ SDPFmtpLine : "minptime=10;useinbandfec=1" ,
354+ RTCPFeedback : codecs [1 ].RTCPFeedback ,
355+ },
356+ PayloadType : 111 ,
357+ },
358+ }, codecs )
359+
360+ reader .StartReading ()
361+
362+ pkts , _ , err := videoSender .ReadRTCP ()
363+ require .NoError (t , err )
364+ require .Equal (t , []rtcp.Packet {
365+ & rtcp.ReceiverReport {
366+ SSRC : pkts [0 ].(* rtcp.ReceiverReport ).SSRC ,
367+ Reports : []rtcp.ReceptionReport {{
368+ SSRC : uint32 (videoSender .GetParameters ().Encodings [0 ].SSRC ),
369+ LastSequenceNumber : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSequenceNumber ,
370+ LastSenderReport : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSenderReport ,
371+ Delay : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].Delay ,
372+ }},
373+ ProfileExtensions : []byte {},
374+ },
375+ }, pkts )
376+
377+ pkts , _ , err = audioSender .ReadRTCP ()
378+ require .NoError (t , err )
379+ require .Equal (t , []rtcp.Packet {
380+ & rtcp.ReceiverReport {
381+ SSRC : pkts [0 ].(* rtcp.ReceiverReport ).SSRC ,
382+ Reports : []rtcp.ReceptionReport {{
383+ SSRC : uint32 (audioSender .GetParameters ().Encodings [0 ].SSRC ),
384+ LastSequenceNumber : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSequenceNumber ,
385+ LastSenderReport : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSenderReport ,
386+ Delay : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].Delay ,
387+ }},
388+ ProfileExtensions : []byte {},
389+ },
390+ }, pkts )
391+ }
392+
237393func TestPeerConnectionPublishRead (t * testing.T ) {
238394 pc1 := & PeerConnection {
239395 LocalRandomUDP : true ,
0 commit comments