mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-25 04:22:00 -08:00
webrtc: improve stability by reordering incoming packets (#2570)
This commit is contained in:
parent
20a16125ae
commit
38f228c739
2 changed files with 30 additions and 8 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue