mirror of
https://github.com/livekit/livekit.git
synced 2026-04-25 22:02:08 +00:00
Ignore receiver reports that have a sequence number before first packet. (#1745)
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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++ {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user