Skip to content

Commit 41243cd

Browse files
committed
Implemented RTPReceiver SetRTPParameters for ORTC
RID is now set on remote tracks, if provided Adds SetRTPParameters which can be used in ORTC to set codec information about the remote track
1 parent f7f760f commit 41243cd

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

rtpreceiver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func (r *RTPReceiver) Receive(parameters RTPReceiveParameters) error {
114114
track: newTrackRemote(
115115
r.kind,
116116
parameters.Encodings[0].SSRC,
117-
"",
117+
parameters.Encodings[0].RID,
118118
r,
119119
),
120120
}

rtpreceiver_go.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// +build !js
2+
3+
package webrtc
4+
5+
import "github.com/pion/interceptor"
6+
7+
// SetRTPParameters applies provided RTPParameters the RTPReceiver's tracks.
8+
//
9+
// This method is part of the ORTC API. It is not
10+
// meant to be used together with the basic WebRTC API.
11+
//
12+
// The amount of provided codecs must match the number of tracks on the receiver.
13+
func (r *RTPReceiver) SetRTPParameters(params RTPParameters) {
14+
headerExtensions := make([]interceptor.RTPHeaderExtension, 0, len(params.HeaderExtensions))
15+
for _, h := range params.HeaderExtensions {
16+
headerExtensions = append(headerExtensions, interceptor.RTPHeaderExtension{ID: h.ID, URI: h.URI})
17+
}
18+
19+
r.mu.Lock()
20+
defer r.mu.Unlock()
21+
22+
for ndx, codec := range params.Codecs {
23+
currentTrack := r.tracks[ndx].track
24+
25+
r.tracks[ndx].streamInfo.RTPHeaderExtensions = headerExtensions
26+
27+
currentTrack.mu.Lock()
28+
currentTrack.codec = codec
29+
currentTrack.params = params
30+
currentTrack.mu.Unlock()
31+
}
32+
}

rtpreceiver_go_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// +build !js
2+
3+
package webrtc
4+
5+
import (
6+
"context"
7+
"testing"
8+
"time"
9+
10+
"github.com/pion/webrtc/v3/pkg/media"
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestSetRTPParameters(t *testing.T) {
15+
sender, receiver, wan := createVNetPair(t)
16+
17+
outgoingTrack, err := NewTrackLocalStaticSample(RTPCodecCapability{MimeType: "video/vp8"}, "video", "pion")
18+
assert.NoError(t, err)
19+
20+
_, err = sender.AddTrack(outgoingTrack)
21+
assert.NoError(t, err)
22+
23+
// Those parameters wouldn't make sense in a real application,
24+
// but for the sake of the test we just need different values.
25+
p := RTPParameters{
26+
Codecs: []RTPCodecParameters{
27+
{
28+
RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 2, "minptime=10;useinbandfec=1", []RTCPFeedback{{"nack", ""}}},
29+
PayloadType: 111,
30+
},
31+
},
32+
HeaderExtensions: []RTPHeaderExtensionParameter{
33+
{URI: "urn:ietf:params:rtp-hdrext:sdes:mid"},
34+
{URI: "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"},
35+
{URI: "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"},
36+
},
37+
}
38+
39+
seenPacket, seenPacketCancel := context.WithCancel(context.Background())
40+
receiver.OnTrack(func(trackRemote *TrackRemote, r *RTPReceiver) {
41+
r.SetRTPParameters(p)
42+
43+
incomingTrackCodecs := r.Track().Codec()
44+
45+
assert.EqualValues(t, p.HeaderExtensions, r.Track().params.HeaderExtensions)
46+
47+
assert.EqualValues(t, p.Codecs[0].MimeType, incomingTrackCodecs.MimeType)
48+
assert.EqualValues(t, p.Codecs[0].ClockRate, incomingTrackCodecs.ClockRate)
49+
assert.EqualValues(t, p.Codecs[0].Channels, incomingTrackCodecs.Channels)
50+
assert.EqualValues(t, p.Codecs[0].SDPFmtpLine, incomingTrackCodecs.SDPFmtpLine)
51+
assert.EqualValues(t, p.Codecs[0].RTCPFeedback, incomingTrackCodecs.RTCPFeedback)
52+
assert.EqualValues(t, p.Codecs[0].PayloadType, incomingTrackCodecs.PayloadType)
53+
54+
seenPacketCancel()
55+
})
56+
57+
peerConnectionsConnected := untilConnectionState(PeerConnectionStateConnected, sender, receiver)
58+
59+
assert.NoError(t, signalPair(sender, receiver))
60+
61+
peerConnectionsConnected.Wait()
62+
assert.NoError(t, outgoingTrack.WriteSample(media.Sample{Data: []byte{0xAA}, Duration: time.Second}))
63+
64+
<-seenPacket.Done()
65+
assert.NoError(t, wan.Stop())
66+
closePairNow(t, sender, receiver)
67+
}

0 commit comments

Comments
 (0)