Skip to content

Commit

Permalink
feat: generate AV1 SDP in Jicofo (#994)
Browse files Browse the repository at this point in the history
* feat: generate AV1 SDP in Jicofo
  • Loading branch information
paweldomas authored Jan 25, 2023
1 parent 56c3334 commit 1407a31
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ private class RtpExtensionConfigWithLegacy(
}

class Config {
@JvmField
val av1: RtxCodecConfig = RtxCodecConfigWithLegacy(LEGACY_BASE, "jicofo.codec.video.av1", "AV1")
@JvmField
val vp8: RtxCodecConfig = RtxCodecConfigWithLegacy(LEGACY_BASE, "jicofo.codec.video.vp8", "VP8")
@JvmField
Expand All @@ -133,6 +135,9 @@ class Config {
@JvmField
val audioLevel = RtpExtensionConfig("jicofo.codec.rtp-extensions.audio-level")
@JvmField
val av1DependencyDescriptor: RtpExtensionConfig =
RtpExtensionConfig("jicofo.codec.rtp-extensions.av1-dependency-descriptor")
@JvmField
val tof: RtpExtensionConfig =
RtpExtensionConfigWithLegacy("$LEGACY_BASE.ENABLE_TOF", "jicofo.codec.rtp-extensions.tof")
@JvmField
Expand Down
35 changes: 35 additions & 0 deletions jicofo-common/src/main/kotlin/org/jitsi/jicofo/codec/CodecUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ class CodecUtil {
fun createVideoPayloadTypeExtensions(
options: OfferOptions = OfferOptions()
): Collection<PayloadTypePacketExtension> = buildList {
if (config.av1.enabled()) {
// a:rtpmap:XXX AV1/90000
val av1 = createPayloadTypeExtension(config.av1.pt(), "AV1", 90000)
av1.addVideoExtensions(options, config.av1)
add(av1)
}

if (config.vp8.enabled()) {
// a=rtpmap:XXX VP8/90000
val vp8 = createPayloadTypeExtension(config.vp8.pt(), "VP8", 90000)
Expand All @@ -56,6 +63,24 @@ class CodecUtil {
}

if (options.rtx) {
if (config.av1.rtxEnabled()) {
// a=rtpmap:XXX rtx/90000
val rtx = createPayloadTypeExtension(config.av1.rtxPt(), "rtx", 90000)

// a=fmtp:XXX apt=YYY (XXX = av1.rtxPt(), YYY = config.av1.pt())
rtx.addParameterExtension("apt", config.av1.pt().toString())

// a=rtcp-fb:XXX ccm fir
rtx.addRtcpFeedbackType(createRtcpFbPacketExtension("ccm", "fir"))

// a=rtcp-fb:XXX nack
rtx.addRtcpFeedbackType(createRtcpFbPacketExtension("nack", null))

// a=rtcp-fb:XXX nack pli
rtx.addRtcpFeedbackType(createRtcpFbPacketExtension("nack", "pli"))

add(rtx)
}
if (config.vp8.rtxEnabled()) {
// a=rtpmap:96 rtx/90000
val rtx = createPayloadTypeExtension(config.vp8.rtxPt(), "rtx", 90000)
Expand Down Expand Up @@ -189,6 +214,16 @@ class CodecUtil {
fun createVideoRtpHdrExtExtensions(
options: OfferOptions = OfferOptions()
): Collection<RTPHdrExtPacketExtension> = buildList {
if (config.av1.enabled() && config.av1DependencyDescriptor.enabled()) {
// https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension
val dependencyDescriptorExt = RTPHdrExtPacketExtension()
dependencyDescriptorExt.id = config.av1DependencyDescriptor.id().toString()
dependencyDescriptorExt.uri = URI.create(
"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension"
)
add(dependencyDescriptorExt)
}

if (config.tof.enabled()) {
// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
val toOffset = RTPHdrExtPacketExtension()
Expand Down
11 changes: 11 additions & 0 deletions jicofo-selector/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ jicofo {
// Configure the codecs and RTP extensions to be used in the offer sent to clients.
codec {
video {
av1 {
enabled = false
pt = 41
// Payload type for the associated RTX stream. Set to -1 to disable RTX.
rtx-pt = 42
enable-remb = true
}
vp8 {
enabled = true
pt = 100
Expand Down Expand Up @@ -144,6 +151,10 @@ jicofo {
enabled = true
id = 1
}
av1-dependency-descriptor {
enabled = true
id = 11
}
tof {
// TOF is currently disabled, because we don't support it in the bridge
// (and currently clients seem to not use it when abs-send-time is
Expand Down
11 changes: 11 additions & 0 deletions jicofo/src/test/kotlin/org/jitsi/jicofo/CodecConfigTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import org.jitsi.jicofo.codec.Config.Companion.config
class CodecConfigTest : ShouldSpec() {
init {
context("Default configuration") {
config.av1.enabled() shouldBe false

config.vp8.enabled() shouldBe true
config.vp8.pt() shouldBe 100
config.vp8.rtxEnabled() shouldBe true
Expand Down Expand Up @@ -76,6 +78,9 @@ class CodecConfigTest : ShouldSpec() {

config.mid.enabled shouldBe false
config.mid.id shouldBe 10

config.av1DependencyDescriptor.enabled shouldBe true
config.av1DependencyDescriptor.id shouldBe 11
}
context("Legacy config") {
context("Disabling a codec") {
Expand Down Expand Up @@ -238,6 +243,12 @@ class CodecConfigTest : ShouldSpec() {
withNewConfig("jicofo.codec.rtp-extensions.mid.enabled=true") {
config.mid.enabled shouldBe true
}
withNewConfig("jicofo.codec.rtp-extensions.av1-dependency-descriptor.enabled=true") {
config.av1DependencyDescriptor.enabled shouldBe true
}
withNewConfig("jicofo.codec.rtp-extensions.av1-dependency-descriptor.enabled=false") {
config.av1DependencyDescriptor.enabled shouldBe false
}
}
context("Changing extension IDs") {
withNewConfig("jicofo.codec.rtp-extensions.tcc.id=1") {
Expand Down

0 comments on commit 1407a31

Please sign in to comment.