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) {