@@ -24,6 +24,8 @@ import (
2424	"github.com/bep/debounce" 
2525	"github.com/pion/dtls/v3" 
2626	"github.com/pion/interceptor" 
27+ 	"github.com/pion/interceptor/pkg/cc" 
28+ 	"github.com/pion/interceptor/pkg/gcc" 
2729	"github.com/pion/interceptor/pkg/nack" 
2830	"github.com/pion/interceptor/pkg/twcc" 
2931	"github.com/pion/sdp/v3" 
@@ -65,6 +67,10 @@ type PCTransport struct {
6567	onRTTUpdate                 func (rtt  uint32 )
6668
6769	OnOffer  func (description  webrtc.SessionDescription )
70+ 
71+ 	// Bandwidth estimation 
72+ 	estimator      cc.BandwidthEstimator 
73+ 	estimatorChan  chan  cc.BandwidthEstimator 
6874}
6975
7076type  PCTransportParams  struct  {
@@ -127,6 +133,23 @@ func (t *PCTransport) registerDefaultInterceptors(params PCTransportParams, i *i
127133	}
128134	i .Add (lkinterceptor .NewRTTFromXRFactory (onXRRtt ))
129135
136+ 	// Add GCC congestion control (only for sender transports) 
137+ 	if  params .IsSender  {
138+ 		congestionController , err  :=  cc .NewInterceptor (func () (cc.BandwidthEstimator , error ) {
139+ 			return  gcc .NewSendSideBWE (gcc .SendSideBWEInitialBitrate (500_000 ))
140+ 		})
141+ 		if  err  !=  nil  {
142+ 			return  err 
143+ 		}
144+ 
145+ 		estimatorChan  :=  make (chan  cc.BandwidthEstimator , 1 )
146+ 		congestionController .OnNewPeerConnection (func (id  string , estimator  cc.BandwidthEstimator ) {
147+ 			estimatorChan  <-  estimator 
148+ 		})
149+ 		i .Add (congestionController )
150+ 		t .estimatorChan  =  estimatorChan 
151+ 	}
152+ 
130153	return  nil 
131154}
132155
@@ -184,6 +207,11 @@ func NewPCTransport(params PCTransportParams) (*PCTransport, error) {
184207	se .SetDTLSRetransmissionInterval (dtlsRetransmissionInterval )
185208	se .SetICETimeouts (iceDisconnectedTimeout , iceFailedTimeout , iceKeepaliveInterval )
186209
210+ 	// Configure TWCC header extension sender 
211+ 	if  err  :=  webrtc .ConfigureTWCCHeaderExtensionSender (m , i ); err  !=  nil  {
212+ 		return  nil , err 
213+ 	}
214+ 
187215	api  :=  webrtc .NewAPI (webrtc .WithMediaEngine (m ), webrtc .WithSettingEngine (se ), webrtc .WithInterceptorRegistry (i ))
188216	pc , err  :=  api .NewPeerConnection (params .Configuration )
189217	if  err  !=  nil  {
@@ -449,3 +477,21 @@ func (t *PCTransport) createAndSendOffer(options *webrtc.OfferOptions) error {
449477func  (t  * PCTransport ) SetConfiguration (config  webrtc.Configuration ) error  {
450478	return  t .pc .SetConfiguration (config )
451479}
480+ 
481+ // GetBandwidthEstimator returns the current bandwidth estimator 
482+ func  (t  * PCTransport ) GetBandwidthEstimator () cc.BandwidthEstimator  {
483+ 	// If we already have an estimator, return it 
484+ 	if  t .estimator  !=  nil  {
485+ 		return  t .estimator 
486+ 	}
487+ 
488+ 	// Otherwise, try to get it from the channel (non-blocking) 
489+ 	select  {
490+ 	case  estimator  :=  <- t .estimatorChan :
491+ 		t .estimator  =  estimator 
492+ 		return  estimator 
493+ 	default :
494+ 		// No estimator available yet 
495+ 		return  nil 
496+ 	}
497+ }
0 commit comments