Fix missing RTX codec using SetCodecPreferences

This commit is contained in:
Stephan Rotolante
2025-03-03 22:54:39 -05:00
parent e4ff415b2b
commit 2d892b5d68
3 changed files with 76 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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())
})
}
}