diff --git a/mediaengine.go b/mediaengine.go index d9f48d81..ab735e9f 100644 --- a/mediaengine.go +++ b/mediaengine.go @@ -240,7 +240,7 @@ func (m *MediaEngine) RegisterDefaultCodecs() error { func (m *MediaEngine) addCodec(codecs []RTPCodecParameters, codec RTPCodecParameters) ([]RTPCodecParameters, error) { for _, c := range codecs { if c.PayloadType == codec.PayloadType { - if c.MimeType == codec.MimeType && + if strings.EqualFold(c.MimeType, codec.MimeType) && fmtp.ClockRateEqual(c.MimeType, c.ClockRate, codec.ClockRate) && fmtp.ChannelsEqual(c.MimeType, c.Channels, codec.Channels) { return codecs, nil @@ -798,7 +798,7 @@ func payloaderForCodec(codec RTPCodecCapability) (rtp.Payloader, error) { func (m *MediaEngine) isRTXEnabled(typ RTPCodecType, directions []RTPTransceiverDirection) bool { for _, p := range m.getRTPParametersByKind(typ, directions).Codecs { - if p.MimeType == MimeTypeRTX { + if strings.EqualFold(p.MimeType, MimeTypeRTX) { return true } } @@ -808,7 +808,7 @@ func (m *MediaEngine) isRTXEnabled(typ RTPCodecType, directions []RTPTransceiver func (m *MediaEngine) isFECEnabled(typ RTPCodecType, directions []RTPTransceiverDirection) bool { for _, p := range m.getRTPParametersByKind(typ, directions).Codecs { - if strings.Contains(p.MimeType, MimeTypeFlexFEC) { + if strings.Contains(strings.ToLower(p.MimeType), MimeTypeFlexFEC) { return true } } diff --git a/mediaengine_test.go b/mediaengine_test.go index a4d4d6f3..40209a35 100644 --- a/mediaengine_test.go +++ b/mediaengine_test.go @@ -575,21 +575,71 @@ func TestMediaEngineHeaderExtensionDirection(t *testing.T) { // If a user attempts to register a codec twice we should just discard duplicate calls. func TestMediaEngineDoubleRegister(t *testing.T) { - mediaEngine := MediaEngine{} + t.Run("Same Codec", func(t *testing.T) { + mediaEngine := MediaEngine{} - assert.NoError(t, mediaEngine.RegisterCodec( - RTPCodecParameters{ - RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 0, "", nil}, - PayloadType: 111, - }, RTPCodecTypeAudio)) + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 0, "", nil}, + PayloadType: 111, + }, RTPCodecTypeAudio)) - assert.NoError(t, mediaEngine.RegisterCodec( - RTPCodecParameters{ - RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 0, "", nil}, - PayloadType: 111, - }, RTPCodecTypeAudio)) + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 0, "", nil}, + PayloadType: 111, + }, RTPCodecTypeAudio)) - assert.Equal(t, len(mediaEngine.audioCodecs), 1) + assert.Equal(t, len(mediaEngine.audioCodecs), 1) + }) + + t.Run("Case Insensitive Audio Codec", func(t *testing.T) { + mediaEngine := MediaEngine{} + + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{"audio/OPUS", 48000, 0, "", nil}, + PayloadType: 111, + }, RTPCodecTypeAudio)) + + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{"audio/opus", 48000, 0, "", nil}, + PayloadType: 111, + }, RTPCodecTypeAudio)) + + assert.Equal(t, len(mediaEngine.audioCodecs), 1) + }) + + t.Run("Case Insensitive Video Codec", func(t *testing.T) { + mediaEngine := MediaEngine{} + + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{strings.ToUpper(MimeTypeRTX), 90000, 0, "", nil}, + PayloadType: 98, + }, RTPCodecTypeVideo)) + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{MimeTypeRTX, 90000, 0, "", nil}, + PayloadType: 98, + }, RTPCodecTypeVideo)) + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{strings.ToUpper(MimeTypeFlexFEC), 90000, 0, "", nil}, + PayloadType: 100, + }, RTPCodecTypeVideo)) + assert.NoError(t, mediaEngine.RegisterCodec( + RTPCodecParameters{ + RTPCodecCapability: RTPCodecCapability{MimeTypeFlexFEC, 90000, 0, "", nil}, + PayloadType: 100, + }, RTPCodecTypeVideo)) + assert.Equal(t, len(mediaEngine.videoCodecs), 2) + isRTX := mediaEngine.isRTXEnabled(RTPCodecTypeVideo, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly}) + assert.True(t, isRTX) + isFEC := mediaEngine.isFECEnabled(RTPCodecTypeVideo, []RTPTransceiverDirection{RTPTransceiverDirectionRecvonly}) + assert.True(t, isFEC) + }) } // If a user attempts to register a codec with same payload but with different