Allow publishers to set layer availability (#51)

* support client message to update active layers

* update to match new protocol
This commit is contained in:
David Zhao
2021-07-13 21:35:08 -07:00
committed by GitHub
parent a3cfebec68
commit 850fecf931
4 changed files with 67 additions and 0 deletions

View File

@@ -12,6 +12,7 @@ import (
"github.com/pion/rtcp"
"github.com/pion/webrtc/v3"
"github.com/pion/webrtc/v3/pkg/rtcerr"
"github.com/thoas/go-funk"
"github.com/livekit/livekit-server/pkg/config"
"github.com/livekit/livekit-server/pkg/logger"
@@ -105,6 +106,17 @@ func (t *MediaTrack) SetMuted(muted bool) {
t.lock.RUnlock()
}
func (t *MediaTrack) SetSimulcastLayers(layers []livekit.VideoQuality) {
t.lock.RLock()
defer t.lock.RUnlock()
if t.receiver != nil {
layers16 := funk.Map(layers, func(l livekit.VideoQuality) uint16 {
return uint16(spatialLayerForQuality(l))
}).([]uint16)
t.receiver.SetAvailableLayers(layers16)
}
}
func (t *MediaTrack) OnClose(f func()) {
t.onClose = f
}

View File

@@ -92,6 +92,7 @@ type PublishedTrack interface {
Name() string
IsMuted() bool
SetMuted(muted bool)
SetSimulcastLayers(layers []livekit.VideoQuality)
AddSubscriber(participant Participant) error
RemoveSubscriber(participantId string)
IsSubscriber(subId string) bool

View File

@@ -90,6 +90,11 @@ type FakePublishedTrack struct {
setMutedArgsForCall []struct {
arg1 bool
}
SetSimulcastLayersStub func([]livekit.VideoQuality)
setSimulcastLayersMutex sync.RWMutex
setSimulcastLayersArgsForCall []struct {
arg1 []livekit.VideoQuality
}
StartStub func()
startMutex sync.RWMutex
startArgsForCall []struct {
@@ -562,6 +567,43 @@ func (fake *FakePublishedTrack) SetMutedArgsForCall(i int) bool {
return argsForCall.arg1
}
func (fake *FakePublishedTrack) SetSimulcastLayers(arg1 []livekit.VideoQuality) {
var arg1Copy []livekit.VideoQuality
if arg1 != nil {
arg1Copy = make([]livekit.VideoQuality, len(arg1))
copy(arg1Copy, arg1)
}
fake.setSimulcastLayersMutex.Lock()
fake.setSimulcastLayersArgsForCall = append(fake.setSimulcastLayersArgsForCall, struct {
arg1 []livekit.VideoQuality
}{arg1Copy})
stub := fake.SetSimulcastLayersStub
fake.recordInvocation("SetSimulcastLayers", []interface{}{arg1Copy})
fake.setSimulcastLayersMutex.Unlock()
if stub != nil {
fake.SetSimulcastLayersStub(arg1)
}
}
func (fake *FakePublishedTrack) SetSimulcastLayersCallCount() int {
fake.setSimulcastLayersMutex.RLock()
defer fake.setSimulcastLayersMutex.RUnlock()
return len(fake.setSimulcastLayersArgsForCall)
}
func (fake *FakePublishedTrack) SetSimulcastLayersCalls(stub func([]livekit.VideoQuality)) {
fake.setSimulcastLayersMutex.Lock()
defer fake.setSimulcastLayersMutex.Unlock()
fake.SetSimulcastLayersStub = stub
}
func (fake *FakePublishedTrack) SetSimulcastLayersArgsForCall(i int) []livekit.VideoQuality {
fake.setSimulcastLayersMutex.RLock()
defer fake.setSimulcastLayersMutex.RUnlock()
argsForCall := fake.setSimulcastLayersArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakePublishedTrack) Start() {
fake.startMutex.Lock()
fake.startArgsForCall = append(fake.startArgsForCall, struct {
@@ -662,6 +704,8 @@ func (fake *FakePublishedTrack) Invocations() map[string][][]interface{} {
defer fake.removeSubscriberMutex.RUnlock()
fake.setMutedMutex.RLock()
defer fake.setMutedMutex.RUnlock()
fake.setSimulcastLayersMutex.RLock()
defer fake.setSimulcastLayersMutex.RUnlock()
fake.startMutex.RLock()
defer fake.startMutex.RUnlock()
fake.toProtoMutex.RLock()

View File

@@ -442,6 +442,16 @@ func (r *RoomManager) rtcSessionWorker(room *rtc.Room, participant types.Partici
}
case *livekit.SignalRequest_Leave:
_ = participant.Close()
case *livekit.SignalRequest_Simulcast:
for _, track := range participant.GetPublishedTracks() {
if track.ID() == msg.Simulcast.TrackSid {
logger.Debugw("updating simulcast layers",
"participant", participant.Identity(),
"track", track.ID(),
"layers", msg.Simulcast.Layers)
track.SetSimulcastLayers(msg.Simulcast.Layers)
}
}
}
}
}