From b85ff8f063703c8fa6b6561d49a7dd179781a097 Mon Sep 17 00:00:00 2001 From: cnderrauber Date: Mon, 4 Sep 2023 12:39:14 +0800 Subject: [PATCH] Support non-SVC AV1 track publishing (#2030) --- pkg/sfu/downtrack.go | 5 ++++- pkg/sfu/forwarder.go | 38 +++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index 44414d7c8..f126847bc 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -677,7 +677,10 @@ func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error { return err } - extensions := []pacer.ExtensionData{{ID: uint8(d.dependencyDescriptorExtID), Payload: tp.ddBytes}} + var extensions []pacer.ExtensionData + if tp.ddBytes != nil { + extensions = []pacer.ExtensionData{{ID: uint8(d.dependencyDescriptorExtID), Payload: tp.ddBytes}} + } if d.playoutDelayExtID != 0 && !d.playoudDelayAcked.Load() { if val := d.playoutDelayBytes.Load(); val != nil { extensions = append(extensions, pacer.ExtensionData{ID: uint8(d.playoutDelayExtID), Payload: val.([]byte)}) diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 9421f238c..567465ce9 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -273,6 +273,15 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ } f.codec = codec + ddAvailable := func(exts []webrtc.RTPHeaderExtensionParameter) bool { + for _, ext := range exts { + if ext.URI == dd.ExtensionURI { + return true + } + } + return false + } + switch strings.ToLower(codec.MimeType) { case "video/vp8": f.codecMunger = codecmunger.NewVP8FromNull(f.codecMunger, f.logger) @@ -289,15 +298,8 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ f.vls = videolayerselector.NewSimulcast(f.logger) } case "video/vp9": - isDDAvailable := false - searchDone: - for _, ext := range extensions { - switch ext.URI { - case dd.ExtensionURI: - isDDAvailable = true - break searchDone - } - } + isDDAvailable := ddAvailable(extensions) + if isDDAvailable { if f.vls != nil { f.vls = videolayerselector.NewDependencyDescriptorFromNull(f.vls) @@ -314,12 +316,22 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ // SVC-TODO: Support for VP9 simulcast. When DD is not available, have to pick selector based on VP9 SVC or Simulcast case "video/av1": // DD-TODO : we only enable dd layer selector for av1/vp9 now, in the future we can enable it for vp8 too - if f.vls != nil { - f.vls = videolayerselector.NewDependencyDescriptorFromNull(f.vls) + + isDDAvailable := ddAvailable(extensions) + if isDDAvailable { + if f.vls != nil { + f.vls = videolayerselector.NewDependencyDescriptorFromNull(f.vls) + } else { + f.vls = videolayerselector.NewDependencyDescriptor(f.logger) + } } else { - f.vls = videolayerselector.NewDependencyDescriptor(f.logger) + if f.vls != nil { + f.vls = videolayerselector.NewSimulcastFromNull(f.vls) + } else { + f.vls = videolayerselector.NewSimulcast(f.logger) + } } - // SVC-TODO: Support for AV1 Simulcast or just single spatial layer - won't have DD in that case + // SVC-TODO: Support for AV1 Simulcast } }