diff --git a/.changeset/sdp-codec-helpers.md b/.changeset/sdp-codec-helpers.md new file mode 100644 index 000000000..3c3ce0f77 --- /dev/null +++ b/.changeset/sdp-codec-helpers.md @@ -0,0 +1,6 @@ +--- +"@livekit/protocol": patch +"github.com/livekit/protocol": patch +--- + +sdp: add CodecsFromSessionDescription and ParseFmtp helpers diff --git a/sdp/sdp.go b/sdp/sdp.go index 6697d5273..dfcad2b1b 100644 --- a/sdp/sdp.go +++ b/sdp/sdp.go @@ -226,6 +226,33 @@ func CodecsFromMediaDescription(m *sdp.MediaDescription) (out []sdp.Codec, err e return out, nil } +func CodecsFromSessionDescription(parsed *sdp.SessionDescription, mediaType string) ([]sdp.Codec, error) { + var out []sdp.Codec + for _, m := range parsed.MediaDescriptions { + if m.MediaName.Media != mediaType { + continue + } + codecs, err := CodecsFromMediaDescription(m) + if err != nil { + return nil, err + } + out = append(out, codecs...) + } + return out, nil +} + +// Keys are lowercased (RFC 6838 ยง4.3). Params without a value, like "0-16", map to "". +func ParseFmtp(fmtp string) map[string]string { + params := make(map[string]string) + for _, param := range strings.Split(fmtp, ";") { + key, value, _ := strings.Cut(param, "=") + if key = strings.ToLower(strings.TrimSpace(key)); key != "" { + params[key] = strings.TrimSpace(value) + } + } + return params +} + func GetBundleMid(parsed *sdp.SessionDescription) (string, bool) { if groupAttribute, found := parsed.Attribute(sdp.AttrKeyGroup); found { bundleIDs := strings.Split(groupAttribute, " ")