Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix AV1 and VP9 codec matching #2772

Merged
merged 2 commits into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions internal/fmtp/av1.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT

package fmtp

type av1FMTP struct {
parameters map[string]string
}

func (h *av1FMTP) MimeType() string {
return "video/av1"
}

func (h *av1FMTP) Match(b FMTP) bool {
c, ok := b.(*av1FMTP)
if !ok {
return false
}

// AV1 RTP specification:
aler9 marked this conversation as resolved.
Show resolved Hide resolved
// If the profile parameter is not present, it MUST be inferred to be 0 (“Main” profile).
hProfile, ok := h.parameters["profile"]
if !ok {
hProfile = "0"
}
cProfile, ok := c.parameters["profile"]
if !ok {
cProfile = "0"
}
if hProfile != cProfile {
return false
}

return true
}

func (h *av1FMTP) Parameter(key string) (string, bool) {
v, ok := h.parameters[key]
return v, ok

Check warning on line 39 in internal/fmtp/av1.go

View check run for this annotation

Codecov / codecov/patch

internal/fmtp/av1.go#L37-L39

Added lines #L37 - L39 were not covered by tests
}
45 changes: 31 additions & 14 deletions internal/fmtp/fmtp.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,22 @@ import (
"strings"
)

func parseParameters(line string) map[string]string {
parameters := make(map[string]string)

for _, p := range strings.Split(line, ";") {
pp := strings.SplitN(strings.TrimSpace(p), "=", 2)
key := strings.ToLower(pp[0])
var value string
if len(pp) > 1 {
value = pp[1]
}
parameters[key] = value
}

return parameters
}

// FMTP interface for implementing custom
// FMTP parsers based on MimeType
type FMTP interface {
Expand All @@ -23,29 +39,30 @@ type FMTP interface {
}

// Parse parses an fmtp string based on the MimeType
func Parse(mimetype, line string) FMTP {
func Parse(mimeType, line string) FMTP {
var f FMTP

parameters := make(map[string]string)

for _, p := range strings.Split(line, ";") {
pp := strings.SplitN(strings.TrimSpace(p), "=", 2)
key := strings.ToLower(pp[0])
var value string
if len(pp) > 1 {
value = pp[1]
}
parameters[key] = value
}
parameters := parseParameters(line)

switch {
case strings.EqualFold(mimetype, "video/h264"):
case strings.EqualFold(mimeType, "video/h264"):
f = &h264FMTP{
parameters: parameters,
}

case strings.EqualFold(mimeType, "video/vp9"):
f = &vp9FMTP{
parameters: parameters,
}

case strings.EqualFold(mimeType, "video/av1"):
f = &av1FMTP{
parameters: parameters,
}

default:
f = &genericFMTP{
mimeType: mimetype,
mimeType: mimeType,
parameters: parameters,
}
}
Expand Down
Loading
Loading