Browse Source

webrtc: fix race condition when broadcasting RTP packets (#2117)

pull/2120/head
Alessandro Ros 2 years ago committed by GitHub
parent
commit
dfc8e1fa91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      internal/core/webrtc_outgoing_track.go

25
internal/core/webrtc_outgoing_track.go

@ -12,11 +12,22 @@ import (
"github.com/bluenviron/gortsplib/v3/pkg/formats/rtpvp9" "github.com/bluenviron/gortsplib/v3/pkg/formats/rtpvp9"
"github.com/bluenviron/gortsplib/v3/pkg/media" "github.com/bluenviron/gortsplib/v3/pkg/media"
"github.com/bluenviron/gortsplib/v3/pkg/ringbuffer" "github.com/bluenviron/gortsplib/v3/pkg/ringbuffer"
"github.com/pion/rtp"
"github.com/pion/webrtc/v3" "github.com/pion/webrtc/v3"
"github.com/bluenviron/mediamtx/internal/formatprocessor" "github.com/bluenviron/mediamtx/internal/formatprocessor"
) )
// workaround until this gets tagged:
// https://github.com/pion/rtp/pull/234
func rtpPacketCopyForMarshal(in *rtp.Packet) *rtp.Packet {
return &rtp.Packet{
Header: in.Header,
Payload: in.Payload,
PaddingSize: in.PaddingSize,
}
}
type webRTCOutgoingTrack struct { type webRTCOutgoingTrack struct {
sender *webrtc.RTPSender sender *webrtc.RTPSender
media *media.Media media *media.Media
@ -65,7 +76,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil
@ -112,7 +123,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil
@ -159,7 +170,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil
@ -219,7 +230,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil
@ -254,7 +265,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err
track: webRTCTrak, track: webRTCTrak,
cb: func(unit formatprocessor.Unit) error { cb: func(unit formatprocessor.Unit) error {
for _, pkt := range unit.GetRTPPackets() { for _, pkt := range unit.GetRTPPackets() {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil
@ -284,7 +295,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err
track: webRTCTrak, track: webRTCTrak,
cb: func(unit formatprocessor.Unit) error { cb: func(unit formatprocessor.Unit) error {
for _, pkt := range unit.GetRTPPackets() { for _, pkt := range unit.GetRTPPackets() {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil
@ -321,7 +332,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err
track: webRTCTrak, track: webRTCTrak,
cb: func(unit formatprocessor.Unit) error { cb: func(unit formatprocessor.Unit) error {
for _, pkt := range unit.GetRTPPackets() { for _, pkt := range unit.GetRTPPackets() {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(rtpPacketCopyForMarshal(pkt))
} }
return nil return nil

Loading…
Cancel
Save