Ignore receiver reports that have a sequence number before first packet. (#1745)

This commit is contained in:
Raja Subramanian
2023-05-28 10:05:35 +05:30
committed by GitHub
parent e99aabd908
commit ea57e4f2c1
5 changed files with 14 additions and 13 deletions

View File

@@ -539,7 +539,9 @@ func (r *RTPStats) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt uint32
r.lock.Lock()
defer r.lock.Unlock()
if !r.endTime.IsZero() || !r.params.IsReceiverReportDriven {
if !r.endTime.IsZero() || !r.params.IsReceiverReportDriven || rr.LastSequenceNumber < r.extStartSN {
// it is possible that the `LastSequenceNumber` in the receiver report is before the starting
// sequence number when dummy packets are used to trigger Pion's OnTrack path.
return
}
@@ -1107,7 +1109,7 @@ func (r *RTPStats) DeltaInfoOverridden(snapshotId uint32) *RTPDeltaInfo {
packetsExpected := now.extStartSNOverridden - then.extStartSNOverridden
if packetsExpected > NumSequenceNumbers {
r.logger.Warnw(
"too many packets expected in delta",
"too many packets expected in delta (overridden)",
fmt.Errorf("start: %d, end: %d, expected: %d", then.extStartSNOverridden, now.extStartSNOverridden, packetsExpected),
)
return nil
@@ -1558,7 +1560,7 @@ func (r *RTPStats) updateGapHistogram(gap int) {
}
func (r *RTPStats) getAndResetSnapshot(snapshotId uint32, override bool) (*Snapshot, *Snapshot) {
if !r.initialized || (r.params.IsReceiverReportDriven && r.lastRRTime.IsZero()) {
if !r.initialized || (override && r.lastRRTime.IsZero()) {
return nil, nil
}
@@ -1573,7 +1575,7 @@ func (r *RTPStats) getAndResetSnapshot(snapshotId uint32, override bool) (*Snaps
}
var startTime time.Time
if override && r.params.IsReceiverReportDriven {
if override {
startTime = r.lastRRTime
} else {
startTime = time.Now()

View File

@@ -652,7 +652,7 @@ func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error {
// WritePaddingRTP tries to write as many padding only RTP packets as necessary
// to satisfy given size to the DownTrack
func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool) int {
func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool, forceMarker bool) int {
if !d.rtpStats.IsActive() && !paddingOnMute {
return 0
}
@@ -684,7 +684,7 @@ func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool) int {
return 0
}
snts, err := d.forwarder.GetSnTsForPadding(num)
snts, err := d.forwarder.GetSnTsForPadding(num, forceMarker)
if err != nil {
return 0
}
@@ -1699,10 +1699,10 @@ func (d *DownTrack) onBindAndConnected() {
}
func (d *DownTrack) sendPaddingOnMute() {
d.logger.Debugw("sending padding on mute")
// let uptrack have chance to send packet before we send padding
time.Sleep(waitBeforeSendPaddingOnMute)
d.logger.Debugw("sending padding on mute")
if d.kind == webrtc.RTPCodecTypeVideo {
d.sendPaddingOnMuteForVideo()
} else if d.mime == "audio/opus" {
@@ -1717,7 +1717,7 @@ func (d *DownTrack) sendPaddingOnMuteForVideo() {
if d.rtpStats.IsActive() || d.IsClosed() {
return
}
d.WritePaddingRTP(20, true)
d.WritePaddingRTP(20, true, true)
time.Sleep(paddingOnMuteInterval)
}
}

View File

@@ -1649,7 +1649,7 @@ func (f *Forwarder) maybeStart() {
f.firstTS = extPkt.Packet.Timestamp
}
func (f *Forwarder) GetSnTsForPadding(num int) ([]SnTs, error) {
func (f *Forwarder) GetSnTsForPadding(num int, forceMarker bool) ([]SnTs, error) {
f.lock.Lock()
defer f.lock.Unlock()
@@ -1660,7 +1660,6 @@ func (f *Forwarder) GetSnTsForPadding(num int) ([]SnTs, error) {
// not get out-of-sync. But, when a stream is paused,
// force a frame marker as a restart of the stream will
// start with a key frame which will reset the decoder.
forceMarker := false
if !f.vls.GetTarget().IsValid() {
forceMarker = true
}

View File

@@ -1770,7 +1770,7 @@ func TestForwardGetSnTsForPadding(t *testing.T) {
disable(f)
// should get back frame end needed as the last packet did not have RTP marker set
snts, err := f.GetSnTsForPadding(5)
snts, err := f.GetSnTsForPadding(5, false)
require.NoError(t, err)
numPadding := 5
@@ -1786,7 +1786,7 @@ func TestForwardGetSnTsForPadding(t *testing.T) {
require.Equal(t, sntsExpected, snts)
// now that there is a marker, timestamp should jump on first padding when asked again
snts, err = f.GetSnTsForPadding(numPadding)
snts, err = f.GetSnTsForPadding(numPadding, false)
require.NoError(t, err)
for i := 0; i < numPadding; i++ {

View File

@@ -135,7 +135,7 @@ func (t *Track) SetMaxLayer(layer buffer.VideoLayer) bool {
}
func (t *Track) WritePaddingRTP(bytesToSend int) int {
return t.downTrack.WritePaddingRTP(bytesToSend, false)
return t.downTrack.WritePaddingRTP(bytesToSend, false, false)
}
func (t *Track) AllocateOptimal(allowOvershoot bool) sfu.VideoAllocation {