Do not send both asb-send-time and twcc. (#3890)

* Do not send both asb-send-time and twcc.

In single peer connection mode, both extensions are set on the media
engine and both would be negotiated. Unfortunately, pion/webrtc does
not yet support RTPSender.SetParameters() which would allow setting
specific header extensions for the sender. So, check for TWCC enabled
and use it. If not, do abs-send-time if that is enabled.

* check BWE type

* comment
This commit is contained in:
Raja Subramanian
2025-08-30 19:22:14 +05:30
committed by GitHub
parent 21b42fa6d9
commit f7291fdaa8
7 changed files with 51 additions and 4 deletions
-1
View File
@@ -286,7 +286,6 @@ func filterCodecs(
for _, enabledCodec := range enabledCodecs {
if mime.NormalizeMimeType(enabledCodec.Mime) == mime.NormalizeMimeType(c.RTPCodecCapability.MimeType) {
// SINGLE-PEER-CONNECTION-TOOD: remove `nack` for RED?
if mime.IsMimeTypeStringVideo(c.RTPCodecCapability.MimeType) {
c.RTPCodecCapability.RTCPFeedback = rtcpFeedbackConfig.Video
} else {
+2 -1
View File
@@ -424,7 +424,8 @@ func newPeerConnection(params TransportParams, onBandwidthEstimator func(estimat
}
}
}
} else {
}
if !params.IsOfferer {
// sfu only use interceptor to send XR but don't read response from it (use buffer instead),
// so use a empty callback here
ir.Add(lkinterceptor.NewRTTFromXRFactory(func(rtt uint32) {}))
+25
View File
@@ -31,6 +31,29 @@ const (
// ------------------------------------------------
type BWEType int
const (
BWETypeNone BWEType = iota
BWETypeRemote
BWETypeSendSide
)
func (b BWEType) String() string {
switch b {
case BWETypeNone:
return "NONE"
case BWETypeRemote:
return "REMOTE"
case BWETypeSendSide:
return "SEND_SIDE"
default:
return fmt.Sprintf("%d", int(b))
}
}
// ------------------------------------------------
type CongestionState int
const (
@@ -55,6 +78,8 @@ func (c CongestionState) String() string {
// ------------------------------------------------
type BWE interface {
Type() BWEType
SetBWEListener(bweListner BWEListener)
Reset()
+6
View File
@@ -24,6 +24,8 @@ import (
"github.com/livekit/protocol/utils/mono"
)
var _ bwe.BWE = (*RemoteBWE)(nil)
// ---------------------------------------------------------------------------
type RemoteBWEConfig struct {
@@ -81,6 +83,10 @@ func NewRemoteBWE(params RemoteBWEParams) *RemoteBWE {
return r
}
func (r *RemoteBWE) Type() bwe.BWEType {
return bwe.BWETypeRemote
}
func (r *RemoteBWE) SetBWEListener(bweListener bwe.BWEListener) {
r.lock.Lock()
defer r.lock.Unlock()
+6
View File
@@ -23,6 +23,8 @@ import (
"github.com/pion/rtcp"
)
var _ bwe.BWE = (*SendSideBWE)(nil)
//
// Based on a simplified/modified version of JitterPath paper
// (https://homepage.iis.sinica.edu.tw/papers/lcs/2114-F.pdf)
@@ -88,6 +90,10 @@ func NewSendSideBWE(params SendSideBWEParams) *SendSideBWE {
}
}
func (r *SendSideBWE) Type() bwe.BWEType {
return bwe.BWETypeSendSide
}
func (s *SendSideBWE) SetBWEListener(bweListener bwe.BWEListener) {
s.congestionDetector.SetBWEListener(bweListener)
}
+8 -2
View File
@@ -38,6 +38,7 @@ import (
"github.com/livekit/protocol/utils/mono"
"github.com/livekit/livekit-server/pkg/sfu/buffer"
"github.com/livekit/livekit-server/pkg/sfu/bwe"
"github.com/livekit/livekit-server/pkg/sfu/ccutils"
"github.com/livekit/livekit-server/pkg/sfu/connectionquality"
"github.com/livekit/livekit-server/pkg/sfu/mime"
@@ -192,6 +193,9 @@ type DownTrackStreamAllocatorListener interface {
// check if track should participate in BWE
IsBWEEnabled(dt *DownTrack) bool
// get the BWE type in use
BWEType() bwe.BWEType
// check if subscription mute can be applied
IsSubscribeMutable(dt *DownTrack) bool
}
@@ -793,13 +797,15 @@ func (d *DownTrack) SetReceiver(r TrackReceiver) {
// Sets RTP header extensions for this track
func (d *DownTrack) SetRTPHeaderExtensions(rtpHeaderExtensions []webrtc.RTPHeaderExtensionParameter) {
isBWEEnabled := true
bweType := bwe.BWETypeNone
if sal := d.getStreamAllocatorListener(); sal != nil {
isBWEEnabled = sal.IsBWEEnabled(d)
bweType = sal.BWEType()
}
for _, ext := range rtpHeaderExtensions {
switch ext.URI {
case sdp.ABSSendTimeURI:
if isBWEEnabled {
if isBWEEnabled && bweType == bwe.BWETypeRemote {
d.absSendTimeExtID = ext.ID
} else {
d.absSendTimeExtID = 0
@@ -809,7 +815,7 @@ func (d *DownTrack) SetRTPHeaderExtensions(rtpHeaderExtensions []webrtc.RTPHeade
case pd.PlayoutDelayURI:
d.playoutDelayExtID = ext.ID
case sdp.TransportCCURI:
if isBWEEnabled {
if isBWEEnabled && bweType == bwe.BWETypeSendSide {
d.transportWideExtID = ext.ID
} else {
d.transportWideExtID = 0
@@ -557,6 +557,10 @@ func (s *StreamAllocator) IsBWEEnabled(downTrack *sfu.DownTrack) bool {
return true
}
func (s *StreamAllocator) BWEType() bwe.BWEType {
return s.params.BWE.Type()
}
// called to check if track subscription mute can be applied
func (s *StreamAllocator) IsSubscribeMutable(downTrack *sfu.DownTrack) bool {
s.videoTracksMu.Lock()