Skip to content

Commit c7ca890

Browse files
committedFeb 2, 2024
Skip padding packet for simulcast probe
Skip padding packet for simulcast probe Fix rtx attributes panic for nil map
1 parent 462a717 commit c7ca890

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed
 

‎peerconnection.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -1577,7 +1577,7 @@ func (pc *PeerConnection) handleIncomingSSRC(rtpStream io.Reader, ssrc SSRC) err
15771577
}
15781578

15791579
var mid, rid, rsid string
1580-
payloadType, err := handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid)
1580+
payloadType, paddingOnly, err := handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid)
15811581
if err != nil {
15821582
return err
15831583
}
@@ -1595,12 +1595,17 @@ func (pc *PeerConnection) handleIncomingSSRC(rtpStream io.Reader, ssrc SSRC) err
15951595

15961596
for readCount := 0; readCount <= simulcastProbeCount; readCount++ {
15971597
if mid == "" || (rid == "" && rsid == "") {
1598+
// skip padding only packets for probing
1599+
if paddingOnly {
1600+
readCount--
1601+
}
1602+
15981603
i, _, err := interceptor.Read(b, nil)
15991604
if err != nil {
16001605
return err
16011606
}
16021607

1603-
if _, err = handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid); err != nil {
1608+
if _, paddingOnly, err = handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid); err != nil {
16041609
return err
16051610
}
16061611

‎peerconnection_media_test.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -1301,7 +1301,28 @@ func TestPeerConnection_Simulcast(t *testing.T) {
13011301

13021302
assert.NoError(t, signalPair(pcOffer, pcAnswer))
13031303

1304-
for sequenceNumber := uint16(0); !ridsFullfilled(); sequenceNumber++ {
1304+
// padding only packets should not affect simulcast probe
1305+
var sequenceNumber uint16
1306+
for sequenceNumber = 0; sequenceNumber < simulcastProbeCount+10; sequenceNumber++ {
1307+
time.Sleep(20 * time.Millisecond)
1308+
1309+
for _, track := range []*TrackLocalStaticRTP{vp8WriterA, vp8WriterB, vp8WriterC} {
1310+
pkt := &rtp.Packet{
1311+
Header: rtp.Header{
1312+
Version: 2,
1313+
SequenceNumber: sequenceNumber,
1314+
PayloadType: 96,
1315+
Padding: true,
1316+
},
1317+
Payload: []byte{0x00, 0x02},
1318+
}
1319+
1320+
assert.NoError(t, track.WriteRTP(pkt))
1321+
}
1322+
}
1323+
assert.False(t, ridsFullfilled(), "Simulcast probe should not be fulfilled by padding only packets")
1324+
1325+
for ; !ridsFullfilled(); sequenceNumber++ {
13051326
time.Sleep(20 * time.Millisecond)
13061327

13071328
for ssrc, rid := range rids {

‎rtptransceiver.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,16 @@ func satisfyTypeAndDirection(remoteKind RTPCodecType, remoteDirection RTPTransce
266266

267267
// handleUnknownRTPPacket consumes a single RTP Packet and returns information that is helpful
268268
// for demuxing and handling an unknown SSRC (usually for Simulcast)
269-
func handleUnknownRTPPacket(buf []byte, midExtensionID, streamIDExtensionID, repairStreamIDExtensionID uint8, mid, rid, rsid *string) (payloadType PayloadType, err error) {
269+
func handleUnknownRTPPacket(buf []byte, midExtensionID, streamIDExtensionID, repairStreamIDExtensionID uint8, mid, rid, rsid *string) (payloadType PayloadType, paddingOnly bool, err error) {
270270
rp := &rtp.Packet{}
271271
if err = rp.Unmarshal(buf); err != nil {
272272
return
273273
}
274274

275+
if rp.Padding && len(rp.Payload) == 0 {
276+
paddingOnly = true
277+
}
278+
275279
if !rp.Header.Extension {
276280
return
277281
}

0 commit comments

Comments
 (0)
Please sign in to comment.