From e9efed4d18be96fc84202ac6eda292e7f5203fd5 Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Thu, 4 Sep 2025 10:34:47 -0400 Subject: [PATCH] Fix trailing space in rtcp-fb with no Parameter Media construction would always do "%s %s" even if no Parameter was available. This commit fixes that by checking if Parameter is empty or not. Resolves #3207 --- sdp.go | 8 ++++++-- sdp_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/sdp.go b/sdp.go index 6c0b7668..5cb87f9d 100644 --- a/sdp.go +++ b/sdp.go @@ -541,7 +541,7 @@ func addSenderSDP( } } -//nolint:cyclop +//nolint:cyclop, gocognit func addTransceiverSDP( descr *sdp.SessionDescription, isPlanB bool, @@ -575,7 +575,11 @@ func addTransceiverSDP( media.WithCodec(uint8(codec.PayloadType), name, codec.ClockRate, codec.Channels, codec.SDPFmtpLine) for _, feedback := range codec.RTPCodecCapability.RTCPFeedback { - media.WithValueAttribute("rtcp-fb", fmt.Sprintf("%d %s %s", codec.PayloadType, feedback.Type, feedback.Parameter)) + if feedback.Parameter == "" { + media.WithValueAttribute("rtcp-fb", fmt.Sprintf("%d %s", codec.PayloadType, feedback.Type)) + } else { + media.WithValueAttribute("rtcp-fb", fmt.Sprintf("%d %s %s", codec.PayloadType, feedback.Type, feedback.Parameter)) + } } } if len(codecs) == 0 { diff --git a/sdp_test.go b/sdp_test.go index a3676d22..433579bf 100644 --- a/sdp_test.go +++ b/sdp_test.go @@ -1057,6 +1057,42 @@ func TestPopulateSDP(t *testing.T) { //nolint:cyclop,maintidx _, ok := offerSdp.Attribute(sdp.AttrKeyGroup) assert.False(t, ok) }) + t.Run("rtcp-fb trailing space", func(t *testing.T) { + se := SettingEngine{} + + me := &MediaEngine{} + assert.NoError(t, me.RegisterDefaultCodecs()) + api := NewAPI(WithMediaEngine(me)) + + tr := &RTPTransceiver{kind: RTPCodecTypeVideo, api: api, codecs: me.videoCodecs} + mediaSections := []mediaSection{{id: "0", transceivers: []*RTPTransceiver{tr}}} + + d := &sdp.SessionDescription{} + + offerSdp, err := populateSDP( + d, + false, + []DTLSFingerprint{}, + se.sdpMediaLevelFingerprints, + se.candidates.ICELite, + true, + me, + connectionRoleFromDtlsRole(defaultDtlsRoleOffer), + []ICECandidate{}, + ICEParameters{}, + mediaSections, + ICEGatheringStateComplete, + nil, + se.getSCTPMaxMessageSize(), + ) + assert.Nil(t, err) + + for _, desc := range offerSdp.MediaDescriptions { + for _, a := range desc.Attributes { + assert.False(t, strings.HasSuffix(a.String(), " ")) + } + } + }) } func TestGetRIDs(t *testing.T) {