Skip to content

Commit

Permalink
ReplaceTrack resets all track encodings
Browse files Browse the repository at this point in the history
This PR addresses an issue where calling RTPSender.ReplaceTrack with
a nil parameter on a sender with more than 1 encoding (simulcast) would
only cause the 1st encoding to be unbound, breaking common publisher
reconnection workflows with simulcast enabled.
  • Loading branch information
biglittlebigben authored and davidzhao committed Nov 16, 2023
1 parent 367caa0 commit f369fda
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions rtpsender.go
Expand Up @@ -243,21 +243,26 @@ func (r *RTPSender) ReplaceTrack(track TrackLocal) error {

var replacedTrack TrackLocal
var context *baseTrackLocalContext
if len(r.trackEncodings) != 0 {
replacedTrack = r.trackEncodings[0].track
context = r.trackEncodings[0].context
}
if r.hasSent() && replacedTrack != nil {
if err := replacedTrack.Unbind(context); err != nil {
return err
for _, e := range r.trackEncodings {
replacedTrack = e.track
context = e.context

if r.hasSent() && replacedTrack != nil {
if err := replacedTrack.Unbind(context); err != nil {
return err
}
}

if !r.hasSent() || track == nil {
e.track = track
}
}

if !r.hasSent() || track == nil {
r.trackEncodings[0].track = track
return nil
}

// If we reach this point in the routine, there is only 1 track encoding
codec, err := track.Bind(&baseTrackLocalContext{
id: context.ID(),
params: r.api.mediaEngine.getRTPParametersByKind(track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly}),
Expand All @@ -280,6 +285,7 @@ func (r *RTPSender) ReplaceTrack(track TrackLocal) error {
}

r.trackEncodings[0].track = track

return nil
}

Expand Down

0 comments on commit f369fda

Please sign in to comment.