Send FEC and RTX PayloadType into interceptor

New fields added to interceptor.StreamInfo
This commit is contained in:
Sean DuBois
2024-10-04 21:33:10 -04:00
parent a67587daa8
commit 32f7063f1a
8 changed files with 30 additions and 29 deletions

2
go.mod
View File

@@ -6,7 +6,7 @@ require (
github.com/pion/datachannel v1.5.9 github.com/pion/datachannel v1.5.9
github.com/pion/dtls/v3 v3.0.2 github.com/pion/dtls/v3 v3.0.2
github.com/pion/ice/v4 v4.0.1 github.com/pion/ice/v4 v4.0.1
github.com/pion/interceptor v0.1.32 github.com/pion/interceptor v0.1.34
github.com/pion/logging v0.2.2 github.com/pion/logging v0.2.2
github.com/pion/randutil v0.1.0 github.com/pion/randutil v0.1.0
github.com/pion/rtcp v1.2.14 github.com/pion/rtcp v1.2.14

4
go.sum
View File

@@ -41,8 +41,8 @@ github.com/pion/dtls/v3 v3.0.2 h1:425DEeJ/jfuTTghhUDW0GtYZYIwwMtnKKJNMcWccTX0=
github.com/pion/dtls/v3 v3.0.2/go.mod h1:dfIXcFkKoujDQ+jtd8M6RgqKK3DuaUilm3YatAbGp5k= github.com/pion/dtls/v3 v3.0.2/go.mod h1:dfIXcFkKoujDQ+jtd8M6RgqKK3DuaUilm3YatAbGp5k=
github.com/pion/ice/v4 v4.0.1 h1:2d3tPoTR90F3TcGYeXUwucGlXI3hds96cwv4kjZmb9s= github.com/pion/ice/v4 v4.0.1 h1:2d3tPoTR90F3TcGYeXUwucGlXI3hds96cwv4kjZmb9s=
github.com/pion/ice/v4 v4.0.1/go.mod h1:2dpakjpd7+74L5j3TAe6gvkbI5UIzOgAnkimm9SuHvA= github.com/pion/ice/v4 v4.0.1/go.mod h1:2dpakjpd7+74L5j3TAe6gvkbI5UIzOgAnkimm9SuHvA=
github.com/pion/interceptor v0.1.32 h1:DYbusOBhWKjPMiA5ifyczW03Tnh12gCaYn4VOvLMGk4= github.com/pion/interceptor v0.1.34 h1:jb1MG9LTdQ4VVCSZDUbUzjeJNngzz4dBXcr2dL+ejfA=
github.com/pion/interceptor v0.1.32/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= github.com/pion/interceptor v0.1.34/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=

View File

@@ -159,7 +159,8 @@ func (i *interceptorToTrackLocalWriter) Write(b []byte) (int, error) {
return i.WriteRTP(&packet.Header, packet.Payload) return i.WriteRTP(&packet.Header, packet.Payload)
} }
func createStreamInfo(id string, ssrc, ssrcFEC, ssrcRTX SSRC, payloadType PayloadType, codec RTPCodecCapability, webrtcHeaderExtensions []RTPHeaderExtensionParameter) *interceptor.StreamInfo { // nolint: unparam
func createStreamInfo(id string, ssrc, ssrcRTX, ssrcFEC SSRC, payloadType, payloadTypeRTX, payloadTypeFEC PayloadType, codec RTPCodecCapability, webrtcHeaderExtensions []RTPHeaderExtensionParameter) *interceptor.StreamInfo {
headerExtensions := make([]interceptor.RTPHeaderExtension, 0, len(webrtcHeaderExtensions)) headerExtensions := make([]interceptor.RTPHeaderExtension, 0, len(webrtcHeaderExtensions))
for _, h := range webrtcHeaderExtensions { for _, h := range webrtcHeaderExtensions {
headerExtensions = append(headerExtensions, interceptor.RTPHeaderExtension{ID: h.ID, URI: h.URI}) headerExtensions = append(headerExtensions, interceptor.RTPHeaderExtension{ID: h.ID, URI: h.URI})
@@ -171,17 +172,19 @@ func createStreamInfo(id string, ssrc, ssrcFEC, ssrcRTX SSRC, payloadType Payloa
} }
return &interceptor.StreamInfo{ return &interceptor.StreamInfo{
ID: id, ID: id,
Attributes: interceptor.Attributes{}, Attributes: interceptor.Attributes{},
SSRC: uint32(ssrc), SSRC: uint32(ssrc),
SSRCRetransmission: uint32(ssrcRTX), SSRCRetransmission: uint32(ssrcRTX),
SSRCForwardErrorCorrection: uint32(ssrcFEC), SSRCForwardErrorCorrection: uint32(ssrcFEC),
PayloadType: uint8(payloadType), PayloadType: uint8(payloadType),
RTPHeaderExtensions: headerExtensions, PayloadTypeRetransmission: uint8(payloadTypeRTX),
MimeType: codec.MimeType, PayloadTypeForwardErrorCorrection: uint8(payloadTypeFEC),
ClockRate: codec.ClockRate, RTPHeaderExtensions: headerExtensions,
Channels: codec.Channels, MimeType: codec.MimeType,
SDPFmtpLine: codec.SDPFmtpLine, ClockRate: codec.ClockRate,
RTCPFeedback: feedbacks, Channels: codec.Channels,
SDPFmtpLine: codec.SDPFmtpLine,
RTCPFeedback: feedbacks,
} }
} }

View File

@@ -1621,7 +1621,7 @@ func (pc *PeerConnection) handleIncomingSSRC(rtpStream io.Reader, ssrc SSRC) err
return err return err
} }
streamInfo := createStreamInfo("", ssrc, 0, 0, params.Codecs[0].PayloadType, params.Codecs[0].RTPCodecCapability, params.HeaderExtensions) streamInfo := createStreamInfo("", ssrc, 0, 0, params.Codecs[0].PayloadType, 0, 0, params.Codecs[0].RTPCodecCapability, params.HeaderExtensions)
readStream, interceptor, rtcpReadStream, rtcpInterceptor, err := pc.dtlsTransport.streamsForSSRC(ssrc, *streamInfo) readStream, interceptor, rtcpReadStream, rtcpInterceptor, err := pc.dtlsTransport.streamsForSSRC(ssrc, *streamInfo)
if err != nil { if err != nil {
return err return err

View File

@@ -126,13 +126,13 @@ func codecParametersFuzzySearch(needle RTPCodecParameters, haystack []RTPCodecPa
} }
// Given a CodecParameters find the RTX CodecParameters if one exists // Given a CodecParameters find the RTX CodecParameters if one exists
func findRTXCodecParameters(needle PayloadType, haystack []RTPCodecParameters) (RTPCodecParameters, bool) { func findRTXPayloadType(needle PayloadType, haystack []RTPCodecParameters) PayloadType {
aptStr := fmt.Sprintf("apt=%d", needle) aptStr := fmt.Sprintf("apt=%d", needle)
for _, c := range haystack { for _, c := range haystack {
if aptStr == c.SDPFmtpLine { if aptStr == c.SDPFmtpLine {
return c, true return c.PayloadType
} }
} }
return RTPCodecParameters{}, false return PayloadType(0)
} }

View File

@@ -210,14 +210,14 @@ func (r *RTPReceiver) startReceive(parameters RTPReceiveParameters) error {
return fmt.Errorf("%w: %d", errRTPReceiverWithSSRCTrackStreamNotFound, parameters.Encodings[i].SSRC) return fmt.Errorf("%w: %d", errRTPReceiverWithSSRCTrackStreamNotFound, parameters.Encodings[i].SSRC)
} }
t.streamInfo = createStreamInfo("", parameters.Encodings[i].SSRC, 0, 0, 0, codec, globalParams.HeaderExtensions) t.streamInfo = createStreamInfo("", parameters.Encodings[i].SSRC, 0, 0, 0, 0, 0, codec, globalParams.HeaderExtensions)
var err error var err error
if t.rtpReadStream, t.rtpInterceptor, t.rtcpReadStream, t.rtcpInterceptor, err = r.transport.streamsForSSRC(parameters.Encodings[i].SSRC, *t.streamInfo); err != nil { if t.rtpReadStream, t.rtpInterceptor, t.rtcpReadStream, t.rtcpInterceptor, err = r.transport.streamsForSSRC(parameters.Encodings[i].SSRC, *t.streamInfo); err != nil {
return err return err
} }
if rtxSsrc := parameters.Encodings[i].RTX.SSRC; rtxSsrc != 0 { if rtxSsrc := parameters.Encodings[i].RTX.SSRC; rtxSsrc != 0 {
streamInfo := createStreamInfo("", rtxSsrc, 0, 0, 0, codec, globalParams.HeaderExtensions) streamInfo := createStreamInfo("", rtxSsrc, 0, 0, 0, 0, 0, codec, globalParams.HeaderExtensions)
rtpReadStream, rtpInterceptor, rtcpReadStream, rtcpInterceptor, err := r.transport.streamsForSSRC(rtxSsrc, *streamInfo) rtpReadStream, rtpInterceptor, rtcpReadStream, rtcpInterceptor, err := r.transport.streamsForSSRC(rtxSsrc, *streamInfo)
if err != nil { if err != nil {
return err return err

View File

@@ -305,6 +305,7 @@ func (r *RTPSender) Send(parameters RTPSendParameters) error {
trackEncoding := r.trackEncodings[idx] trackEncoding := r.trackEncodings[idx]
srtpStream := &srtpWriterFuture{ssrc: parameters.Encodings[idx].SSRC, rtpSender: r} srtpStream := &srtpWriterFuture{ssrc: parameters.Encodings[idx].SSRC, rtpSender: r}
writeStream := &interceptorToTrackLocalWriter{} writeStream := &interceptorToTrackLocalWriter{}
rtpParameters := r.api.mediaEngine.getRTPParametersByKind(trackEncoding.track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly})
trackEncoding.srtpStream = srtpStream trackEncoding.srtpStream = srtpStream
trackEncoding.ssrc = parameters.Encodings[idx].SSRC trackEncoding.ssrc = parameters.Encodings[idx].SSRC
@@ -312,7 +313,7 @@ func (r *RTPSender) Send(parameters RTPSendParameters) error {
trackEncoding.ssrcFEC = parameters.Encodings[idx].FEC.SSRC trackEncoding.ssrcFEC = parameters.Encodings[idx].FEC.SSRC
trackEncoding.context = &baseTrackLocalContext{ trackEncoding.context = &baseTrackLocalContext{
id: r.id, id: r.id,
params: r.api.mediaEngine.getRTPParametersByKind(trackEncoding.track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly}), params: rtpParameters,
ssrc: parameters.Encodings[idx].SSRC, ssrc: parameters.Encodings[idx].SSRC,
ssrcFEC: parameters.Encodings[idx].FEC.SSRC, ssrcFEC: parameters.Encodings[idx].FEC.SSRC,
ssrcRTX: parameters.Encodings[idx].RTX.SSRC, ssrcRTX: parameters.Encodings[idx].RTX.SSRC,
@@ -332,6 +333,8 @@ func (r *RTPSender) Send(parameters RTPSendParameters) error {
parameters.Encodings[idx].RTX.SSRC, parameters.Encodings[idx].RTX.SSRC,
parameters.Encodings[idx].FEC.SSRC, parameters.Encodings[idx].FEC.SSRC,
codec.PayloadType, codec.PayloadType,
findRTXPayloadType(codec.PayloadType, rtpParameters.Codecs),
0,
codec.RTPCodecCapability, codec.RTPCodecCapability,
parameters.HeaderExtensions, parameters.HeaderExtensions,
) )

View File

@@ -66,17 +66,12 @@ func (s *TrackLocalStaticRTP) Bind(t TrackLocalContext) (RTPCodecParameters, err
parameters := RTPCodecParameters{RTPCodecCapability: s.codec} parameters := RTPCodecParameters{RTPCodecCapability: s.codec}
if codec, matchType := codecParametersFuzzySearch(parameters, t.CodecParameters()); matchType != codecMatchNone { if codec, matchType := codecParametersFuzzySearch(parameters, t.CodecParameters()); matchType != codecMatchNone {
var payloadTypeRTX PayloadType
if rtxParameters, ok := findRTXCodecParameters(codec.PayloadType, t.CodecParameters()); ok {
payloadTypeRTX = rtxParameters.PayloadType
}
s.bindings = append(s.bindings, trackBinding{ s.bindings = append(s.bindings, trackBinding{
ssrc: t.SSRC(), ssrc: t.SSRC(),
ssrcRTX: t.SSRCRetransmission(), ssrcRTX: t.SSRCRetransmission(),
ssrcFEC: t.SSRCForwardErrorCorrection(), ssrcFEC: t.SSRCForwardErrorCorrection(),
payloadType: codec.PayloadType, payloadType: codec.PayloadType,
payloadTypeRTX: payloadTypeRTX, payloadTypeRTX: findRTXPayloadType(codec.PayloadType, t.CodecParameters()),
writeStream: t.WriteStream(), writeStream: t.WriteStream(),
id: t.ID(), id: t.ID(),
}) })