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 }