diff --git a/internal/core/webrtc_incoming_track.go b/internal/core/webrtc_incoming_track.go index 4f4187f2..3e4cd8f1 100644 --- a/internal/core/webrtc_incoming_track.go +++ b/internal/core/webrtc_incoming_track.go @@ -7,11 +7,14 @@ import ( "github.com/bluenviron/gortsplib/v4/pkg/description" "github.com/bluenviron/gortsplib/v4/pkg/format" + "github.com/bluenviron/gortsplib/v4/pkg/liberrors" + "github.com/bluenviron/gortsplib/v4/pkg/rtplossdetector" "github.com/bluenviron/gortsplib/v4/pkg/rtptime" "github.com/pion/rtcp" "github.com/pion/rtp" "github.com/pion/webrtc/v3" + "github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/stream" ) @@ -112,7 +115,8 @@ func (webrtcTrackWrapper) PTSEqualsDTS(*rtp.Packet) bool { return true } -func (t *webRTCIncomingTrack) start(stream *stream.Stream, timeDecoder *rtptime.GlobalDecoder) { +func (t *webRTCIncomingTrack) start(stream *stream.Stream, timeDecoder *rtptime.GlobalDecoder, log logger.Writer) { + lossDetector := rtplossdetector.New() trackWrapper := &webrtcTrackWrapper{clockRate: int(t.track.Codec().ClockRate)} go func() { @@ -122,6 +126,12 @@ func (t *webRTCIncomingTrack) start(stream *stream.Stream, timeDecoder *rtptime. return } + lost := lossDetector.Process(pkt) + if lost != 0 { + log.Log(logger.Warn, (liberrors.ErrClientRTPPacketsLost{Lost: lost}).Error()) + // do not return + } + // sometimes Chrome sends empty RTP packets. ignore them. if len(pkt.Payload) == 0 { continue diff --git a/internal/core/webrtc_session.go b/internal/core/webrtc_session.go index 493a9921..937b3e66 100644 --- a/internal/core/webrtc_session.go +++ b/internal/core/webrtc_session.go @@ -410,7 +410,7 @@ func (s *webRTCSession) runPublish() (int, error) { timeDecoder := rtptime.NewGlobalDecoder() for _, track := range tracks { - track.start(rres.stream, timeDecoder) + track.start(rres.stream, timeDecoder, s) } select { diff --git a/internal/core/webrtc_source.go b/internal/core/webrtc_source.go index a9bc04f0..e888c12f 100644 --- a/internal/core/webrtc_source.go +++ b/internal/core/webrtc_source.go @@ -158,7 +158,7 @@ func (s *webRTCSource) run(ctx context.Context, cnf *conf.PathConf, _ chan *conf timeDecoder := rtptime.NewGlobalDecoder() for _, track := range tracks { - track.start(rres.stream, timeDecoder) + track.start(rres.stream, timeDecoder, s) } select {