Files
webrtc/rtptransceiver_test.go
boks1971 b1a08a7e0d Use transceiver's codec in getCodecs
Issue:
------
A transceiver's codecs can be modified using `SetCodecPreferences`.
When retrieving codecs from the transceiver after changing codec
preferences of the transceiver (for example changing the SDPFmtpLine),
the filter function was using codec from the media engine. Thus,
the change from `SetCodecPreferences` is lost.

Fix:
----
- When a match is found (either exact or partial), use the codec from
the transceiver instead of media engine.
- Based on feedback, add checks to ensure that PayloadType is not
set incorrectly (i. e. set with a default of 0). If it is set to 0,
use the PayloadType from the media engine, i. e. negotiated value.

Testing:
--------
- Modify SDPFmtpLine of a codec of a transceiver using
`SetCodecPreferences` method of `RTPTransceiver`.
- Invoke `GetParamters` of `RTPREceiver` and ensure that `Codecs`
has the SDPFmtpLine modification. Before this change the change
was not reflected in the returned `Codecs`.
- Check that SDP has payload from codec set via SetCodecPreferences
2021-10-12 22:05:15 -07:00

134 lines
3.6 KiB
Go

// +build !js
package webrtc
import (
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_RTPTransceiver_SetCodecPreferences(t *testing.T) {
me := &MediaEngine{}
api := NewAPI(WithMediaEngine(me))
assert.NoError(t, me.RegisterDefaultCodecs())
me.pushCodecs(me.videoCodecs, RTPCodecTypeVideo)
me.pushCodecs(me.audioCodecs, RTPCodecTypeAudio)
tr := RTPTransceiver{kind: RTPCodecTypeVideo, api: api, codecs: me.videoCodecs}
assert.EqualValues(t, me.videoCodecs, tr.getCodecs())
failTestCases := [][]RTPCodecParameters{
{
{
RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 2, "minptime=10;useinbandfec=1", nil},
PayloadType: 111,
},
},
{
{
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
PayloadType: 96,
},
{
RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 2, "minptime=10;useinbandfec=1", nil},
PayloadType: 111,
},
},
}
for _, testCase := range failTestCases {
assert.ErrorIs(t, tr.SetCodecPreferences(testCase), errRTPTransceiverCodecUnsupported)
}
successTestCases := [][]RTPCodecParameters{
{
{
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
PayloadType: 96,
},
},
{
{
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
PayloadType: 96,
},
{
RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=96", nil},
PayloadType: 97,
},
{
RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=0", nil},
PayloadType: 98,
},
{
RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=98", nil},
PayloadType: 99,
},
},
}
for _, testCase := range successTestCases {
assert.NoError(t, tr.SetCodecPreferences(testCase))
}
assert.NoError(t, tr.SetCodecPreferences(nil))
assert.NotEqual(t, 0, len(tr.getCodecs()))
assert.NoError(t, tr.SetCodecPreferences([]RTPCodecParameters{}))
assert.NotEqual(t, 0, len(tr.getCodecs()))
}
// Assert that SetCodecPreferences properly filters codecs and PayloadTypes are respected
func Test_RTPTransceiver_SetCodecPreferences_PayloadType(t *testing.T) {
testCodec := RTPCodecParameters{
RTPCodecCapability: RTPCodecCapability{"video/testCodec", 90000, 0, "", nil},
PayloadType: 50,
}
m := &MediaEngine{}
assert.NoError(t, m.RegisterDefaultCodecs())
offerPC, err := NewAPI(WithMediaEngine(m)).NewPeerConnection(Configuration{})
assert.NoError(t, err)
assert.NoError(t, m.RegisterCodec(testCodec, RTPCodecTypeVideo))
answerPC, err := NewAPI(WithMediaEngine(m)).NewPeerConnection(Configuration{})
assert.NoError(t, err)
_, err = offerPC.AddTransceiverFromKind(RTPCodecTypeVideo)
assert.NoError(t, err)
answerTransceiver, err := answerPC.AddTransceiverFromKind(RTPCodecTypeVideo)
assert.NoError(t, err)
assert.NoError(t, answerTransceiver.SetCodecPreferences([]RTPCodecParameters{
testCodec,
{
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
PayloadType: 51,
},
}))
offer, err := offerPC.CreateOffer(nil)
assert.NoError(t, err)
assert.NoError(t, offerPC.SetLocalDescription(offer))
assert.NoError(t, answerPC.SetRemoteDescription(offer))
answer, err := answerPC.CreateAnswer(nil)
assert.NoError(t, err)
// VP8 with proper PayloadType
assert.NotEqual(t, -1, strings.Index(answer.SDP, "a=rtpmap:51 VP8/90000"))
// testCodec is ignored since offerer doesn't support
assert.Equal(t, -1, strings.Index(answer.SDP, "testCodec"))
closePairNow(t, offerPC, answerPC)
}