From 15e91344be1a3e51e178a0d075bd4319c96e6ee0 Mon Sep 17 00:00:00 2001 From: cnderrauber Date: Wed, 8 Jun 2022 15:55:48 +0800 Subject: [PATCH] add disabled_codecs to client conf, and disable it at server side (#755) * add disabled_codecs to client conf, and disable it at server side * update go mod --- go.mod | 2 +- go.sum | 2 + pkg/clientconfiguration/conf.go | 7 ++++ pkg/rtc/participant.go | 18 ++++++++- pkg/rtc/participant_internal_test.go | 57 ++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 44fd1a0f2..b57ced2a8 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/google/wire v0.5.0 github.com/gorilla/websocket v1.4.2 github.com/hashicorp/golang-lru v0.5.4 - github.com/livekit/protocol v0.13.3-0.20220607094330-e36e6426a094 + github.com/livekit/protocol v0.13.3-0.20220608063907-5e0777215366 github.com/livekit/rtcscore-go v0.0.0-20220524203225-dfd1ba40744a github.com/mackerelio/go-osstat v0.2.1 github.com/magefile/mage v1.13.0 diff --git a/go.sum b/go.sum index 3fc277e16..f26246ce5 100644 --- a/go.sum +++ b/go.sum @@ -137,6 +137,8 @@ github.com/livekit/protocol v0.13.3-0.20220530102138-51a8116f88b2 h1:ioAZAmtoQnH github.com/livekit/protocol v0.13.3-0.20220530102138-51a8116f88b2/go.mod h1:BLtSeVmn2rLP37xjzw7gHgaAmkWl3L/L9bPvgSbaOfo= github.com/livekit/protocol v0.13.3-0.20220607094330-e36e6426a094 h1:DwZfNfyg5LaX3N1Eh19rcycTcyzpgqH0DpEkhB1CnI8= github.com/livekit/protocol v0.13.3-0.20220607094330-e36e6426a094/go.mod h1:BLtSeVmn2rLP37xjzw7gHgaAmkWl3L/L9bPvgSbaOfo= +github.com/livekit/protocol v0.13.3-0.20220608063907-5e0777215366 h1:wm0ftw/i8oZr4lxQLnV4iDpG32T3cUhy6K6wQ5OFqe8= +github.com/livekit/protocol v0.13.3-0.20220608063907-5e0777215366/go.mod h1:BLtSeVmn2rLP37xjzw7gHgaAmkWl3L/L9bPvgSbaOfo= github.com/livekit/rtcscore-go v0.0.0-20220524203225-dfd1ba40744a h1:cENjhGfslLSDV07gt8ASy47Wd12Q0kBS7hsdunyQ62I= github.com/livekit/rtcscore-go v0.0.0-20220524203225-dfd1ba40744a/go.mod h1:116ych8UaEs9vfIE8n6iZCZ30iagUFTls0vRmC+Ix5U= github.com/mackerelio/go-osstat v0.2.1 h1:5AeAcBEutEErAOlDz6WCkEvm6AKYgHTUQrfwm5RbeQc= diff --git a/pkg/clientconfiguration/conf.go b/pkg/clientconfiguration/conf.go index 10946d9b7..27af23528 100644 --- a/pkg/clientconfiguration/conf.go +++ b/pkg/clientconfiguration/conf.go @@ -7,4 +7,11 @@ var StaticConfigurations = []ConfigurationItem{ // Configuration: &livekit.ClientConfiguration{ResumeConnection: livekit.ClientConfigSetting_DISABLED}, // Merge: false, // }, + // { + // Match: &ScriptMatch{Expr: `c.browser == "safari" && c.os == "ios"`}, + // Configuration: &livekit.ClientConfiguration{DisabledCodecs: &livekit.DisabledCodecs{Codecs: []*livekit.Codec{ + // &livekit.Codec{Mime: "video/vp9"}, + // }}}, + // Merge: false, + // }, } diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index fb296ed0d..b9e47a3ef 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -170,6 +170,22 @@ func NewParticipant(params ParticipantParams) (*ParticipantImpl, error) { if p.updateCache, err = lru.New(32); err != nil { return nil, err } + + enabledCodecs := make([]*livekit.Codec, 0, len(p.params.EnabledCodecs)) + for _, c := range p.params.EnabledCodecs { + var disabled bool + for _, disableCodec := range p.params.ClientConf.GetDisabledCodecs().GetCodecs() { + // disable codec's fmtp is empty means disable this codec entirely + if strings.EqualFold(c.Mime, disableCodec.Mime) && (disableCodec.FmtpLine == "" || disableCodec.FmtpLine == c.FmtpLine) { + disabled = true + break + } + } + if !disabled { + enabledCodecs = append(enabledCodecs, c) + } + } + p.publisher, err = NewPCTransport(TransportParams{ ParticipantID: p.params.SID, ParticipantIdentity: p.params.Identity, @@ -178,7 +194,7 @@ func NewParticipant(params ParticipantParams) (*ParticipantImpl, error) { Config: params.Config, CongestionControlConfig: params.CongestionControlConfig, Telemetry: p.params.Telemetry, - EnabledCodecs: p.params.EnabledCodecs, + EnabledCodecs: enabledCodecs, Logger: LoggerWithPCTarget(params.Logger, livekit.SignalTarget_PUBLISHER), SimTracks: params.SimTracks, }) diff --git a/pkg/rtc/participant_internal_test.go b/pkg/rtc/participant_internal_test.go index e10ff2fb3..125bf1449 100644 --- a/pkg/rtc/participant_internal_test.go +++ b/pkg/rtc/participant_internal_test.go @@ -1,9 +1,11 @@ package rtc import ( + "strings" "testing" "time" + "github.com/pion/webrtc/v3" "github.com/stretchr/testify/require" "github.com/livekit/livekit-server/pkg/sfu/buffer" @@ -436,10 +438,55 @@ func TestSetStableTrackID(t *testing.T) { } } +func TestDisableCodecs(t *testing.T) { + participant := newParticipantForTestWithOpts(livekit.ParticipantIdentity("123"), &participantOpts{ + publisher: false, + clientConf: &livekit.ClientConfiguration{ + DisabledCodecs: &livekit.DisabledCodecs{ + Codecs: []*livekit.Codec{ + {Mime: "video/h264"}, + }, + }, + }, + }) + + participant.SetMigrateState(types.MigrateStateComplete) + + pc, err := webrtc.NewPeerConnection(webrtc.Configuration{}) + require.NoError(t, err) + transceiver, err := pc.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo, webrtc.RTPTransceiverInit{Direction: webrtc.RTPTransceiverDirectionSendrecv}) + require.NoError(t, err) + sdp, err := pc.CreateOffer(nil) + require.NoError(t, err) + pc.SetLocalDescription(sdp) + codecs := transceiver.Receiver().GetParameters().Codecs + var found264 bool + for _, c := range codecs { + if strings.EqualFold(c.MimeType, "video/h264") { + found264 = true + } + } + require.True(t, found264) + + // negotiated codec should not contain h264 + anwser, err := participant.HandleOffer(sdp) + require.NoError(t, err) + require.NoError(t, pc.SetRemoteDescription(anwser), anwser.SDP, sdp.SDP) + codecs = transceiver.Receiver().GetParameters().Codecs + found264 = false + for _, c := range codecs { + if strings.EqualFold(c.MimeType, "video/h264") { + found264 = true + } + } + require.False(t, found264) +} + type participantOpts struct { permissions *livekit.ParticipantPermission protocolVersion types.ProtocolVersion publisher bool + clientConf *livekit.ClientConfiguration } func newParticipantForTestWithOpts(identity livekit.ParticipantIdentity, opts *participantOpts) *ParticipantImpl { @@ -465,6 +512,14 @@ func newParticipantForTestWithOpts(identity livekit.ParticipantIdentity, opts *p grants.Video.SetCanPublishData(opts.permissions.CanPublishData) grants.Video.SetCanSubscribe(opts.permissions.CanSubscribe) } + + enabledCodecs := make([]*livekit.Codec, 0, len(conf.Room.EnabledCodecs)) + for _, c := range conf.Room.EnabledCodecs { + enabledCodecs = append(enabledCodecs, &livekit.Codec{ + Mime: c.Mime, + FmtpLine: c.FmtpLine, + }) + } p, _ := NewParticipant(ParticipantParams{ SID: livekit.ParticipantID(utils.NewGuid(utils.ParticipantPrefix)), Identity: identity, @@ -473,6 +528,8 @@ func newParticipantForTestWithOpts(identity livekit.ParticipantIdentity, opts *p ProtocolVersion: opts.protocolVersion, PLIThrottleConfig: conf.RTC.PLIThrottle, Grants: grants, + EnabledCodecs: enabledCodecs, + ClientConf: opts.clientConf, }) p.isPublisher.Store(opts.publisher)