Skip to content

Commit

Permalink
fix VP9 svc can't render multiple videos
Browse files Browse the repository at this point in the history
  • Loading branch information
Yohan Totting committed Mar 1, 2024
1 parent b1f8478 commit 3960a07
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
5 changes: 3 additions & 2 deletions bitratecontroller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions clientracklist.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
24 changes: 15 additions & 9 deletions clienttracksvc.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ type scaleableClientTrack struct {
lastTimestamp uint32
isScreen bool
isEnded bool
keyframe bool
onTrackEndedCallbacks []func()
dropCounter uint16
qualityPreset QualityPreset
Expand Down Expand Up @@ -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 {
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3960a07

Please sign in to comment.