mirror of
https://github.com/pion/webrtc.git
synced 2025-11-03 09:40:59 +08:00
Upgrade golangci-lint, more linters
Introduces new linters, upgrade golangci-lint to version (v1.63.4)
This commit is contained in:
@@ -18,6 +18,7 @@ import (
|
||||
)
|
||||
|
||||
// pion/webrtc#1078
|
||||
// .
|
||||
func TestOpusCase(t *testing.T) {
|
||||
pc, err := NewPeerConnection(Configuration{})
|
||||
assert.NoError(t, err)
|
||||
@@ -33,6 +34,7 @@ func TestOpusCase(t *testing.T) {
|
||||
}
|
||||
|
||||
// pion/example-webrtc-applications#89
|
||||
// .
|
||||
func TestVideoCase(t *testing.T) {
|
||||
pc, err := NewPeerConnection(Configuration{})
|
||||
assert.NoError(t, err)
|
||||
@@ -49,10 +51,11 @@ func TestVideoCase(t *testing.T) {
|
||||
assert.NoError(t, pc.Close())
|
||||
}
|
||||
|
||||
func TestMediaEngineRemoteDescription(t *testing.T) {
|
||||
func TestMediaEngineRemoteDescription(t *testing.T) { //nolint:maintidx
|
||||
mustParse := func(raw string) sdp.SessionDescription {
|
||||
s := sdp.SessionDescription{}
|
||||
assert.NoError(t, s.Unmarshal([]byte(raw)))
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
@@ -62,12 +65,12 @@ o=- 4596489990601351948 2 IN IP4 127.0.0.1
|
||||
s=-
|
||||
t=0 0
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(noMedia)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(noMedia)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.False(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.False(t, mediaEngine.negotiatedAudio)
|
||||
})
|
||||
|
||||
t.Run("Enable Opus", func(t *testing.T) {
|
||||
@@ -80,14 +83,14 @@ a=rtpmap:111 opus/48000/2
|
||||
a=fmtp:111 minptime=10; useinbandfec=1
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(opusSamePayload)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(opusSamePayload)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
opusCodec, _, err := m.getCodecByPayload(111)
|
||||
opusCodec, _, err := mediaEngine.getCodecByPayload(111)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, opusCodec.MimeType, MimeTypeOpus)
|
||||
})
|
||||
@@ -102,17 +105,17 @@ a=rtpmap:112 opus/48000/2
|
||||
a=fmtp:112 minptime=10; useinbandfec=1
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(opusSamePayload)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(opusSamePayload)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
_, _, err := m.getCodecByPayload(111)
|
||||
_, _, err := mediaEngine.getCodecByPayload(111)
|
||||
assert.Error(t, err)
|
||||
|
||||
opusCodec, _, err := m.getCodecByPayload(112)
|
||||
opusCodec, _, err := mediaEngine.getCodecByPayload(112)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, opusCodec.MimeType, MimeTypeOpus)
|
||||
})
|
||||
@@ -127,14 +130,14 @@ a=rtpmap:96 opus/48000/2
|
||||
a=fmtp:96 minptime=10; useinbandfec=1
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(opusSamePayload)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(opusSamePayload)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
opusCodec, _, err := m.getCodecByPayload(96)
|
||||
opusCodec, _, err := mediaEngine.getCodecByPayload(96)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, opusCodec.MimeType, MimeTypeOpus)
|
||||
})
|
||||
@@ -149,14 +152,14 @@ a=rtpmap:111 OPUS/48000/2
|
||||
a=fmtp:111 minptime=10; useinbandfec=1
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(opusUpcase)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(opusUpcase)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
opusCodec, _, err := m.getCodecByPayload(111)
|
||||
opusCodec, _, err := mediaEngine.getCodecByPayload(111)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, opusCodec.MimeType, "audio/OPUS")
|
||||
})
|
||||
@@ -170,14 +173,14 @@ m=audio 9 UDP/TLS/RTP/SAVPF 111
|
||||
a=rtpmap:111 opus/48000/2
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(opusNoFmtp)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(opusNoFmtp)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
opusCodec, _, err := m.getCodecByPayload(111)
|
||||
opusCodec, _, err := mediaEngine.getCodecByPayload(111)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, opusCodec.MimeType, MimeTypeOpus)
|
||||
})
|
||||
@@ -193,20 +196,26 @@ a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
|
||||
a=rtpmap:111 opus/48000/2
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: sdp.SDESMidURI}, RTPCodecTypeAudio))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(headerExtensions)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{URI: sdp.SDESMidURI}, RTPCodecTypeAudio),
|
||||
)
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(headerExtensions)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
absID, absAudioEnabled, absVideoEnabled := m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.ABSSendTimeURI})
|
||||
absID, absAudioEnabled, absVideoEnabled := mediaEngine.getHeaderExtensionID(
|
||||
RTPHeaderExtensionCapability{sdp.ABSSendTimeURI},
|
||||
)
|
||||
assert.Equal(t, absID, 0)
|
||||
assert.False(t, absAudioEnabled)
|
||||
assert.False(t, absVideoEnabled)
|
||||
|
||||
midID, midAudioEnabled, midVideoEnabled := m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.SDESMidURI})
|
||||
midID, midAudioEnabled, midVideoEnabled := mediaEngine.getHeaderExtensionID(
|
||||
RTPHeaderExtensionCapability{sdp.SDESMidURI},
|
||||
)
|
||||
assert.Equal(t, midID, 7)
|
||||
assert.True(t, midAudioEnabled)
|
||||
assert.False(t, midVideoEnabled)
|
||||
@@ -225,21 +234,29 @@ a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
|
||||
a=rtpmap:111 opus/48000/2
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: "urn:ietf:params:rtp-hdrext:sdes:mid"}, RTPCodecTypeAudio))
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{URI: "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"}, RTPCodecTypeAudio))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(headerExtensions)))
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{URI: "urn:ietf:params:rtp-hdrext:sdes:mid"}, RTPCodecTypeAudio,
|
||||
))
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{URI: "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"}, RTPCodecTypeAudio,
|
||||
))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(headerExtensions)))
|
||||
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
absID, absAudioEnabled, absVideoEnabled := m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.ABSSendTimeURI})
|
||||
absID, absAudioEnabled, absVideoEnabled := mediaEngine.getHeaderExtensionID(
|
||||
RTPHeaderExtensionCapability{sdp.ABSSendTimeURI},
|
||||
)
|
||||
assert.Equal(t, absID, 0)
|
||||
assert.False(t, absAudioEnabled)
|
||||
assert.False(t, absVideoEnabled)
|
||||
|
||||
midID, midAudioEnabled, midVideoEnabled := m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.SDESMidURI})
|
||||
midID, midAudioEnabled, midVideoEnabled := mediaEngine.getHeaderExtensionID(
|
||||
RTPHeaderExtensionCapability{sdp.SDESMidURI},
|
||||
)
|
||||
assert.Equal(t, midID, 7)
|
||||
assert.True(t, midAudioEnabled)
|
||||
assert.False(t, midVideoEnabled)
|
||||
@@ -256,21 +273,23 @@ a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c1f
|
||||
a=rtpmap:98 H264/90000
|
||||
a=fmtp:98 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f", nil},
|
||||
PayloadType: 127,
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{
|
||||
MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f", nil,
|
||||
},
|
||||
PayloadType: 127,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
|
||||
assert.True(t, m.negotiatedVideo)
|
||||
assert.False(t, m.negotiatedAudio)
|
||||
assert.True(t, mediaEngine.negotiatedVideo)
|
||||
assert.False(t, mediaEngine.negotiatedAudio)
|
||||
|
||||
supportedH264, _, err := m.getCodecByPayload(98)
|
||||
supportedH264, _, err := mediaEngine.getCodecByPayload(98)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, supportedH264.MimeType, MimeTypeH264)
|
||||
|
||||
_, _, err = m.getCodecByPayload(96)
|
||||
_, _, err = mediaEngine.getCodecByPayload(96)
|
||||
assert.Error(t, err)
|
||||
})
|
||||
|
||||
@@ -283,14 +302,16 @@ m=video 60323 UDP/TLS/RTP/SAVPF 96 98
|
||||
a=rtpmap:96 H264/90000
|
||||
a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c1f
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f", nil},
|
||||
PayloadType: 127,
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{
|
||||
MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f", nil,
|
||||
},
|
||||
PayloadType: 127,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.Error(t, m.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
assert.Error(t, mediaEngine.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
|
||||
_, _, err := m.getCodecByPayload(96)
|
||||
_, _, err := mediaEngine.getCodecByPayload(96)
|
||||
assert.Error(t, err)
|
||||
})
|
||||
|
||||
@@ -302,16 +323,16 @@ t=0 0
|
||||
m=video 60323 UDP/TLS/RTP/SAVPF 96
|
||||
a=rtpmap:96 VP9/90000
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=0", nil},
|
||||
PayloadType: 98,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
|
||||
assert.True(t, m.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedVideo)
|
||||
|
||||
_, _, err := m.getCodecByPayload(96)
|
||||
_, _, err := mediaEngine.getCodecByPayload(96)
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
|
||||
@@ -323,16 +344,16 @@ t=0 0
|
||||
m=video 60323 UDP/TLS/RTP/SAVPF 96
|
||||
a=rtpmap:96 VP8/90000
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
|
||||
PayloadType: 96,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
|
||||
assert.True(t, m.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedVideo)
|
||||
|
||||
_, _, err := m.getCodecByPayload(96)
|
||||
_, _, err := mediaEngine.getCodecByPayload(96)
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
|
||||
@@ -358,64 +379,68 @@ a=fmtp:96 profile-id=2
|
||||
a=rtpmap:97 rtx/90000
|
||||
a=fmtp:97 apt=96
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
|
||||
PayloadType: 96,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeRTX, 90000, 0, "apt=96", nil},
|
||||
PayloadType: 97,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f", nil},
|
||||
PayloadType: 102,
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{
|
||||
MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f", nil,
|
||||
},
|
||||
PayloadType: 102,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeRTX, 90000, 0, "apt=102", nil},
|
||||
PayloadType: 103,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f", nil},
|
||||
PayloadType: 104,
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{
|
||||
MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f", nil,
|
||||
},
|
||||
PayloadType: 104,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeRTX, 90000, 0, "apt=104", nil},
|
||||
PayloadType: 105,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=2", nil},
|
||||
PayloadType: 98,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeRTX, 90000, 0, "apt=98", nil},
|
||||
PayloadType: 99,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
|
||||
assert.True(t, m.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedVideo)
|
||||
|
||||
vp9Codec, _, err := m.getCodecByPayload(96)
|
||||
vp9Codec, _, err := mediaEngine.getCodecByPayload(96)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, vp9Codec.MimeType, MimeTypeVP9)
|
||||
vp9RTX, _, err := m.getCodecByPayload(97)
|
||||
vp9RTX, _, err := mediaEngine.getCodecByPayload(97)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, vp9RTX.MimeType, MimeTypeRTX)
|
||||
|
||||
h264P1Codec, _, err := m.getCodecByPayload(106)
|
||||
h264P1Codec, _, err := mediaEngine.getCodecByPayload(106)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, h264P1Codec.MimeType, MimeTypeH264)
|
||||
assert.Equal(t, h264P1Codec.SDPFmtpLine, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f")
|
||||
h264P1RTX, _, err := m.getCodecByPayload(107)
|
||||
h264P1RTX, _, err := mediaEngine.getCodecByPayload(107)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, h264P1RTX.MimeType, MimeTypeRTX)
|
||||
assert.Equal(t, h264P1RTX.SDPFmtpLine, "apt=106")
|
||||
|
||||
h264P0Codec, _, err := m.getCodecByPayload(108)
|
||||
h264P0Codec, _, err := mediaEngine.getCodecByPayload(108)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, h264P0Codec.MimeType, MimeTypeH264)
|
||||
assert.Equal(t, h264P0Codec.SDPFmtpLine, "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f")
|
||||
h264P0RTX, _, err := m.getCodecByPayload(109)
|
||||
h264P0RTX, _, err := mediaEngine.getCodecByPayload(109)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, h264P0RTX.MimeType, MimeTypeRTX)
|
||||
assert.Equal(t, h264P0RTX.SDPFmtpLine, "apt=108")
|
||||
@@ -433,24 +458,24 @@ a=fmtp:96 profile-id=2
|
||||
a=rtpmap:97 rtx/90000
|
||||
a=fmtp:97 apt=96
|
||||
`
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
|
||||
PayloadType: 94,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=1", nil},
|
||||
PayloadType: 96,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeRTX, 90000, 0, "apt=96", nil},
|
||||
PayloadType: 97,
|
||||
}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(profileLevels)))
|
||||
|
||||
assert.True(t, m.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedVideo)
|
||||
|
||||
_, _, err := m.getCodecByPayload(97)
|
||||
_, _, err := mediaEngine.getCodecByPayload(97)
|
||||
assert.ErrorIs(t, err, ErrCodecNotFound)
|
||||
})
|
||||
}
|
||||
@@ -468,52 +493,79 @@ func TestMediaEngineHeaderExtensionDirection(t *testing.T) {
|
||||
}
|
||||
|
||||
t.Run("No Direction", func(t *testing.T) {
|
||||
m := &MediaEngine{}
|
||||
registerCodec(m)
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio))
|
||||
mediaEngine := &MediaEngine{}
|
||||
registerCodec(mediaEngine)
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio,
|
||||
))
|
||||
|
||||
params := m.getRTPParametersByKind(RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly})
|
||||
params := mediaEngine.getRTPParametersByKind(
|
||||
RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly},
|
||||
)
|
||||
|
||||
assert.Equal(t, 1, len(params.HeaderExtensions))
|
||||
})
|
||||
|
||||
t.Run("Same Direction", func(t *testing.T) {
|
||||
m := &MediaEngine{}
|
||||
registerCodec(m)
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionRecvonly))
|
||||
mediaEngine := &MediaEngine{}
|
||||
registerCodec(mediaEngine)
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionRecvonly,
|
||||
))
|
||||
|
||||
params := m.getRTPParametersByKind(RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly})
|
||||
params := mediaEngine.getRTPParametersByKind(
|
||||
RTPCodecTypeAudio,
|
||||
[]RTPTransceiverDirection{RTPTransceiverDirectionRecvonly},
|
||||
)
|
||||
|
||||
assert.Equal(t, 1, len(params.HeaderExtensions))
|
||||
})
|
||||
|
||||
t.Run("Different Direction", func(t *testing.T) {
|
||||
m := &MediaEngine{}
|
||||
registerCodec(m)
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionSendonly))
|
||||
mediaEngine := &MediaEngine{}
|
||||
registerCodec(mediaEngine)
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionSendonly,
|
||||
))
|
||||
|
||||
params := m.getRTPParametersByKind(RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly})
|
||||
params := mediaEngine.getRTPParametersByKind(
|
||||
RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly},
|
||||
)
|
||||
|
||||
assert.Equal(t, 0, len(params.HeaderExtensions))
|
||||
})
|
||||
|
||||
t.Run("Invalid Direction", func(t *testing.T) {
|
||||
m := &MediaEngine{}
|
||||
registerCodec(m)
|
||||
mediaEngine := &MediaEngine{}
|
||||
registerCodec(mediaEngine)
|
||||
|
||||
assert.ErrorIs(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionSendrecv), ErrRegisterHeaderExtensionInvalidDirection)
|
||||
assert.ErrorIs(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionInactive), ErrRegisterHeaderExtensionInvalidDirection)
|
||||
assert.ErrorIs(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirection(0)), ErrRegisterHeaderExtensionInvalidDirection)
|
||||
assert.ErrorIs(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionSendrecv,
|
||||
), ErrRegisterHeaderExtensionInvalidDirection)
|
||||
assert.ErrorIs(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirectionInactive,
|
||||
), ErrRegisterHeaderExtensionInvalidDirection)
|
||||
assert.ErrorIs(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio, RTPTransceiverDirection(0),
|
||||
), ErrRegisterHeaderExtensionInvalidDirection)
|
||||
})
|
||||
|
||||
t.Run("Unique extmapid with different codec", func(t *testing.T) {
|
||||
m := &MediaEngine{}
|
||||
registerCodec(m)
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio))
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"pion-header-test2"}, RTPCodecTypeVideo))
|
||||
mediaEngine := &MediaEngine{}
|
||||
registerCodec(mediaEngine)
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test"}, RTPCodecTypeAudio),
|
||||
)
|
||||
assert.NoError(t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"pion-header-test2"}, RTPCodecTypeVideo),
|
||||
)
|
||||
|
||||
audio := m.getRTPParametersByKind(RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly})
|
||||
video := m.getRTPParametersByKind(RTPCodecTypeVideo, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly})
|
||||
audio := mediaEngine.getRTPParametersByKind(
|
||||
RTPCodecTypeAudio, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly},
|
||||
)
|
||||
video := mediaEngine.getRTPParametersByKind(
|
||||
RTPCodecTypeVideo, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly},
|
||||
)
|
||||
|
||||
assert.Equal(t, 1, len(audio.HeaderExtensions))
|
||||
assert.Equal(t, 1, len(video.HeaderExtensions))
|
||||
@@ -521,23 +573,23 @@ func TestMediaEngineHeaderExtensionDirection(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
// If a user attempts to register a codec twice we should just discard duplicate calls
|
||||
// If a user attempts to register a codec twice we should just discard duplicate calls.
|
||||
func TestMediaEngineDoubleRegister(t *testing.T) {
|
||||
m := MediaEngine{}
|
||||
mediaEngine := MediaEngine{}
|
||||
|
||||
assert.NoError(t, m.RegisterCodec(
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(
|
||||
RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 0, "", nil},
|
||||
PayloadType: 111,
|
||||
}, RTPCodecTypeAudio))
|
||||
|
||||
assert.NoError(t, m.RegisterCodec(
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(
|
||||
RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 0, "", nil},
|
||||
PayloadType: 111,
|
||||
}, RTPCodecTypeAudio))
|
||||
|
||||
assert.Equal(t, len(m.audioCodecs), 1)
|
||||
assert.Equal(t, len(mediaEngine.audioCodecs), 1)
|
||||
}
|
||||
|
||||
// The cloned MediaEngine instance should be able to update negotiated header extensions.
|
||||
@@ -569,6 +621,7 @@ func TestExtensionIdCollision(t *testing.T) {
|
||||
mustParse := func(raw string) sdp.SessionDescription {
|
||||
s := sdp.SessionDescription{}
|
||||
assert.NoError(t, s.Unmarshal([]byte(raw)))
|
||||
|
||||
return s
|
||||
}
|
||||
sdpSnippet := `v=0
|
||||
@@ -582,36 +635,57 @@ a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
|
||||
a=rtpmap:111 opus/48000/2
|
||||
`
|
||||
|
||||
m := MediaEngine{}
|
||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||
mediaEngine := MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterDefaultCodecs())
|
||||
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{sdp.SDESMidURI}, RTPCodecTypeVideo))
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{"urn:3gpp:video-orientation"}, RTPCodecTypeVideo))
|
||||
assert.NoError(
|
||||
t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{sdp.SDESMidURI}, RTPCodecTypeVideo,
|
||||
),
|
||||
)
|
||||
assert.NoError(
|
||||
t, mediaEngine.RegisterHeaderExtension(
|
||||
RTPHeaderExtensionCapability{"urn:3gpp:video-orientation"}, RTPCodecTypeVideo,
|
||||
),
|
||||
)
|
||||
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{sdp.SDESMidURI}, RTPCodecTypeAudio))
|
||||
assert.NoError(t, m.RegisterHeaderExtension(RTPHeaderExtensionCapability{sdp.AudioLevelURI}, RTPCodecTypeAudio))
|
||||
assert.NoError(
|
||||
t, mediaEngine.RegisterHeaderExtension(RTPHeaderExtensionCapability{sdp.SDESMidURI}, RTPCodecTypeAudio),
|
||||
)
|
||||
assert.NoError(
|
||||
t, mediaEngine.RegisterHeaderExtension(RTPHeaderExtensionCapability{sdp.AudioLevelURI}, RTPCodecTypeAudio),
|
||||
)
|
||||
|
||||
assert.NoError(t, m.updateFromRemoteDescription(mustParse(sdpSnippet)))
|
||||
assert.NoError(t, mediaEngine.updateFromRemoteDescription(mustParse(sdpSnippet)))
|
||||
|
||||
assert.True(t, m.negotiatedAudio)
|
||||
assert.False(t, m.negotiatedVideo)
|
||||
assert.True(t, mediaEngine.negotiatedAudio)
|
||||
assert.False(t, mediaEngine.negotiatedVideo)
|
||||
|
||||
id, audioNegotiated, videoNegotiated := m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.ABSSendTimeURI})
|
||||
id, audioNegotiated, videoNegotiated := mediaEngine.getHeaderExtensionID(RTPHeaderExtensionCapability{
|
||||
sdp.ABSSendTimeURI,
|
||||
})
|
||||
assert.Equal(t, id, 0)
|
||||
assert.False(t, audioNegotiated)
|
||||
assert.False(t, videoNegotiated)
|
||||
|
||||
id, audioNegotiated, videoNegotiated = m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.SDESMidURI})
|
||||
id, audioNegotiated, videoNegotiated = mediaEngine.getHeaderExtensionID(RTPHeaderExtensionCapability{
|
||||
sdp.SDESMidURI,
|
||||
})
|
||||
assert.Equal(t, id, 2)
|
||||
assert.True(t, audioNegotiated)
|
||||
assert.False(t, videoNegotiated)
|
||||
|
||||
id, audioNegotiated, videoNegotiated = m.getHeaderExtensionID(RTPHeaderExtensionCapability{sdp.AudioLevelURI})
|
||||
id, audioNegotiated, videoNegotiated = mediaEngine.getHeaderExtensionID(RTPHeaderExtensionCapability{
|
||||
sdp.AudioLevelURI,
|
||||
})
|
||||
assert.Equal(t, id, 1)
|
||||
assert.True(t, audioNegotiated)
|
||||
assert.False(t, videoNegotiated)
|
||||
|
||||
params := m.getRTPParametersByKind(RTPCodecTypeVideo, []RTPTransceiverDirection{RTPTransceiverDirectionSendonly})
|
||||
params := mediaEngine.getRTPParametersByKind(
|
||||
RTPCodecTypeVideo,
|
||||
[]RTPTransceiverDirection{RTPTransceiverDirectionSendonly},
|
||||
)
|
||||
extensions := params.HeaderExtensions
|
||||
|
||||
assert.Equal(t, 2, len(extensions))
|
||||
@@ -689,12 +763,19 @@ a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001
|
||||
|
||||
for _, codec := range []RTPCodecParameters{
|
||||
{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeType: mimeTypeVp8, ClockRate: 90000, RTCPFeedback: feedback},
|
||||
PayloadType: 96,
|
||||
RTPCodecCapability: RTPCodecCapability{
|
||||
MimeType: mimeTypeVp8, ClockRate: 90000, RTCPFeedback: feedback,
|
||||
},
|
||||
PayloadType: 96,
|
||||
},
|
||||
{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeType: "video/h264", ClockRate: 90000, SDPFmtpLine: "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f", RTCPFeedback: feedback},
|
||||
PayloadType: 127,
|
||||
RTPCodecCapability: RTPCodecCapability{
|
||||
MimeType: "video/h264",
|
||||
ClockRate: 90000,
|
||||
SDPFmtpLine: "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f",
|
||||
RTCPFeedback: feedback,
|
||||
},
|
||||
PayloadType: 127,
|
||||
},
|
||||
} {
|
||||
assert.NoError(t, me.RegisterCodec(codec, RTPCodecTypeVideo))
|
||||
@@ -723,7 +804,7 @@ a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001
|
||||
}
|
||||
}
|
||||
|
||||
// rtcp-fb should be an intersection of local and remote
|
||||
// rtcp-fb should be an intersection of local and remote.
|
||||
func TestRTCPFeedbackHandling(t *testing.T) {
|
||||
const offerSdp = `
|
||||
v=0
|
||||
@@ -748,9 +829,11 @@ a=rtcp-fb:96 goog-remb
|
||||
a=rtcp-fb:96 nack
|
||||
`
|
||||
|
||||
runTest := func(createTransceiver bool, t *testing.T) {
|
||||
m := &MediaEngine{}
|
||||
assert.NoError(t, m.RegisterCodec(RTPCodecParameters{
|
||||
runTest := func(t *testing.T, createTransceiver bool) {
|
||||
t.Helper()
|
||||
|
||||
mediaEngine := &MediaEngine{}
|
||||
assert.NoError(t, mediaEngine.RegisterCodec(RTPCodecParameters{
|
||||
RTPCodecCapability: RTPCodecCapability{MimeType: MimeTypeVP8, ClockRate: 90000, RTCPFeedback: []RTCPFeedback{
|
||||
{Type: TypeRTCPFBTransportCC},
|
||||
{Type: TypeRTCPFBNACK},
|
||||
@@ -758,7 +841,7 @@ a=rtcp-fb:96 nack
|
||||
PayloadType: 96,
|
||||
}, RTPCodecTypeVideo))
|
||||
|
||||
peerConnection, err := NewAPI(WithMediaEngine(m)).NewPeerConnection(Configuration{})
|
||||
peerConnection, err := NewAPI(WithMediaEngine(mediaEngine)).NewPeerConnection(Configuration{})
|
||||
assert.NoError(t, err)
|
||||
|
||||
if createTransceiver {
|
||||
@@ -786,10 +869,10 @@ a=rtcp-fb:96 nack
|
||||
}
|
||||
|
||||
t.Run("recvonly", func(t *testing.T) {
|
||||
runTest(false, t)
|
||||
runTest(t, false)
|
||||
})
|
||||
|
||||
t.Run("sendrecv", func(t *testing.T) {
|
||||
runTest(true, t)
|
||||
runTest(t, true)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user