Skip to content

Commit 334692b

Browse files
authored
Add findFECPayloadType (#3084)
#### Description Before this, any interceptor that tries to read FEC payload type from `info *interceptor.StreamInfo`, always gets 0. This PR implements the logic to find FEC payload type. Also, MimeType consts are moved from mediaengine.go to mimetype.go, since mediaengine.go is not included in the WASM build.
1 parent 0b5e438 commit 334692b

File tree

5 files changed

+143
-43
lines changed

5 files changed

+143
-43
lines changed

mediaengine.go

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,6 @@ import (
2020
"github.com/pion/webrtc/v4/internal/fmtp"
2121
)
2222

23-
const (
24-
// MimeTypeH264 H264 MIME type.
25-
// Note: Matching should be case insensitive.
26-
MimeTypeH264 = "video/H264"
27-
// MimeTypeH265 H265 MIME type
28-
// Note: Matching should be case insensitive.
29-
MimeTypeH265 = "video/H265"
30-
// MimeTypeOpus Opus MIME type
31-
// Note: Matching should be case insensitive.
32-
MimeTypeOpus = "audio/opus"
33-
// MimeTypeVP8 VP8 MIME type
34-
// Note: Matching should be case insensitive.
35-
MimeTypeVP8 = "video/VP8"
36-
// MimeTypeVP9 VP9 MIME type
37-
// Note: Matching should be case insensitive.
38-
MimeTypeVP9 = "video/VP9"
39-
// MimeTypeAV1 AV1 MIME type
40-
// Note: Matching should be case insensitive.
41-
MimeTypeAV1 = "video/AV1"
42-
// MimeTypeG722 G722 MIME type
43-
// Note: Matching should be case insensitive.
44-
MimeTypeG722 = "audio/G722"
45-
// MimeTypePCMU PCMU MIME type
46-
// Note: Matching should be case insensitive.
47-
MimeTypePCMU = "audio/PCMU"
48-
// MimeTypePCMA PCMA MIME type
49-
// Note: Matching should be case insensitive.
50-
MimeTypePCMA = "audio/PCMA"
51-
// MimeTypeRTX RTX MIME type
52-
// Note: Matching should be case insensitive.
53-
MimeTypeRTX = "video/rtx"
54-
// MimeTypeFlexFEC FEC MIME Type
55-
// Note: Matching should be case insensitive.
56-
MimeTypeFlexFEC = "video/flexfec"
57-
// MimeTypeFlexFEC03 FlexFEC03 MIME Type
58-
// Note: Matching should be case insensitive.
59-
MimeTypeFlexFEC03 = "video/flexfec-03"
60-
// MimeTypeUlpFEC UlpFEC MIME Type
61-
// Note: Matching should be case insensitive.
62-
MimeTypeUlpFEC = "video/ulpfec"
63-
)
64-
6523
type mediaEngineHeaderExtension struct {
6624
uri string
6725
isAudio, isVideo bool

mimetype.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// SPDX-FileCopyrightText: 2025 The Pion community <https://pion.ly>
2+
// SPDX-License-Identifier: MIT
3+
4+
package webrtc
5+
6+
const (
7+
// MimeTypeH264 H264 MIME type.
8+
// Note: Matching should be case insensitive.
9+
MimeTypeH264 = "video/H264"
10+
// MimeTypeH265 H265 MIME type
11+
// Note: Matching should be case insensitive.
12+
MimeTypeH265 = "video/H265"
13+
// MimeTypeOpus Opus MIME type
14+
// Note: Matching should be case insensitive.
15+
MimeTypeOpus = "audio/opus"
16+
// MimeTypeVP8 VP8 MIME type
17+
// Note: Matching should be case insensitive.
18+
MimeTypeVP8 = "video/VP8"
19+
// MimeTypeVP9 VP9 MIME type
20+
// Note: Matching should be case insensitive.
21+
MimeTypeVP9 = "video/VP9"
22+
// MimeTypeAV1 AV1 MIME type
23+
// Note: Matching should be case insensitive.
24+
MimeTypeAV1 = "video/AV1"
25+
// MimeTypeG722 G722 MIME type
26+
// Note: Matching should be case insensitive.
27+
MimeTypeG722 = "audio/G722"
28+
// MimeTypePCMU PCMU MIME type
29+
// Note: Matching should be case insensitive.
30+
MimeTypePCMU = "audio/PCMU"
31+
// MimeTypePCMA PCMA MIME type
32+
// Note: Matching should be case insensitive.
33+
MimeTypePCMA = "audio/PCMA"
34+
// MimeTypeRTX RTX MIME type
35+
// Note: Matching should be case insensitive.
36+
MimeTypeRTX = "video/rtx"
37+
// MimeTypeFlexFEC FEC MIME Type
38+
// Note: Matching should be case insensitive.
39+
MimeTypeFlexFEC = "video/flexfec"
40+
// MimeTypeFlexFEC03 FlexFEC03 MIME Type
41+
// Note: Matching should be case insensitive.
42+
MimeTypeFlexFEC03 = "video/flexfec-03"
43+
// MimeTypeUlpFEC UlpFEC MIME Type
44+
// Note: Matching should be case insensitive.
45+
MimeTypeUlpFEC = "video/ulpfec"
46+
)

rtpcodec.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,17 @@ func findRTXPayloadType(needle PayloadType, haystack []RTPCodecParameters) Paylo
155155
return PayloadType(0)
156156
}
157157

158+
// For now, only FlexFEC is supported.
159+
func findFECPayloadType(haystack []RTPCodecParameters) PayloadType {
160+
for _, c := range haystack {
161+
if strings.Contains(c.RTPCodecCapability.MimeType, MimeTypeFlexFEC) {
162+
return c.PayloadType
163+
}
164+
}
165+
166+
return PayloadType(0)
167+
}
168+
158169
func rtcpFeedbackIntersection(a, b []RTCPFeedback) (out []RTCPFeedback) {
159170
for _, aFeedback := range a {
160171
for _, bFeeback := range b {

rtpcodec_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// SPDX-FileCopyrightText: 2025 The Pion community <https://pion.ly>
2+
// SPDX-License-Identifier: MIT
3+
4+
package webrtc
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestFindFECPayloadType(t *testing.T) {
13+
for _, test := range []struct {
14+
Haystack []RTPCodecParameters
15+
ResultPayloadType PayloadType
16+
}{
17+
{
18+
Haystack: []RTPCodecParameters{
19+
{
20+
PayloadType: 1,
21+
RTPCodecCapability: RTPCodecCapability{
22+
MimeType: MimeTypeFlexFEC03,
23+
ClockRate: 90000,
24+
Channels: 0,
25+
SDPFmtpLine: "repair-window=10000000",
26+
RTCPFeedback: nil,
27+
},
28+
},
29+
},
30+
ResultPayloadType: 1,
31+
},
32+
{
33+
Haystack: []RTPCodecParameters{
34+
{
35+
PayloadType: 2,
36+
RTPCodecCapability: RTPCodecCapability{
37+
MimeType: MimeTypeFlexFEC,
38+
ClockRate: 90000,
39+
Channels: 0,
40+
SDPFmtpLine: "repair-window=10000000",
41+
RTCPFeedback: nil,
42+
},
43+
},
44+
{
45+
PayloadType: 1,
46+
RTPCodecCapability: RTPCodecCapability{
47+
MimeType: MimeTypeFlexFEC03,
48+
ClockRate: 90000,
49+
Channels: 0,
50+
SDPFmtpLine: "repair-window=10000000",
51+
RTCPFeedback: nil,
52+
},
53+
},
54+
},
55+
ResultPayloadType: 2,
56+
},
57+
{
58+
Haystack: []RTPCodecParameters{
59+
{
60+
PayloadType: 100,
61+
RTPCodecCapability: RTPCodecCapability{
62+
MimeType: MimeTypeH265,
63+
ClockRate: 90000,
64+
Channels: 0,
65+
SDPFmtpLine: "",
66+
RTCPFeedback: nil,
67+
},
68+
},
69+
{
70+
PayloadType: 101,
71+
RTPCodecCapability: RTPCodecCapability{
72+
MimeType: MimeTypeRTX,
73+
ClockRate: 90000,
74+
Channels: 0,
75+
SDPFmtpLine: "apt=100",
76+
RTCPFeedback: nil,
77+
},
78+
},
79+
},
80+
ResultPayloadType: 0,
81+
},
82+
} {
83+
assert.Equal(t, test.ResultPayloadType, findFECPayloadType(test.Haystack))
84+
}
85+
}

rtpsender.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ func (r *RTPSender) Send(parameters RTPSendParameters) error {
355355
parameters.Encodings[idx].FEC.SSRC,
356356
codec.PayloadType,
357357
findRTXPayloadType(codec.PayloadType, rtpParameters.Codecs),
358-
0,
358+
findFECPayloadType(rtpParameters.Codecs),
359359
codec.RTPCodecCapability,
360360
parameters.HeaderExtensions,
361361
)

0 commit comments

Comments
 (0)