Skip to content

Commit 68d8623

Browse files
committed
Don't drop packets when probing Simulcast
Before any packets that we read during the probe would get lost
1 parent ed9f7fa commit 68d8623

File tree

3 files changed

+112
-6
lines changed

3 files changed

+112
-6
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/pion/rtp v1.8.25
1414
github.com/pion/sctp v1.8.40
1515
github.com/pion/sdp/v3 v3.0.16
16-
github.com/pion/srtp/v3 v3.0.8
16+
github.com/pion/srtp/v3 v3.0.9
1717
github.com/pion/stun/v3 v3.0.1
1818
github.com/pion/transport/v3 v3.1.1
1919
github.com/pion/turn/v4 v4.1.3

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ github.com/pion/sctp v1.8.40 h1:bqbgWYOrUhsYItEnRObUYZuzvOMsVplS3oNgzedBlG8=
5959
github.com/pion/sctp v1.8.40/go.mod h1:SPBBUENXE6ThkEksN5ZavfAhFYll+h+66ZiG6IZQuzo=
6060
github.com/pion/sdp/v3 v3.0.16 h1:0dKzYO6gTAvuLaAKQkC02eCPjMIi4NuAr/ibAwrGDCo=
6161
github.com/pion/sdp/v3 v3.0.16/go.mod h1:9tyKzznud3qiweZcD86kS0ff1pGYB3VX+Bcsmkx6IXo=
62-
github.com/pion/srtp/v3 v3.0.8 h1:RjRrjcIeQsilPzxvdaElN0CpuQZdMvcl9VZ5UY9suUM=
63-
github.com/pion/srtp/v3 v3.0.8/go.mod h1:2Sq6YnDH7/UDCvkSoHSDNDeyBcFgWL0sAVycVbAsXFg=
62+
github.com/pion/srtp/v3 v3.0.9 h1:lRGF4G61xxj+m/YluB3ZnBpiALSri2lTzba0kGZMrQY=
63+
github.com/pion/srtp/v3 v3.0.9/go.mod h1:E+AuWd7Ug2Fp5u38MKnhduvpVkveXJX6J4Lq4rxUYt8=
6464
github.com/pion/stun/v3 v3.0.1 h1:jx1uUq6BdPihF0yF33Jj2mh+C9p0atY94IkdnW174kA=
6565
github.com/pion/stun/v3 v3.0.1/go.mod h1:RHnvlKFg+qHgoKIqtQWMOJF52wsImCAf/Jh5GjX+4Tw=
6666
github.com/pion/transport/v3 v3.1.1 h1:Tr684+fnnKlhPceU+ICdrw6KKkTms+5qHMgw6bIkYOM=

peerconnection_media_test.go

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"bufio"
1111
"bytes"
1212
"context"
13+
"crypto/rand"
1314
"errors"
1415
"fmt"
1516
"io"
@@ -2062,14 +2063,13 @@ func TestPeerConnection_Simulcast_RTX(t *testing.T) { //nolint:cyclop
20622063
assert.NotZero(t, ridID)
20632064
assert.NotZero(t, rsid)
20642065

2065-
err = signalPairWithModification(pcOffer, pcAnswer, func(sdp string) string {
2066+
assert.NoError(t, signalPairWithModification(pcOffer, pcAnswer, func(sdp string) string {
20662067
// Original chrome sdp contains no ssrc info https://pastebin.com/raw/JTjX6zg6
20672068
re := regexp.MustCompile("(?m)[\r\n]+^.*a=ssrc.*$")
20682069
res := re.ReplaceAllString(sdp, "")
20692070

20702071
return res
2071-
})
2072-
assert.NoError(t, err)
2072+
}))
20732073

20742074
// padding only packets should not affect simulcast probe
20752075
var sequenceNumber uint16
@@ -2493,3 +2493,109 @@ func Test_PeerConnection_RTX_E2E(t *testing.T) { //nolint:cyclop
24932493
closePairNow(t, pcOffer, pcAnswer)
24942494
assert.NoError(t, wan.Stop())
24952495
}
2496+
2497+
// Simulcast probe would lose packets. This test asserts that we don't drop
2498+
// any packets during the probe
2499+
func TestPeerConnection_Simulcast_Probe_PacketLoss(t *testing.T) { //nolint:cyclop
2500+
// lim := test.TimeOut(time.Second * 30)
2501+
// defer lim.Stop()
2502+
2503+
// report := test.CheckRoutines(t)
2504+
// defer report()
2505+
2506+
const rtpPktCount = 10
2507+
pcOffer, pcAnswer, wan := createVNetPair(t, nil)
2508+
2509+
rids := []string{"a", "b", "c"}
2510+
vp8WriterA, err := NewTrackLocalStaticRTP(
2511+
RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion2", WithRTPStreamID(rids[0]),
2512+
)
2513+
assert.NoError(t, err)
2514+
2515+
vp8WriterB, err := NewTrackLocalStaticRTP(
2516+
RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion2", WithRTPStreamID(rids[1]),
2517+
)
2518+
assert.NoError(t, err)
2519+
2520+
vp8WriterC, err := NewTrackLocalStaticRTP(
2521+
RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion2", WithRTPStreamID(rids[2]),
2522+
)
2523+
assert.NoError(t, err)
2524+
2525+
sender, err := pcOffer.AddTrack(vp8WriterA)
2526+
assert.NoError(t, err)
2527+
assert.NotNil(t, sender)
2528+
2529+
assert.NoError(t, sender.AddEncoding(vp8WriterB))
2530+
assert.NoError(t, sender.AddEncoding(vp8WriterC))
2531+
2532+
expectedBuffers := [][]byte{
2533+
make([]byte, outboundMTU*rtpPktCount),
2534+
make([]byte, outboundMTU*rtpPktCount),
2535+
make([]byte, outboundMTU*rtpPktCount),
2536+
}
2537+
for i := range expectedBuffers {
2538+
_, err := rand.Read(expectedBuffers[i])
2539+
assert.NoError(t, err)
2540+
}
2541+
2542+
pcAnswer.OnTrack(func(trackRemote *TrackRemote, _ *RTPReceiver) {
2543+
actualBuffer := []byte{}
2544+
2545+
for i := 0; i < rtpPktCount; i++ {
2546+
pkt, _, err := trackRemote.ReadRTP()
2547+
assert.NoError(t, err)
2548+
2549+
actualBuffer = append(actualBuffer, pkt.Payload...)
2550+
fmt.Println(pkt.SequenceNumber)
2551+
}
2552+
2553+
assert.Equal(t, actualBuffer, expectedBuffers[0])
2554+
})
2555+
2556+
var midID, ridID uint8
2557+
for _, extension := range sender.GetParameters().HeaderExtensions {
2558+
switch extension.URI {
2559+
case sdp.SDESMidURI:
2560+
midID = uint8(extension.ID) //nolint:gosec // G115
2561+
case sdp.SDESRTPStreamIDURI:
2562+
ridID = uint8(extension.ID) //nolint:gosec // G115
2563+
}
2564+
}
2565+
assert.NotZero(t, midID)
2566+
assert.NotZero(t, ridID)
2567+
2568+
assert.NoError(t, signalPairWithModification(pcOffer, pcAnswer, func(sdp string) string {
2569+
// Original chrome sdp contains no ssrc info https://pastebin.com/raw/JTjX6zg6
2570+
re := regexp.MustCompile("(?m)[\r\n]+^.*a=ssrc.*$")
2571+
res := re.ReplaceAllString(sdp, "")
2572+
2573+
return res
2574+
}))
2575+
2576+
peerConnectionConnected := untilConnectionState(PeerConnectionStateConnected, pcOffer, pcAnswer)
2577+
peerConnectionConnected.Wait()
2578+
2579+
for sequenceNumber := uint16(0); sequenceNumber < rtpPktCount; sequenceNumber++ {
2580+
for i, track := range []*TrackLocalStaticRTP{vp8WriterA} {
2581+
pkt := &rtp.Packet{
2582+
Header: rtp.Header{
2583+
Version: 2,
2584+
PayloadType: 96,
2585+
SequenceNumber: sequenceNumber,
2586+
},
2587+
}
2588+
2589+
assert.NoError(t, pkt.SetExtension(midID, []byte("0")))
2590+
assert.NoError(t, pkt.SetExtension(ridID, []byte(track.RID())))
2591+
2592+
offset := int(sequenceNumber) * outboundMTU
2593+
pkt.Payload = expectedBuffers[i][offset : offset+outboundMTU]
2594+
assert.NoError(t, track.WriteRTP(pkt))
2595+
}
2596+
}
2597+
2598+
select {}
2599+
assert.NoError(t, wan.Stop())
2600+
closePairNow(t, pcOffer, pcAnswer)
2601+
}

0 commit comments

Comments
 (0)