Support non-SVC AV1 track publishing (#2030)

This commit is contained in:
cnderrauber
2023-09-04 12:39:14 +08:00
committed by GitHub
parent d6ebc081d5
commit b85ff8f063
2 changed files with 29 additions and 14 deletions
+4 -1
View File
@@ -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)})
+25 -13
View File
@@ -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
}
}