From 490b9f4f4ca008e6d6241cec1cbf133b091b2080 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Thu, 26 Oct 2023 13:39:11 +0530 Subject: [PATCH] No sync when starting from nothing (#2191) When starting from scratch (like mute -> unmute), it is possible that the check sync does not detect a broken chain. That results in PLIs not being sent and the video frozen till a gratuitous key frame arrives. Unclear why there are not PLIs from client side. That is something else to dig into. --- pkg/sfu/buffer/dependencydescriptorparser.go | 6 ++++++ pkg/sfu/videolayerselector/dependencydescriptor.go | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/pkg/sfu/buffer/dependencydescriptorparser.go b/pkg/sfu/buffer/dependencydescriptorparser.go index a3a2be794..ca69bd763 100644 --- a/pkg/sfu/buffer/dependencydescriptorparser.go +++ b/pkg/sfu/buffer/dependencydescriptorparser.go @@ -142,6 +142,12 @@ type DependencyDescriptorDecodeTarget struct { Layer VideoLayer } +func (dt *DependencyDescriptorDecodeTarget) String() string { + return fmt.Sprintf("DecodeTarget{t: %d, l: %+v}", dt.Target, dt.Layer) +} + +// ------------------------------------------------------------------------------ + func ProcessFrameDependencyStructure(structure *dd.FrameDependencyStructure) []DependencyDescriptorDecodeTarget { decodeTargets := make([]DependencyDescriptorDecodeTarget, 0, structure.NumDecodeTargets) for target := 0; target < structure.NumDecodeTargets; target++ { diff --git a/pkg/sfu/videolayerselector/dependencydescriptor.go b/pkg/sfu/videolayerselector/dependencydescriptor.go index 86f42e1bf..72eb4c4a5 100644 --- a/pkg/sfu/videolayerselector/dependencydescriptor.go +++ b/pkg/sfu/videolayerselector/dependencydescriptor.go @@ -297,12 +297,19 @@ func (d *DependencyDescriptor) updateActiveDecodeTargets(activeDecodeTargetsBitm func (d *DependencyDescriptor) CheckSync() (locked bool, layer int32) { layer = d.GetRequestSpatial() + if !d.currentLayer.IsValid() { + // always declare not locked when trying to resume from nothing + return false, layer + } + d.decodeTargetsLock.RLock() defer d.decodeTargetsLock.RUnlock() for _, dt := range d.decodeTargets { if dt.Active() && dt.Layer.Spatial == layer && dt.Valid() { + d.logger.Debugw(fmt.Sprintf("checking sync, matching decode target, layer: %d, dt: %s, dts: %+v", layer, dt, d.decodeTargets)) return true, layer } } + return false, layer }