mirror of
https://github.com/pion/webrtc.git
synced 2025-09-26 19:21:12 +08:00
Make TrackLocalContext an interface
This allows external users to provide their own TrackLocalContext to be bound to a track.
This commit is contained in:
22
rtpsender.go
22
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,
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user