Skip to content

Commit 5768cbd

Browse files
Fix missing RTX codec using SetCodecPreferences
1 parent 98a0025 commit 5768cbd

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

rtpcodec.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func codecParametersFuzzySearch(
143143
return RTPCodecParameters{}, codecMatchNone
144144
}
145145

146-
// Given a CodecParameters find the RTX CodecParameters if one exists.
146+
// Given a CodecParameters find the RTX Payload if one exists.
147147
func findRTXPayloadType(needle PayloadType, haystack []RTPCodecParameters) PayloadType {
148148
aptStr := fmt.Sprintf("apt=%d", needle)
149149
for _, c := range haystack {
@@ -155,6 +155,29 @@ func findRTXPayloadType(needle PayloadType, haystack []RTPCodecParameters) Paylo
155155
return PayloadType(0)
156156
}
157157

158+
// Given a RTPCodecParameters check if it exists in a of other RTPCodecParameters.
159+
func doesCodecExistInList(codec RTPCodecParameters, codecList []RTPCodecParameters) bool {
160+
for _, c := range codecList {
161+
if codec.SDPFmtpLine == c.SDPFmtpLine && codec.MimeType == c.MimeType {
162+
return true
163+
}
164+
}
165+
166+
return false
167+
}
168+
169+
// Given a CodecParameters find the RTX CodecParameters if one exists.
170+
func findRTXPCodec(needle PayloadType, haystack []RTPCodecParameters) *RTPCodecParameters {
171+
aptStr := fmt.Sprintf("apt=%d", needle)
172+
for _, c := range haystack {
173+
if aptStr == c.SDPFmtpLine {
174+
return &c
175+
}
176+
}
177+
178+
return nil
179+
}
180+
158181
func rtcpFeedbackIntersection(a, b []RTCPFeedback) (out []RTCPFeedback) {
159182
for _, aFeedback := range a {
160183
for _, bFeeback := range b {

rtptransceiver.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ func (t *RTPTransceiver) getCodecs() []RTPCodecParameters {
8686
}
8787
}
8888

89+
// check if direction is specified
90+
if t.direction.Load() != nil {
91+
for _, c := range filteredCodecs {
92+
if rtxCodec := findRTXPCodec(c.PayloadType, mediaEngineCodecs); rtxCodec != nil {
93+
if !doesCodecExistInList(*rtxCodec, filteredCodecs) {
94+
filteredCodecs = append(filteredCodecs, *rtxCodec)
95+
}
96+
}
97+
}
98+
}
99+
89100
return filteredCodecs
90101
}
91102

rtptransceiver_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,53 @@ func Test_RTPTransceiver_SetCodecPreferences_PayloadType(t *testing.T) {
135135

136136
closePairNow(t, offerPC, answerPC)
137137
}
138+
139+
// func Test_RTPTransceiver_SDP_Codec(t *testing.T) {
140+
// tests := []struct {
141+
// Label string
142+
// setPreferences bool
143+
// }{
144+
// {
145+
// Label: "NoSetCodecPreferences",
146+
// setPreferences: false,
147+
// },
148+
// {
149+
// Label: "SetCodecPreferences",
150+
// setPreferences: true,
151+
// },
152+
// }
153+
154+
// for _, test := range tests {
155+
// t.Run(test.Label, func(t *testing.T) {
156+
// pc, err := NewPeerConnection(Configuration{})
157+
// assert.NoError(t, err)
158+
159+
// transceiver, err := pc.AddTransceiverFromKind(
160+
// RTPCodecTypeVideo,
161+
// RTPTransceiverInit{
162+
// Direction: RTPTransceiverDirectionRecvonly,
163+
// },
164+
// )
165+
// assert.NoError(t, err)
166+
167+
// if test.setPreferences {
168+
// codec := RTPCodecCapability{
169+
// "video/vp8", 90000, 0, "", nil,
170+
// }
171+
172+
// assert.NoError(t, transceiver.SetCodecPreferences(
173+
// []RTPCodecParameters{
174+
// {
175+
// RTPCodecCapability: codec,
176+
// },
177+
// },
178+
// ))
179+
// }
180+
181+
// offer, err := pc.CreateOffer(nil)
182+
// assert.NoError(t, err)
183+
184+
// assert.Equal(t, true, strings.Contains(offer.SDP, "apt=96"))
185+
// })
186+
// }
187+
// }

0 commit comments

Comments
 (0)