diff --git a/AUTHORS.txt b/AUTHORS.txt index 2c74951fe2d..6b50c70751e 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -60,6 +60,7 @@ Dean Sheather decanus <7621705+decanus@users.noreply.github.com> Denis digitalix +do-hyung-kim donotanswer earle Egon Elbre @@ -101,6 +102,7 @@ juberti Juliusz Chroboczek Justin Okamoto Justin Okamoto +Kevin Kevin Staunton-Lambert Kevin Wang Konstantin Chugalinskiy @@ -137,6 +139,7 @@ mr-shitij <21.shitijagrawal@gmail.com> mxmCherry Nam V. Do Nick Mykins +Nicolas Menard nindolabs <6729798+nindolabs@users.noreply.github.com> Norman Rasmussen notedit diff --git a/rtpsender.go b/rtpsender.go index 49ae4e82e2c..7e47acab56c 100644 --- a/rtpsender.go +++ b/rtpsender.go @@ -27,7 +27,7 @@ type trackEncoding struct { rtcpInterceptor interceptor.RTCPReader streamInfo interceptor.StreamInfo - context TrackLocalContext + context *baseTrackLocalContext ssrc SSRC } @@ -242,13 +242,13 @@ func (r *RTPSender) ReplaceTrack(track TrackLocal) error { } var replacedTrack TrackLocal - var context *TrackLocalContext + var context *baseTrackLocalContext if len(r.trackEncodings) != 0 { replacedTrack = r.trackEncodings[0].track - context = &r.trackEncodings[0].context + context = r.trackEncodings[0].context } if r.hasSent() && replacedTrack != nil { - if err := replacedTrack.Unbind(*context); err != nil { + if err := replacedTrack.Unbind(context); err != nil { return err } } @@ -258,16 +258,16 @@ func (r *RTPSender) ReplaceTrack(track TrackLocal) error { return nil } - codec, err := track.Bind(TrackLocalContext{ - id: context.id, + codec, err := track.Bind(&baseTrackLocalContext{ + id: context.ID(), params: r.api.mediaEngine.getRTPParametersByKind(track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly}), - ssrc: context.ssrc, - writeStream: context.writeStream, - rtcpInterceptor: context.rtcpInterceptor, + ssrc: context.SSRC(), + writeStream: context.WriteStream(), + rtcpInterceptor: context.RTCPReader(), }) if err != nil { // Re-bind the original track - if _, reBindErr := replacedTrack.Bind(*context); reBindErr != nil { + if _, reBindErr := replacedTrack.Bind(context); reBindErr != nil { return reBindErr } @@ -297,7 +297,7 @@ func (r *RTPSender) Send(parameters RTPSendParameters) error { for idx, trackEncoding := range r.trackEncodings { writeStream := &interceptorToTrackLocalWriter{} - trackEncoding.context = TrackLocalContext{ + trackEncoding.context = &baseTrackLocalContext{ id: r.id, params: r.api.mediaEngine.getRTPParametersByKind(trackEncoding.track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly}), ssrc: parameters.Encodings[idx].SSRC, diff --git a/track_local.go b/track_local.go index a2e6599a50b..21131c81119 100644 --- a/track_local.go +++ b/track_local.go @@ -19,7 +19,31 @@ type TrackLocalWriter interface { // TrackLocalContext is the Context passed when a TrackLocal has been Binded/Unbinded from a PeerConnection, and used // in Interceptors. -type TrackLocalContext struct { +type TrackLocalContext interface { + // CodecParameters returns the negotiated RTPCodecParameters. These are the codecs supported by both + // PeerConnections and the SSRC/PayloadTypes + CodecParameters() []RTPCodecParameters + + // HeaderExtensions returns the negotiated RTPHeaderExtensionParameters. These are the header extensions supported by + // both PeerConnections and the SSRC/PayloadTypes + HeaderExtensions() []RTPHeaderExtensionParameter + + // SSRC requires the negotiated SSRC of this track + // This track may have multiple if RTX is enabled + SSRC() SSRC + + // WriteStream returns the WriteStream for this TrackLocal. The implementer writes the outbound + // media packets to it + WriteStream() TrackLocalWriter + + // ID is a unique identifier that is used for both Bind/Unbind + ID() string + + // RTCPReader returns the RTCP interceptor for this TrackLocal. Used to read RTCP of this TrackLocal. + RTCPReader() interceptor.RTCPReader +} + +type baseTrackLocalContext struct { id string params RTPParameters ssrc SSRC @@ -29,35 +53,35 @@ type TrackLocalContext struct { // CodecParameters returns the negotiated RTPCodecParameters. These are the codecs supported by both // PeerConnections and the SSRC/PayloadTypes -func (t *TrackLocalContext) CodecParameters() []RTPCodecParameters { +func (t *baseTrackLocalContext) CodecParameters() []RTPCodecParameters { return t.params.Codecs } // HeaderExtensions returns the negotiated RTPHeaderExtensionParameters. These are the header extensions supported by // both PeerConnections and the SSRC/PayloadTypes -func (t *TrackLocalContext) HeaderExtensions() []RTPHeaderExtensionParameter { +func (t *baseTrackLocalContext) HeaderExtensions() []RTPHeaderExtensionParameter { return t.params.HeaderExtensions } // SSRC requires the negotiated SSRC of this track // This track may have multiple if RTX is enabled -func (t *TrackLocalContext) SSRC() SSRC { +func (t *baseTrackLocalContext) SSRC() SSRC { return t.ssrc } // WriteStream returns the WriteStream for this TrackLocal. The implementer writes the outbound // media packets to it -func (t *TrackLocalContext) WriteStream() TrackLocalWriter { +func (t *baseTrackLocalContext) WriteStream() TrackLocalWriter { return t.writeStream } // ID is a unique identifier that is used for both Bind/Unbind -func (t *TrackLocalContext) ID() string { +func (t *baseTrackLocalContext) ID() string { return t.id } // RTCPReader returns the RTCP interceptor for this TrackLocal. Used to read RTCP of this TrackLocal. -func (t *TrackLocalContext) RTCPReader() interceptor.RTCPReader { +func (t *baseTrackLocalContext) RTCPReader() interceptor.RTCPReader { return t.rtcpInterceptor }