mirror of
https://github.com/pion/webrtc.git
synced 2025-12-24 11:51:03 +08:00
Fix missing RTX codec using SetCodecPreferences
This commit is contained in:
14
rtpcodec.go
14
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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user