Skip to content

Commit 050b4d4

Browse files
committed
Enable Simulcast RTP Headers by default
Relates to #2557
1 parent 1345033 commit 050b4d4

7 files changed

+31
-75
lines changed

examples/simulcast/main.go

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"os"
1515
"time"
1616

17-
"github.com/pion/interceptor"
1817
"github.com/pion/rtcp"
1918
"github.com/pion/webrtc/v4"
2019
"github.com/pion/webrtc/v4/examples/internal/signal"
@@ -33,34 +32,8 @@ func main() {
3332
},
3433
}
3534

36-
// Enable Extension Headers needed for Simulcast
37-
m := &webrtc.MediaEngine{}
38-
if err := m.RegisterDefaultCodecs(); err != nil {
39-
panic(err)
40-
}
41-
for _, extension := range []string{
42-
"urn:ietf:params:rtp-hdrext:sdes:mid",
43-
"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id",
44-
"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id",
45-
} {
46-
if err := m.RegisterHeaderExtension(webrtc.RTPHeaderExtensionCapability{URI: extension}, webrtc.RTPCodecTypeVideo); err != nil {
47-
panic(err)
48-
}
49-
}
50-
51-
// Create a InterceptorRegistry. This is the user configurable RTP/RTCP Pipeline.
52-
// This provides NACKs, RTCP Reports and other features. If you use `webrtc.NewPeerConnection`
53-
// this is enabled by default. If you are manually managing You MUST create a InterceptorRegistry
54-
// for each PeerConnection.
55-
i := &interceptor.Registry{}
56-
57-
// Use the default set of Interceptors
58-
if err := webrtc.RegisterDefaultInterceptors(m, i); err != nil {
59-
panic(err)
60-
}
61-
6235
// Create a new RTCPeerConnection
63-
peerConnection, err := webrtc.NewAPI(webrtc.WithMediaEngine(m), webrtc.WithInterceptorRegistry(i)).NewPeerConnection(config)
36+
peerConnection, err := webrtc.NewPeerConnection(config)
6437
if err != nil {
6538
panic(err)
6639
}

interceptor.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ func RegisterDefaultInterceptors(mediaEngine *MediaEngine, interceptorRegistry *
3030
return err
3131
}
3232

33+
if err := ConfigureSimulcastExtensionHeaders(mediaEngine); err != nil {
34+
return err
35+
}
36+
3337
return ConfigureTWCCSender(mediaEngine, interceptorRegistry)
3438
}
3539

@@ -123,6 +127,19 @@ func ConfigureCongestionControlFeedback(mediaEngine *MediaEngine, interceptorReg
123127
return nil
124128
}
125129

130+
// ConfigureSimulcastExtensionHeaders enables the RTP Extenison Headers needed for Simulcast
131+
func ConfigureSimulcastExtensionHeaders(mediaEngine *MediaEngine) error {
132+
if err := mediaEngine.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: sdp.SDESMidURI}, RTPCodecTypeVideo); err != nil {
133+
return err
134+
}
135+
136+
if err := mediaEngine.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: sdp.SDESRTPStreamIDURI}, RTPCodecTypeVideo); err != nil {
137+
return err
138+
}
139+
140+
return mediaEngine.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: sdesRepairRTPStreamIDURI}, RTPCodecTypeVideo)
141+
}
142+
126143
type interceptorToTrackLocalWriter struct{ interceptor atomic.Value } // interceptor.RTPWriter }
127144

128145
func (i *interceptorToTrackLocalWriter) WriteRTP(header *rtp.Header, payload []byte) (int, error) {

mediaengine_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ a=rtpmap:111 opus/48000/2
195195

196196
m := MediaEngine{}
197197
assert.NoError(t, m.RegisterDefaultCodecs())
198-
registerSimulcastHeaderExtensions(&m, RTPCodecTypeAudio)
198+
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: sdp.SDESMidURI}, RTPCodecTypeAudio))
199199
assert.NoError(t, m.updateFromRemoteDescription(mustParse(headerExtensions)))
200200

201201
assert.False(t, m.negotiatedVideo)

peerconnection.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,17 +1671,17 @@ func (pc *PeerConnection) undeclaredRTPMediaProcessor() {
16711671
continue
16721672
}
16731673

1674+
pc.dtlsTransport.storeSimulcastStream(stream)
1675+
16741676
if atomic.AddUint64(&simulcastRoutineCount, 1) >= simulcastMaxProbeRoutines {
16751677
atomic.AddUint64(&simulcastRoutineCount, ^uint64(0))
16761678
pc.log.Warn(ErrSimulcastProbeOverflow.Error())
1677-
pc.dtlsTransport.storeSimulcastStream(stream)
16781679
continue
16791680
}
16801681

16811682
go func(rtpStream io.Reader, ssrc SSRC) {
16821683
if err := pc.handleIncomingSSRC(rtpStream, ssrc); err != nil {
16831684
pc.log.Errorf(incomingUnhandledRTPSsrc, ssrc, err)
1684-
pc.dtlsTransport.storeSimulcastStream(stream)
16851685
}
16861686
atomic.AddUint64(&simulcastRoutineCount, ^uint64(0))
16871687
}(stream, SSRC(ssrc))

peerconnection_media_test.go

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,6 @@ var (
3636
errNoTransceiverwithMid = errors.New("no transceiver with mid")
3737
)
3838

39-
func registerSimulcastHeaderExtensions(m *MediaEngine, codecType RTPCodecType) {
40-
for _, extension := range []string{
41-
sdp.SDESMidURI,
42-
sdp.SDESRTPStreamIDURI,
43-
sdesRepairRTPStreamIDURI,
44-
} {
45-
if err := m.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: extension}, codecType); err != nil {
46-
panic(err)
47-
}
48-
}
49-
}
50-
5139
/*
5240
Integration test for bi-directional peers
5341
@@ -1051,10 +1039,8 @@ func TestPeerConnection_Simulcast_Probe(t *testing.T) {
10511039
unhandledSimulcastError := make(chan struct{})
10521040

10531041
m := &MediaEngine{}
1054-
if err := m.RegisterDefaultCodecs(); err != nil {
1055-
panic(err)
1056-
}
1057-
registerSimulcastHeaderExtensions(m, RTPCodecTypeVideo)
1042+
assert.NoError(t, m.RegisterDefaultCodecs())
1043+
assert.NoError(t, ConfigureSimulcastExtensionHeaders(m))
10581044

10591045
pcOffer, pcAnswer, err := NewAPI(WithSettingEngine(SettingEngine{
10601046
LoggerFactory: &undeclaredSsrcLoggerFactory{unhandledSimulcastError},
@@ -1086,7 +1072,6 @@ func TestPeerConnection_Simulcast_Probe(t *testing.T) {
10861072
filtered += scanner.Text() + "\r\n"
10871073
}
10881074
}
1089-
10901075
return
10911076
}))
10921077

@@ -1228,13 +1213,6 @@ func TestPeerConnection_Simulcast(t *testing.T) {
12281213
var ridMapLock sync.RWMutex
12291214
ridMap := map[string]int{}
12301215

1231-
// Enable Extension Headers needed for Simulcast
1232-
m := &MediaEngine{}
1233-
if err := m.RegisterDefaultCodecs(); err != nil {
1234-
panic(err)
1235-
}
1236-
registerSimulcastHeaderExtensions(m, RTPCodecTypeVideo)
1237-
12381216
assertRidCorrect := func(t *testing.T) {
12391217
ridMapLock.Lock()
12401218
defer ridMapLock.Unlock()
@@ -1260,7 +1238,7 @@ func TestPeerConnection_Simulcast(t *testing.T) {
12601238
}
12611239

12621240
t.Run("RTP Extension Based", func(t *testing.T) {
1263-
pcOffer, pcAnswer, err := NewAPI(WithMediaEngine(m)).newPair(Configuration{})
1241+
pcOffer, pcAnswer, err := newPair()
12641242
assert.NoError(t, err)
12651243

12661244
vp8WriterA, err := NewTrackLocalStaticRTP(RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion2", WithRTPStreamID("a"))
@@ -1360,14 +1338,7 @@ func TestPeerConnection_Simulcast_NoDataChannel(t *testing.T) {
13601338
report := test.CheckRoutines(t)
13611339
defer report()
13621340

1363-
// Enable Extension Headers needed for Simulcast
1364-
m := &MediaEngine{}
1365-
if err := m.RegisterDefaultCodecs(); err != nil {
1366-
panic(err)
1367-
}
1368-
registerSimulcastHeaderExtensions(m, RTPCodecTypeVideo)
1369-
1370-
pcSender, pcReceiver, err := NewAPI(WithMediaEngine(m)).newPair(Configuration{})
1341+
pcSender, pcReceiver, err := newPair()
13711342
assert.NoError(t, err)
13721343

13731344
var wg sync.WaitGroup

peerconnection_renegotiation_test.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,12 +1014,6 @@ func TestPeerConnection_Renegotiation_Simulcast(t *testing.T) {
10141014
report := test.CheckRoutines(t)
10151015
defer report()
10161016

1017-
m := &MediaEngine{}
1018-
if err := m.RegisterDefaultCodecs(); err != nil {
1019-
panic(err)
1020-
}
1021-
registerSimulcastHeaderExtensions(m, RTPCodecTypeVideo)
1022-
10231017
originalRids := []string{"a", "b", "c"}
10241018
signalWithRids := func(sessionDescription string, rids []string) string {
10251019
sessionDescription = strings.SplitAfter(sessionDescription, "a=end-of-candidates\r\n")[0]
@@ -1081,7 +1075,7 @@ func TestPeerConnection_Renegotiation_Simulcast(t *testing.T) {
10811075

10821076
t.Run("Disable Transceiver", func(t *testing.T) {
10831077
trackMap = map[string]*TrackRemote{}
1084-
pcOffer, pcAnswer, err := NewAPI(WithMediaEngine(m)).newPair(Configuration{})
1078+
pcOffer, pcAnswer, err := newPair()
10851079
assert.NoError(t, err)
10861080

10871081
vp8Writer, err := NewTrackLocalStaticRTP(RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion2")
@@ -1114,7 +1108,7 @@ func TestPeerConnection_Renegotiation_Simulcast(t *testing.T) {
11141108

11151109
t.Run("Change RID", func(t *testing.T) {
11161110
trackMap = map[string]*TrackRemote{}
1117-
pcOffer, pcAnswer, err := NewAPI(WithMediaEngine(m)).newPair(Configuration{})
1111+
pcOffer, pcAnswer, err := newPair()
11181112
assert.NoError(t, err)
11191113

11201114
vp8Writer, err := NewTrackLocalStaticRTP(RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion2")

rtpreceiver_go_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"testing"
1212
"time"
1313

14+
"github.com/pion/sdp/v3"
1415
"github.com/pion/webrtc/v4/pkg/media"
1516
"github.com/stretchr/testify/assert"
1617
)
@@ -34,9 +35,9 @@ func TestSetRTPParameters(t *testing.T) {
3435
},
3536
},
3637
HeaderExtensions: []RTPHeaderExtensionParameter{
37-
{URI: "urn:ietf:params:rtp-hdrext:sdes:mid"},
38-
{URI: "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"},
39-
{URI: "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"},
38+
{URI: sdp.SDESMidURI},
39+
{URI: sdp.SDESRTPStreamIDURI},
40+
{URI: sdesRepairRTPStreamIDURI},
4041
},
4142
}
4243

0 commit comments

Comments
 (0)