From 3960a075014efc7ec447da7999082f04e5961283 Mon Sep 17 00:00:00 2001 From: Yohan Totting Date: Fri, 1 Mar 2024 12:43:35 +0700 Subject: [PATCH] fix VP9 svc can't render multiple videos --- bitratecontroller.go | 5 +++-- clientracklist.go | 4 ++-- clienttracksvc.go | 24 +++++++++++++++--------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/bitratecontroller.go b/bitratecontroller.go index d38b7b0..beba2d1 100644 --- a/bitratecontroller.go +++ b/bitratecontroller.go @@ -528,10 +528,11 @@ func (bc *bitrateController) fitBitratesToBandwidth(bw uint32) { for _, claim := range claims { if claim.IsAdjustable() && claim.Quality() == QualityLevel(i) { - claim.track.RequestPLI() + glog.Info("bitratecontroller: reduce bitrate for track ", claim.track.ID(), " from ", claim.Quality(), " to ", claim.Quality()-1) bc.setQuality(claim.track.ID(), claim.Quality()-1) + claim.track.RequestPLI() totalSentBitrates = bc.totalSentBitrates() // check if the reduced bitrate is fit to the available bandwidth @@ -557,11 +558,11 @@ func (bc *bitrateController) fitBitratesToBandwidth(bw uint32) { return } - claim.track.RequestPLI() glog.Info("bitratecontroller: increase bitrate for track ", claim.track.ID(), " from ", claim.Quality(), " to ", claim.Quality()+1) bc.setQuality(claim.track.ID(), claim.Quality()+1) // update current total bitrates totalSentBitrates = bc.totalSentBitrates() + claim.track.RequestPLI() } } } diff --git a/clientracklist.go b/clientracklist.go index f1cfe5c..f55484f 100644 --- a/clientracklist.go +++ b/clientracklist.go @@ -11,8 +11,8 @@ type clientTrackList struct { } func (l *clientTrackList) Add(track iClientTrack) { - l.mu.RLock() - defer l.mu.RUnlock() + l.mu.Lock() + defer l.mu.Unlock() go func() { ctx, cancel := context.WithCancel(track.Context()) diff --git a/clienttracksvc.go b/clienttracksvc.go index aec0bad..be01de0 100644 --- a/clienttracksvc.go +++ b/clienttracksvc.go @@ -96,7 +96,6 @@ type scaleableClientTrack struct { lastTimestamp uint32 isScreen bool isEnded bool - keyframe bool onTrackEndedCallbacks []func() dropCounter uint16 qualityPreset QualityPreset @@ -192,14 +191,8 @@ func (t *scaleableClientTrack) push(p *rtp.Packet, _ QualityLevel) { isKeyframe := t.isKeyframe(vp9Packet) if isKeyframe { - t.keyframe = true glog.Info("scalabletrack: keyframe ", p.SequenceNumber, " is detected") } - defer func() { - if t.keyframe && vp9Packet.E { - t.keyframe = false - } - }() // late packer handler if t.sequenceNumber > p.SequenceNumber && t.sequenceNumber-p.SequenceNumber < 1000 { @@ -226,7 +219,7 @@ func (t *scaleableClientTrack) push(p *rtp.Packet, _ QualityLevel) { // targeting a higher spatial layer to know that it can safely // discard this packet's frame without processing it, without having // to wait for the "D" bit in the higher-layer frame - if !t.keyframe && (cachedPacket.tid < vp9Packet.TID || cachedPacket.sid < vp9Packet.SID) { + if cachedPacket.tid < vp9Packet.TID || cachedPacket.sid < vp9Packet.SID { t.dropCounter++ glog.Info("scalabletrack: late packet ", p.SequenceNumber, " is dropped", " cachedPacket.tid ", cachedPacket.tid, " < vp9Packet.TID ", vp9Packet.TID, " cachedPacket.sid ", cachedPacket.sid, " < vp9Packet.SID ", vp9Packet.SID) return @@ -285,7 +278,20 @@ func (t *scaleableClientTrack) push(p *rtp.Packet, _ QualityLevel) { t.SetLastQuality(quality) } - if !t.keyframe && (t.tid < vp9Packet.TID || t.sid < vp9Packet.SID) { + // base layer + if vp9Packet.TID == 0 && vp9Packet.SID == 0 { + t.send(p, isLate, t.tid, t.sid) + return + } + + if t.sid > vp9Packet.SID && vp9Packet.Z { + glog.Info("scalabletrack: packet ", p.SequenceNumber, " is dropped because of spatial layer Z bit") + + t.dropCounter++ + return + } + + if t.tid < vp9Packet.TID || t.sid < vp9Packet.SID { t.dropCounter++ return