mirror of
https://github.com/pion/webrtc.git
synced 2025-09-27 11:32:19 +08:00
Send FEC and RTX PayloadType into interceptor
New fields added to interceptor.StreamInfo
This commit is contained in:
2
go.mod
2
go.mod
@@ -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
4
go.sum
@@ -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=
|
||||||
|
@@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
)
|
)
|
||||||
|
@@ -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(),
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user