Skip to content

Commit 769b9f6

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

File tree

2 files changed

+155
-1
lines changed

2 files changed

+155
-1
lines changed

internal/protocols/webrtc/incoming_track.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ const (
1919
mimeTypeL16 = "audio/L16"
2020
)
2121

22+
func uint32Ptr(v uint32) *uint32 {
23+
return &v
24+
}
25+
2226
var incomingVideoCodecs = []webrtc.RTPCodecParameters{
2327
{
2428
RTPCodecCapability: webrtc.RTPCodecCapability{
@@ -286,7 +290,7 @@ func (t *IncomingTrack) start() {
286290
t.packetsLost.Start()
287291

288292
t.rtcpReceiver = &rtcpreceiver.RTCPReceiver{
289-
ClockRate: int(t.track.SSRC()),
293+
ClockRate: int(t.track.Codec().ClockRate),
290294
UnrealiableTransport: true,
291295
Period: 1 * time.Second,
292296
WritePacketRTCP: func(p rtcp.Packet) {

internal/protocols/webrtc/peer_connection_test.go

Lines changed: 150 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,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+
237387
func TestPeerConnectionPublishRead(t *testing.T) {
238388
pc1 := &PeerConnection{
239389
LocalRandomUDP: true,

0 commit comments

Comments
 (0)