diff --git a/internal/webrtc/api.go b/internal/webrtc/api.go index ad213b80..989ab03e 100644 --- a/internal/webrtc/api.go +++ b/internal/webrtc/api.go @@ -145,7 +145,9 @@ func NewAPI(conf APIConf) (*webrtc.API, error) { } interceptorRegistry := &interceptor.Registry{} - if err := webrtc.RegisterDefaultInterceptors(mediaEngine, interceptorRegistry); err != nil { + + err := webrtc.RegisterDefaultInterceptors(mediaEngine, interceptorRegistry) + if err != nil { return nil, err } diff --git a/internal/webrtc/incoming_track.go b/internal/webrtc/incoming_track.go index 96beadd5..e108f130 100644 --- a/internal/webrtc/incoming_track.go +++ b/internal/webrtc/incoming_track.go @@ -7,7 +7,7 @@ import ( "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/rtpreorderer" "github.com/pion/rtcp" "github.com/pion/rtp" "github.com/pion/webrtc/v3" @@ -24,8 +24,9 @@ type IncomingTrack struct { track *webrtc.TrackRemote log logger.Writer - format format.Format - lossDetector *rtplossdetector.LossDetector + format format.Format + reorderer *rtpreorderer.Reorderer + pkts []*rtp.Packet } func newIncomingTrack( @@ -35,9 +36,9 @@ func newIncomingTrack( log logger.Writer, ) (*IncomingTrack, error) { t := &IncomingTrack{ - track: track, - log: log, - lossDetector: rtplossdetector.New(), + track: track, + log: log, + reorderer: rtpreorderer.New(), } isVideo := false @@ -131,17 +132,36 @@ func (t *IncomingTrack) Format() format.Format { // ReadRTP reads a RTP packet. func (t *IncomingTrack) ReadRTP() (*rtp.Packet, error) { for { + if len(t.pkts) != 0 { + var pkt *rtp.Packet + pkt, t.pkts = t.pkts[0], t.pkts[1:] + + // sometimes Chrome sends empty RTP packets. ignore them. + if len(pkt.Payload) == 0 { + continue + } + + return pkt, nil + } + pkt, _, err := t.track.ReadRTP() if err != nil { return nil, err } - lost := t.lossDetector.Process(pkt) + var lost int + t.pkts, lost = t.reorderer.Process(pkt) if lost != 0 { t.log.Log(logger.Warn, (liberrors.ErrClientRTPPacketsLost{Lost: lost}).Error()) // do not return } + if len(t.pkts) == 0 { + continue + } + + pkt, t.pkts = t.pkts[0], t.pkts[1:] + // sometimes Chrome sends empty RTP packets. ignore them. if len(pkt.Payload) == 0 { continue