@@ -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,155 @@ 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 ()
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+ videoTrack .WriteRTP (& rtp.Packet {
301+ Header : rtp.Header {
302+ Version : 2 ,
303+ Marker : true ,
304+ PayloadType : 111 ,
305+ SequenceNumber : 1123 ,
306+ Timestamp : 45343 ,
307+ SSRC : 563424 ,
308+ },
309+ Payload : []byte {5 , 2 },
310+ })
311+
312+ audioTrack .WriteRTP (& rtp.Packet {
313+ Header : rtp.Header {
314+ Version : 2 ,
315+ Marker : true ,
316+ PayloadType : 111 ,
317+ SequenceNumber : 1123 ,
318+ Timestamp : 45343 ,
319+ SSRC : 563424 ,
320+ },
321+ Payload : []byte {5 , 2 },
322+ })
323+
324+ err = reader .GatherIncomingTracks (context .Background ())
325+ require .NoError (t , err )
326+
327+ codecs := gatherCodecs (reader .IncomingTracks ())
328+
329+ sort .Slice (codecs , func (i , j int ) bool {
330+ return codecs [i ].PayloadType < codecs [j ].PayloadType
331+ })
332+
333+ require .Equal (t , []webrtc.RTPCodecParameters {
334+ {
335+ RTPCodecCapability : webrtc.RTPCodecCapability {
336+ MimeType : webrtc .MimeTypeVP8 ,
337+ ClockRate : 90000 ,
338+ RTCPFeedback : codecs [0 ].RTCPFeedback ,
339+ },
340+ PayloadType : 96 ,
341+ },
342+ {
343+ RTPCodecCapability : webrtc.RTPCodecCapability {
344+ MimeType : webrtc .MimeTypeOpus ,
345+ ClockRate : 48000 ,
346+ Channels : 2 ,
347+ SDPFmtpLine : "minptime=10;useinbandfec=1" ,
348+ RTCPFeedback : codecs [1 ].RTCPFeedback ,
349+ },
350+ PayloadType : 111 ,
351+ },
352+ }, codecs )
353+
354+ reader .StartReading ()
355+
356+ pkts , _ , err := videoSender .ReadRTCP ()
357+ require .NoError (t , err )
358+ require .Equal (t , []rtcp.Packet {
359+ & rtcp.ReceiverReport {
360+ SSRC : pkts [0 ].(* rtcp.ReceiverReport ).SSRC ,
361+ Reports : []rtcp.ReceptionReport {{
362+ SSRC : uint32 (videoSender .GetParameters ().Encodings [0 ].SSRC ),
363+ LastSequenceNumber : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSequenceNumber ,
364+ LastSenderReport : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSenderReport ,
365+ Delay : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].Delay ,
366+ }},
367+ ProfileExtensions : []byte {},
368+ },
369+ }, pkts )
370+
371+ pkts , _ , err = audioSender .ReadRTCP ()
372+ require .NoError (t , err )
373+ require .Equal (t , []rtcp.Packet {
374+ & rtcp.ReceiverReport {
375+ SSRC : pkts [0 ].(* rtcp.ReceiverReport ).SSRC ,
376+ Reports : []rtcp.ReceptionReport {{
377+ SSRC : uint32 (audioSender .GetParameters ().Encodings [0 ].SSRC ),
378+ LastSequenceNumber : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSequenceNumber ,
379+ LastSenderReport : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].LastSenderReport ,
380+ Delay : pkts [0 ].(* rtcp.ReceiverReport ).Reports [0 ].Delay ,
381+ }},
382+ ProfileExtensions : []byte {},
383+ },
384+ }, pkts )
385+ }
386+
237387func TestPeerConnectionPublishRead (t * testing.T ) {
238388 pc1 := & PeerConnection {
239389 LocalRandomUDP : true ,
0 commit comments