Open
Description
Your environment.
- Version: master
- Browser: N/A
What did you do?
When TransportLayerCC
packets are parsed in feedback_adapter.go the refTime and deltaIndex are only updated for packets found in history. If only some packets in the report are missing from history this leads to subsequent packets getting the wrong arrival time. See test below.
What did you expect?
The arrival time for packets still in history should be correct even if some earlier packets in the report expired.
func TestRecvDeltaOutOfSync(t *testing.T) {
adapter := NewFeedbackAdapter()
t0 := time.Time{}
headers := []rtp.Header{}
// passes when packet count is <= 250
for i := uint16(0); i < 251; i++ {
pkt := getPacketWithTransportCCExt(t, i)
headers = append(headers, pkt.Header)
assert.NoError(t, adapter.OnSent(t0, &pkt.Header, 1200, interceptor.Attributes{TwccExtensionAttributesKey: hdrExtID}))
}
results, err := adapter.OnTransportCCFeedback(t0, &rtcp.TransportLayerCC{
Header: rtcp.Header{},
SenderSSRC: 0,
MediaSSRC: 0,
BaseSequenceNumber: 0,
PacketStatusCount: 22,
ReferenceTime: 0,
FbPktCount: 0,
PacketChunks: []rtcp.PacketStatusChunk{
&rtcp.StatusVectorChunk{
PacketStatusChunk: nil,
Type: rtcp.TypeTCCStatusVectorChunk,
SymbolSize: rtcp.TypeTCCSymbolSizeTwoBit,
SymbolList: []uint16{
rtcp.TypeTCCPacketReceivedSmallDelta,
rtcp.TypeTCCPacketReceivedSmallDelta,
},
},
},
RecvDeltas: []*rtcp.RecvDelta{
{
Type: rtcp.TypeTCCPacketReceivedSmallDelta,
Delta: 3,
},
{
Type: rtcp.TypeTCCPacketReceivedSmallDelta,
Delta: 6,
},
},
})
assert.NoError(t, err)
assert.NotEmpty(t, results)
assert.Len(t, results, 2)
assert.Contains(t, results, Acknowledgment{
SequenceNumber: 1,
Size: headers[1].MarshalSize() + 1200,
Departure: t0,
Arrival: t0.Add(9 * time.Microsecond),
})
}
Metadata
Metadata
Assignees
Labels
No labels