mirror of
https://github.com/livekit/livekit.git
synced 2026-08-28 13:54:34 +00:00
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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user