Skip to content

Commit 1dcd339

Browse files
committed
webrtc: fix clock rate of outgoing RTCP receiver reports
1 parent 462fb2b commit 1dcd339

File tree

2 files changed

+157
-1
lines changed

2 files changed

+157
-1
lines changed

internal/protocols/webrtc/incoming_track.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func (t *IncomingTrack) start() {
286286
t.packetsLost.Start()
287287

288288
t.rtcpReceiver = &rtcpreceiver.RTCPReceiver{
289-
ClockRate: int(t.track.SSRC()),
289+
ClockRate: int(t.track.Codec().ClockRate),
290290
UnrealiableTransport: true,
291291
Period: 1 * time.Second,
292292
WritePacketRTCP: func(p rtcp.Packet) {

internal/protocols/webrtc/peer_connection_test.go

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
237393
func TestPeerConnectionPublishRead(t *testing.T) {
238394
pc1 := &PeerConnection{
239395
LocalRandomUDP: true,

0 commit comments

Comments
 (0)