diff --git a/service/rtc/call.go b/service/rtc/call.go index 59c7d40..94223fc 100644 --- a/service/rtc/call.go +++ b/service/rtc/call.go @@ -52,6 +52,7 @@ func (c *call) addSession(cfg SessionConfig, rtcConn *webrtc.PeerConnection, clo screenRateMonitors: make(map[string]*RateMonitor), log: log, call: c, + rxTracks: make(map[string]webrtc.TrackLocal), } c.sessions[cfg.SessionID] = s @@ -128,15 +129,6 @@ func (c *call) handleSessionClose(us *session) { defer us.mut.Unlock() cleanUp := func(sessionID string, sender *webrtc.RTPSender, track webrtc.TrackLocal) { - if isValidTrackID(track.ID()) { - c.metrics.DecRTPTracks(us.cfg.GroupID, "out", getTrackType(track.Kind())) - } else { - us.log.Warn("invalid track ID", - mlog.String("sessionID", sessionID), - mlog.String("trackID", track.ID()), - mlog.Any("trackKind", track.Kind())) - } - if err := sender.ReplaceTrack(nil); err != nil { us.log.Error("failed to replace track on sender", mlog.String("sessionID", sessionID), @@ -175,6 +167,9 @@ func (c *call) handleSessionClose(us *session) { cleanUp(us.cfg.SessionID, sender, track) } } + for _, track := range us.rxTracks { + c.metrics.DecRTPTracks(us.cfg.GroupID, "out", getTrackType(track.Kind())) + } // We check whether the closing session was also sending any track // (e.g. voice, screen). diff --git a/service/rtc/session.go b/service/rtc/session.go index 3079cd0..fb63511 100644 --- a/service/rtc/session.go +++ b/service/rtc/session.go @@ -58,6 +58,7 @@ type session struct { // Receiver bwEstimator cc.BandwidthEstimator screenTrackSender *webrtc.RTPSender + rxTracks map[string]webrtc.TrackLocal closeCh chan struct{} closeCb func() error @@ -426,6 +427,7 @@ func (s *session) addTrack(sdpOutCh chan<- Message, track webrtc.TrackLocal) (er mlog.String("trackID", track.ID())) } else { s.call.metrics.DecRTPTracks(s.cfg.GroupID, "out", getTrackType(track.Kind())) + delete(s.rxTracks, track.ID()) } s.mut.Unlock() }() @@ -444,11 +446,13 @@ func (s *session) addTrack(sdpOutCh chan<- Message, track webrtc.TrackLocal) (er if err := s.rtcConn.SetRemoteDescription(answer); err != nil { return fmt.Errorf("failed to set remote description for track %s: %w", track.ID(), err) } + + s.mut.Lock() if track.Kind() == webrtc.RTPCodecTypeVideo { - s.mut.Lock() s.screenTrackSender = sender - s.mut.Unlock() } + s.rxTracks[track.ID()] = track + s.mut.Unlock() case <-time.After(signalingTimeout): return fmt.Errorf("timed out signaling") case <-s.closeCh: @@ -488,7 +492,7 @@ func (s *session) removeTrack(sdpOutCh chan<- Message, track webrtc.TrackLocal) return fmt.Errorf("failed to remove track: %w", err) } s.call.metrics.DecRTPTracks(s.cfg.GroupID, "out", getTrackType(track.Kind())) - + delete(s.rxTracks, track.ID()) if s.screenTrackSender == sender { s.screenTrackSender = nil } @@ -576,7 +580,6 @@ func (s *session) InitVAD(log mlog.LoggerIFace, msgCh chan<- Message) error { log.Error("failed to send VAD message: channel is full") } }) - if err != nil { return fmt.Errorf("failed to create vad monitor: %w", err) }