diff --git a/rtpcodec.go b/rtpcodec.go index 798d3093f31..3d11e7c8fa5 100644 --- a/rtpcodec.go +++ b/rtpcodec.go @@ -143,7 +143,7 @@ func codecParametersFuzzySearch( return RTPCodecParameters{}, codecMatchNone } -// Given a CodecParameters find the RTX CodecParameters if one exists. +// Given a CodecParameters find the RTX Payload if one exists. func findRTXPayloadType(needle PayloadType, haystack []RTPCodecParameters) PayloadType { aptStr := fmt.Sprintf("apt=%d", needle) for _, c := range haystack { @@ -155,6 +155,18 @@ func findRTXPayloadType(needle PayloadType, haystack []RTPCodecParameters) Paylo return PayloadType(0) } +// Given a CodecParameters find the RTX CodecParameters if one exists. +func findRTXPCodec(needle PayloadType, haystack []RTPCodecParameters) *RTPCodecParameters { + aptStr := fmt.Sprintf("apt=%d", needle) + for _, c := range haystack { + if aptStr == c.SDPFmtpLine { + return &c + } + } + + return nil +} + func rtcpFeedbackIntersection(a, b []RTCPFeedback) (out []RTCPFeedback) { for _, aFeedback := range a { for _, bFeeback := range b { diff --git a/rtptransceiver.go b/rtptransceiver.go index 5ce0f2d4819..90d89964dab 100644 --- a/rtptransceiver.go +++ b/rtptransceiver.go @@ -86,6 +86,17 @@ func (t *RTPTransceiver) getCodecs() []RTPCodecParameters { } } + // check if direction is specified + if t.direction.Load() != nil { + for _, c := range filteredCodecs { + if rtxCodec := findRTXPCodec(c.PayloadType, mediaEngineCodecs); rtxCodec != nil { + if _, matchType := codecParametersFuzzySearch(*rtxCodec, filteredCodecs); matchType == codecMatchNone { + filteredCodecs = append(filteredCodecs, *rtxCodec) + } + } + } + } + return filteredCodecs } diff --git a/rtptransceiver_test.go b/rtptransceiver_test.go index 298556a6a2e..0b6396cb33f 100644 --- a/rtptransceiver_test.go +++ b/rtptransceiver_test.go @@ -135,3 +135,55 @@ func Test_RTPTransceiver_SetCodecPreferences_PayloadType(t *testing.T) { closePairNow(t, offerPC, answerPC) } + +func Test_RTPTransceiver_SDP_Codec(t *testing.T) { + tests := []struct { + Label string + setPreferences bool + }{ + { + Label: "NoSetCodecPreferences", + setPreferences: false, + }, + { + Label: "SetCodecPreferences", + setPreferences: true, + }, + } + + for _, test := range tests { + t.Run(test.Label, func(t *testing.T) { + pc, err := NewPeerConnection(Configuration{}) + assert.NoError(t, err) + + transceiver, err := pc.AddTransceiverFromKind( + RTPCodecTypeVideo, + RTPTransceiverInit{ + Direction: RTPTransceiverDirectionRecvonly, + }, + ) + assert.NoError(t, err) + + if test.setPreferences { + codec := RTPCodecCapability{ + "video/vp8", 90000, 0, "", nil, + } + + err = transceiver.SetCodecPreferences( + []RTPCodecParameters{ + { + RTPCodecCapability: codec, + }, + }, + ) + assert.NoError(t, err) + } + + offer, err := pc.CreateOffer(nil) + assert.NoError(t, err) + + assert.Equal(t, true, strings.Contains(offer.SDP, "apt=96")) + assert.NoError(t, pc.Close()) + }) + } +}