From 4eff63bde7f3fbf1f77e3560a499385e401a721e Mon Sep 17 00:00:00 2001 From: Jason Walton Date: Tue, 28 May 2024 09:54:35 -0400 Subject: [PATCH] webrtc: allow configuring timeouts (#3404) --- apidocs/openapi.yaml | 4 ++++ internal/conf/conf.go | 4 ++++ internal/core/core.go | 2 ++ internal/protocols/webrtc/peer_connection.go | 11 ++++++----- internal/protocols/webrtc/whip_client.go | 5 +++++ internal/servers/webrtc/server.go | 2 ++ internal/servers/webrtc/session.go | 4 ++++ 7 files changed, 27 insertions(+), 5 deletions(-) diff --git a/apidocs/openapi.yaml b/apidocs/openapi.yaml index d4f6e9f0b601..93802e49ca6d 100644 --- a/apidocs/openapi.yaml +++ b/apidocs/openapi.yaml @@ -246,6 +246,10 @@ components: type: string clientOnly: type: boolean + webrtcHandshakeTimeout: + type: string + webrtcTrackGatherTimeout: + type: string # SRT server srt: diff --git a/internal/conf/conf.go b/internal/conf/conf.go index de97c2020b8f..e70da0dcb93e 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -238,6 +238,8 @@ type Conf struct { WebRTCIPsFromInterfacesList []string `json:"webrtcIPsFromInterfacesList"` WebRTCAdditionalHosts []string `json:"webrtcAdditionalHosts"` WebRTCICEServers2 WebRTCICEServers `json:"webrtcICEServers2"` + WebRTCHandshakeTimeout StringDuration `json:"webrtcHandshakeTimeout"` + WebRTCTrackGatherTimeout StringDuration `json:"webrtcTrackGatherTimeout"` WebRTCICEUDPMuxAddress *string `json:"webrtcICEUDPMuxAddress,omitempty"` // deprecated WebRTCICETCPMuxAddress *string `json:"webrtcICETCPMuxAddress,omitempty"` // deprecated WebRTCICEHostNAT1To1IPs *[]string `json:"webrtcICEHostNAT1To1IPs,omitempty"` // deprecated @@ -392,6 +394,8 @@ func (conf *Conf) setDefaults() { conf.WebRTCIPsFromInterfacesList = []string{} conf.WebRTCAdditionalHosts = []string{} conf.WebRTCICEServers2 = []WebRTCICEServer{} + conf.WebRTCHandshakeTimeout = 10 * StringDuration(time.Second) + conf.WebRTCTrackGatherTimeout = 2 * StringDuration(time.Second) // SRT server conf.SRT = true diff --git a/internal/core/core.go b/internal/core/core.go index 9f5f61353b61..1af8ec55cd93 100644 --- a/internal/core/core.go +++ b/internal/core/core.go @@ -580,6 +580,8 @@ func (p *Core) createResources(initial bool) error { IPsFromInterfacesList: p.conf.WebRTCIPsFromInterfacesList, AdditionalHosts: p.conf.WebRTCAdditionalHosts, ICEServers: p.conf.WebRTCICEServers2, + HandshakeTimeout: p.conf.WebRTCHandshakeTimeout, + TrackGatherTimeout: p.conf.WebRTCTrackGatherTimeout, ExternalCmdPool: p.externalCmdPool, PathManager: p.pathManager, Parent: p, diff --git a/internal/protocols/webrtc/peer_connection.go b/internal/protocols/webrtc/peer_connection.go index ca8b31656017..bb984fd77a27 100644 --- a/internal/protocols/webrtc/peer_connection.go +++ b/internal/protocols/webrtc/peer_connection.go @@ -11,13 +11,12 @@ import ( "github.com/pion/interceptor" "github.com/pion/webrtc/v3" + "github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/logger" ) const ( - webrtcHandshakeTimeout = 10 * time.Second - webrtcTrackGatherTimeout = 2 * time.Second - webrtcStreamID = "mediamtx" + webrtcStreamID = "mediamtx" ) func stringInSlice(a string, list []string) bool { @@ -39,6 +38,8 @@ type PeerConnection struct { ICEServers []webrtc.ICEServer ICEUDPMux ice.UDPMux ICETCPMux ice.TCPMux + HandshakeTimeout conf.StringDuration + TrackGatherTimeout conf.StringDuration LocalRandomUDP bool IPsFromInterfaces bool IPsFromInterfacesList []string @@ -312,7 +313,7 @@ func (co *PeerConnection) WaitGatheringDone(ctx context.Context) error { func (co *PeerConnection) WaitUntilConnected( ctx context.Context, ) error { - t := time.NewTimer(webrtcHandshakeTimeout) + t := time.NewTimer(time.Duration(co.HandshakeTimeout)) defer t.Stop() outer: @@ -339,7 +340,7 @@ func (co *PeerConnection) GatherIncomingTracks( ) ([]*IncomingTrack, error) { var tracks []*IncomingTrack - t := time.NewTimer(webrtcTrackGatherTimeout) + t := time.NewTimer(time.Duration(co.TrackGatherTimeout)) defer t.Stop() for { diff --git a/internal/protocols/webrtc/whip_client.go b/internal/protocols/webrtc/whip_client.go index 40511200c776..e20c4d6dbdeb 100644 --- a/internal/protocols/webrtc/whip_client.go +++ b/internal/protocols/webrtc/whip_client.go @@ -17,6 +17,11 @@ import ( "github.com/bluenviron/mediamtx/internal/protocols/httpp" ) +const ( + webrtcHandshakeTimeout = 10 * time.Second + webrtcTrackGatherTimeout = 2 * time.Second +) + // WHIPClient is a WHIP client. type WHIPClient struct { HTTPClient *http.Client diff --git a/internal/servers/webrtc/server.go b/internal/servers/webrtc/server.go index ba855eb64c2c..a53920322a51 100644 --- a/internal/servers/webrtc/server.go +++ b/internal/servers/webrtc/server.go @@ -192,6 +192,8 @@ type Server struct { IPsFromInterfacesList []string AdditionalHosts []string ICEServers []conf.WebRTCICEServer + HandshakeTimeout conf.StringDuration + TrackGatherTimeout conf.StringDuration ExternalCmdPool *externalcmd.Pool PathManager serverPathManager Parent serverParent diff --git a/internal/servers/webrtc/session.go b/internal/servers/webrtc/session.go index cb98580da150..cd3fa2c79479 100644 --- a/internal/servers/webrtc/session.go +++ b/internal/servers/webrtc/session.go @@ -414,6 +414,8 @@ func (s *session) runPublish() (int, error) { AdditionalHosts: s.additionalHosts, ICEUDPMux: s.iceUDPMux, ICETCPMux: s.iceTCPMux, + HandshakeTimeout: s.parent.HandshakeTimeout, + TrackGatherTimeout: s.parent.TrackGatherTimeout, Publish: false, Log: s, } @@ -571,6 +573,8 @@ func (s *session) runRead() (int, error) { AdditionalHosts: s.additionalHosts, ICEUDPMux: s.iceUDPMux, ICETCPMux: s.iceTCPMux, + HandshakeTimeout: s.parent.HandshakeTimeout, + TrackGatherTimeout: s.parent.TrackGatherTimeout, Publish: true, OutgoingTracks: outgoingTracks, Log: s,