Do not start RTPStats on a padding packet. (#1984)

This commit is contained in:
Raja Subramanian
2023-08-21 18:04:03 +05:30
committed by GitHub
parent 32af15dc80
commit b1098cda41
3 changed files with 35 additions and 36 deletions

View File

@@ -180,6 +180,7 @@ func TestNewBuffer(t *testing.T) {
Header: rtp.Header{
SequenceNumber: 65534,
},
Payload: []byte{1},
},
{
Header: rtp.Header{
@@ -201,8 +202,7 @@ func TestNewBuffer(t *testing.T) {
buff := NewBuffer(123, pool, pool)
buff.codecType = webrtc.RTPCodecTypeVideo
require.NotNil(t, buff)
buff.OnRtcpFeedback(func(_ []rtcp.Packet) {
})
buff.OnRtcpFeedback(func(_ []rtcp.Packet) {})
buff.Bind(webrtc.RTPParameters{
HeaderExtensions: nil,
Codecs: []webrtc.RTPCodecParameters{vp8Codec},

View File

@@ -377,6 +377,11 @@ func (r *RTPStats) Update(rtph *rtp.Header, payloadSize int, paddingSize int, pa
first := false
if !r.initialized {
if payloadSize == 0 {
// do not start on a padding only packet
return
}
r.initialized = true
r.startTime = time.Now()
@@ -514,6 +519,12 @@ func (r *RTPStats) maybeAdjustStart(rtph *rtp.Header, pktSize uint64, hdrSize ui
return false
}
if payloadSize == 0 {
// do not start on a padding only packet
r.logger.Infow("adjusting start, skipping on padding only packet")
return true
}
r.packetsLost += uint32(uint16(r.extStartSN)-rtph.SequenceNumber) - 1
snBeforeAdjust := r.extStartSN
r.extStartSN = uint32(rtph.SequenceNumber)

View File

@@ -784,9 +784,8 @@ func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool, forceMa
TransportWideExtID: uint8(d.transportWideExtID),
WriteStream: d.writeStream,
Metadata: sendPacketMetadata{
isPadding: true,
disableCounter: true,
disableRTPStats: paddingOnMute,
isPadding: true,
disableCounter: true,
},
OnSent: d.packetSent,
})
@@ -1294,10 +1293,7 @@ func (d *DownTrack) writeBlankFrameRTP(duration float32, generation uint32) chan
AbsSendTimeExtID: uint8(d.absSendTimeExtID),
TransportWideExtID: uint8(d.transportWideExtID),
WriteStream: d.writeStream,
Metadata: sendPacketMetadata{
isBlankFrame: true,
},
OnSent: d.packetSent,
OnSent: d.packetSent,
})
// only the first frame will need frameEndNeeded to close out the
@@ -1791,11 +1787,7 @@ func (d *DownTrack) sendSilentFrameOnMuteForOpus() {
AbsSendTimeExtID: uint8(d.absSendTimeExtID),
TransportWideExtID: uint8(d.transportWideExtID),
WriteStream: d.writeStream,
Metadata: sendPacketMetadata{
isBlankFrame: true,
disableRTPStats: true,
},
OnSent: d.packetSent,
OnSent: d.packetSent,
})
}
@@ -1812,16 +1804,14 @@ func (d *DownTrack) HandleRTCPSenderReportData(_payloadType webrtc.PayloadType,
}
type sendPacketMetadata struct {
layer int32
arrival time.Time
isKeyFrame bool
isRTX bool
isPadding bool
isBlankFrame bool
disableCounter bool
disableRTPStats bool
tp *TranslationParams
pool *[]byte
layer int32
arrival time.Time
isKeyFrame bool
isRTX bool
isPadding bool
disableCounter bool
tp *TranslationParams
pool *[]byte
}
func (d *DownTrack) packetSent(md interface{}, hdr *rtp.Header, payloadSize int, sendTime time.Time, sendError error) {
@@ -1839,10 +1829,9 @@ func (d *DownTrack) packetSent(md interface{}, hdr *rtp.Header, payloadSize int,
return
}
headerSize := hdr.MarshalSize()
if !spmd.disableCounter {
// STREAM-ALLOCATOR-TODO: remove this stream allocator bytes counter once stream allocator changes fully to pull bytes counter
size := uint32(headerSize + payloadSize)
size := uint32(hdr.MarshalSize() + payloadSize)
d.streamAllocatorBytesCounter.Add(size)
if spmd.isRTX {
d.bytesRetransmitted.Add(size)
@@ -1851,16 +1840,15 @@ func (d *DownTrack) packetSent(md interface{}, hdr *rtp.Header, payloadSize int,
}
}
if !spmd.disableRTPStats {
packetTime := spmd.arrival
if packetTime.IsZero() {
packetTime = sendTime
}
if spmd.isPadding {
d.rtpStats.Update(hdr, 0, payloadSize, packetTime)
} else {
d.rtpStats.Update(hdr, payloadSize, 0, packetTime)
}
// update RTPStats
packetTime := spmd.arrival
if packetTime.IsZero() {
packetTime = sendTime
}
if spmd.isPadding {
d.rtpStats.Update(hdr, 0, payloadSize, packetTime)
} else {
d.rtpStats.Update(hdr, payloadSize, 0, packetTime)
}
if spmd.isKeyFrame {