Skip to content

Commit

Permalink
Fix WebRTC WriteRTP panic #994
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexxIT committed Apr 30, 2024
1 parent fd6014c commit bec7927
Showing 1 changed file with 22 additions and 12 deletions.
34 changes: 22 additions & 12 deletions pkg/webrtc/track.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package webrtc

import (
"sync"

"github.com/pion/rtp"
"github.com/pion/webrtc/v3"
)
Expand All @@ -12,6 +14,7 @@ type Track struct {
sequence uint16
ssrc uint32
writer webrtc.TrackLocalWriter
mu sync.Mutex
}

func NewTrack(kind string) *Track {
Expand All @@ -23,8 +26,10 @@ func NewTrack(kind string) *Track {
}

func (t *Track) Bind(context webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error) {
t.mu.Lock()
t.ssrc = uint32(context.SSRC())
t.writer = context.WriteStream()
t.mu.Unlock()

for _, parameters := range context.CodecParameters() {
// return first parameters
Expand All @@ -35,7 +40,9 @@ func (t *Track) Bind(context webrtc.TrackLocalContext) (webrtc.RTPCodecParameter
}

func (t *Track) Unbind(context webrtc.TrackLocalContext) error {
t.mu.Lock()
t.writer = nil
t.mu.Unlock()
return nil
}

Expand All @@ -55,19 +62,22 @@ func (t *Track) Kind() webrtc.RTPCodecType {
return webrtc.NewRTPCodecType(t.kind)
}

func (t *Track) WriteRTP(payloadType uint8, packet *rtp.Packet) error {
func (t *Track) WriteRTP(payloadType uint8, packet *rtp.Packet) (err error) {
// using mutex because Unbind https://github.com/AlexxIT/go2rtc/issues/994
t.mu.Lock()

// in case when we start WriteRTP before Track.Bind
if t.writer == nil {
return nil
}
if t.writer != nil {
// important to have internal counter if input packets from different sources
t.sequence++

// important to have internal counter if input packets from different sources
t.sequence++
header := packet.Header
header.SSRC = t.ssrc
header.PayloadType = payloadType
header.SequenceNumber = t.sequence
_, err = t.writer.WriteRTP(&header, packet.Payload)
}

header := packet.Header
header.SSRC = t.ssrc
header.PayloadType = payloadType
header.SequenceNumber = t.sequence
_, err := t.writer.WriteRTP(&header, packet.Payload)
return err
t.mu.Unlock()
return
}

0 comments on commit bec7927

Please sign in to comment.