Squelching DD reader error. (#2215)

Squelching Structure is nil error as it can happen on packets
received before a key frame is received.
This commit is contained in:
Raja Subramanian
2023-11-02 11:10:28 +05:30
committed by GitHub
parent a6ede46adc
commit 0bdfdb0c49
2 changed files with 23 additions and 12 deletions
+2 -3
View File
@@ -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
@@ -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 {