diff --git a/pkg/sfu/buffer/buffer.go b/pkg/sfu/buffer/buffer.go index 3bb0a6715..471aea927 100644 --- a/pkg/sfu/buffer/buffer.go +++ b/pkg/sfu/buffer/buffer.go @@ -31,6 +31,7 @@ import ( "go.uber.org/atomic" "github.com/livekit/livekit-server/pkg/sfu/audio" + dd "github.com/livekit/livekit-server/pkg/sfu/dependencydescriptor" "github.com/livekit/livekit-server/pkg/sfu/utils" sutils "github.com/livekit/livekit-server/pkg/utils" "github.com/livekit/mediatransportutil" @@ -39,8 +40,6 @@ import ( "github.com/livekit/mediatransportutil/pkg/twcc" "github.com/livekit/protocol/livekit" "github.com/livekit/protocol/logger" - - dd "github.com/livekit/livekit-server/pkg/sfu/dependencydescriptor" ) const ( @@ -615,7 +614,7 @@ func (b *Buffer) getExtPacket(rtpPacket *rtp.Packet, arrivalTime time.Time, flow if b.ddParser != nil { ddVal, videoLayer, err := b.ddParser.Parse(ep.Packet) if err != nil { - if err != ErrFrameEarlierThanKeyFrame { + if !errors.Is(err, ErrFrameEarlierThanKeyFrame) && !errors.Is(err, dd.ErrDDReaderNoStructure) { b.logger.Warnw("could not parse dependency descriptor", err) } return nil diff --git a/pkg/sfu/dependencydescriptor/dependencydescriptorreader.go b/pkg/sfu/dependencydescriptor/dependencydescriptorreader.go index 04ae1ce7c..2ca21ff8f 100644 --- a/pkg/sfu/dependencydescriptor/dependencydescriptorreader.go +++ b/pkg/sfu/dependencydescriptor/dependencydescriptorreader.go @@ -18,6 +18,18 @@ import ( "errors" ) +var ( + ErrDDReaderNoStructure = errors.New("DependencyDescriptorReader: Structure is nil") + ErrDDReaderTemplateWithoutStructure = errors.New("DependencyDescriptorReader: has templateDependencyStructurePresentFlag but AttachedStructure is nil") + ErrDDReaderTooManyTemplates = errors.New("DependencyDescriptorReader: too many templates") + ErrDDReaderTooManyTemporalLayers = errors.New("DependencyDescriptorReader: too many temporal layers") + ErrDDReaderTooManySpatialLayers = errors.New("DependencyDescriptorReader: too many spatial layers") + ErrDDReaderInvalidTemplateIndex = errors.New("DependencyDescriptorReader: invalid template index") + ErrDDReaderInvalidSpatialLayer = errors.New("DependencyDescriptorReader: invalid spatial layer, should be less than the number of resolutions") + ErrDDReaderNumDTIMismatch = errors.New("DependencyDescriptorReader: decode target indications length mismatch with structure num decode targets") + ErrDDReaderNumChainDiffsMismatch = errors.New("DependencyDescriptorReader: chain diffs length mismatch with structure num chains") +) + type DependencyDescriptorReader struct { // Output. descriptor *DependencyDescriptor @@ -59,7 +71,7 @@ func (r *DependencyDescriptorReader) Parse() (int, error) { if r.structure == nil { r.buffer.Invalidate() - return 0, errors.New("DependencyDescriptorReader: Structure is nil") + return 0, ErrDDReaderNoStructure } if r.activeDecodeTargetsPresentFlag { @@ -140,7 +152,7 @@ func (r *DependencyDescriptorReader) readExtendedFields() error { return err } if r.descriptor.AttachedStructure == nil { - return errors.New("DependencyDescriptorReader: has templateDependencyStructurePresentFlag but AttachedStructure is nil") + return ErrDDReaderTemplateWithoutStructure } bitmask := uint32((uint64(1) << r.descriptor.AttachedStructure.NumDecodeTargets) - 1) r.descriptor.ActiveDecodeTargetsBitmask = &bitmask @@ -203,7 +215,7 @@ func (r *DependencyDescriptorReader) readTemplateLayers() error { ) for { if len(templates) == MaxTemplates { - return errors.New("DependencyDescriptorReader: too many templates") + return ErrDDReaderTooManyTemplates } var lastTemplate FrameDependencyTemplate @@ -220,13 +232,13 @@ func (r *DependencyDescriptorReader) readTemplateLayers() error { if nextLayerIdc == nextTemporalLayer { temporalId++ if temporalId >= MaxTemporalIds { - return errors.New("DependencyDescriptorReader: too many temporal layers") + return ErrDDReaderTooManyTemporalLayers } } else if nextLayerIdc == nextSpatialLayer { spatialId++ temporalId = 0 if spatialId >= MaxSpatialIds { - return errors.New("DependencyDescriptorReader: too many spatial layers") + return ErrDDReaderTooManySpatialLayers } } @@ -340,7 +352,7 @@ func (r *DependencyDescriptorReader) readFrameDependencyDefinition() error { if templateIndex >= len(r.structure.Templates) { r.buffer.Invalidate() - return errors.New("DependencyDescriptorReader: invalid template index") + return ErrDDReaderInvalidTemplateIndex } // Copy all the fields from the matching template @@ -374,7 +386,7 @@ func (r *DependencyDescriptorReader) readFrameDependencyDefinition() error { // then each spatial layer got one. if r.descriptor.FrameDependencies.SpatialId >= len(r.structure.Resolutions) { r.buffer.Invalidate() - return errors.New("DependencyDescriptorReader: invalid spatial layer, should be less than the number of resolutions") + return ErrDDReaderInvalidSpatialLayer } res := r.structure.Resolutions[r.descriptor.FrameDependencies.SpatialId] r.descriptor.Resolution = &res @@ -385,7 +397,7 @@ func (r *DependencyDescriptorReader) readFrameDependencyDefinition() error { func (r *DependencyDescriptorReader) readFrameDtis() error { if len(r.descriptor.FrameDependencies.DecodeTargetIndications) != r.structure.NumDecodeTargets { - return errors.New("DependencyDescriptorReader: decode target indications length mismatch with structure num decode targets") + return ErrDDReaderNumDTIMismatch } for i := range r.descriptor.FrameDependencies.DecodeTargetIndications { @@ -420,7 +432,7 @@ func (r *DependencyDescriptorReader) readFrameFdiffs() error { func (r *DependencyDescriptorReader) readFrameChains() error { if len(r.descriptor.FrameDependencies.ChainDiffs) != r.structure.NumChains { - return errors.New("DependencyDescriptorReader: chain diffs length mismatch with structure num chains") + return ErrDDReaderNumChainDiffsMismatch } for i := range r.descriptor.FrameDependencies.ChainDiffs {