Skip to content

Commit

Permalink
Make TrackLocalContext an interface
Browse files Browse the repository at this point in the history
This allows external users to provide their own TrackLocalContext to be
bound to a track.
  • Loading branch information
kevmo314 authored and Sean-Der committed Aug 3, 2023
1 parent 6a3a97f commit 667d0ff
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 18 deletions.
22 changes: 11 additions & 11 deletions rtpsender.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type trackEncoding struct {
rtcpInterceptor interceptor.RTCPReader
streamInfo interceptor.StreamInfo

context TrackLocalContext
context *baseTrackLocalContext

ssrc SSRC
}
Expand Down Expand Up @@ -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
}
}
Expand All @@ -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
}

Expand Down Expand Up @@ -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,
Expand Down
38 changes: 31 additions & 7 deletions track_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}

Expand Down

0 comments on commit 667d0ff

Please sign in to comment.