Skip to content

Shifted arrival times when some packets in TransportLayerCC have expired #260

Open
@anders-avos

Description

@anders-avos

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions