Browse Source

webrtc: improve stability by reordering incoming packets (#2570)

pull/2572/head
Alessandro Ros 2 years ago committed by GitHub
parent
commit
38f228c739
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      internal/webrtc/api.go
  2. 34
      internal/webrtc/incoming_track.go

4
internal/webrtc/api.go

@ -145,7 +145,9 @@ func NewAPI(conf APIConf) (*webrtc.API, error) { @@ -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
}

34
internal/webrtc/incoming_track.go

@ -7,7 +7,7 @@ import ( @@ -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 { @@ -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( @@ -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 { @@ -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

Loading…
Cancel
Save