for (int k = 0; k < 2; k++) { // Two iteration with/without wrap around.
NackTracker nack(kDefaultNackListSize);
nack.UpdateSampleRate(kSampleRateHz);
uint16_t sequence_num_lost_packets[kNumAllLostPackets];
for (int n = 0; n < kNumAllLostPackets; n++) {
sequence_num_lost_packets[n] =
kSequenceNumberLostPackets[n] +
k * 65531; // Have wrap around in sequence numbers for |k == 1|.
}
uint16_t seq_num = sequence_num_lost_packets[0] - 1;
for (int k = 0; k < 2; ++k) { // Two iteration with/without wrap around.
NackTracker nack(kDefaultNackListSize);
nack.UpdateSampleRate(kSampleRateHz);
uint16_t sequence_num_lost_packets[kNumAllLostPackets];
for (int n = 0; n < kNumAllLostPackets; ++n) {
sequence_num_lost_packets[n] = kSequenceNumberLostPackets[n] +
k * 65531; // Wrap around for |k == 1|.
}
seq_num = sequence_num_lost_packets[kNumAllLostPackets - 1] + 1;
timestamp += kTimestampIncrement * (kNumAllLostPackets + 1);
size_t num_lost_packets = kNumAllLostPackets;
for (int n = 0; n < kNumAllLostPackets; ++n) { // Number of lost packets does not change for the first // |kNackThreshold + 1| packets, one is added to the list and one is // removed. Thereafter, the list shrinks every iteration.
if (n >= 1)
num_lost_packets--;
// Retransmission of a lost RTP.
nack.UpdateLastReceivedPacket(
sequence_num_lost_packets[index_retransmitted_rtp],
timestamp_retransmitted_rtp);
index_retransmitted_rtp++;
timestamp_retransmitted_rtp += kTimestampIncrement;
nack_list = nack.GetNackList(kShortRoundTripTime);
EXPECT_TRUE(IsNackListCorrect(
nack_list, &sequence_num_lost_packets[index_retransmitted_rtp],
num_lost_packets - 1)); // One less lost packet in the list.
}
ASSERT_TRUE(nack_list.empty());
}
}
// Two consecutive packets to have a correct estimate of timestamp increase.
uint16_t seq_num = 0;
nack.UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement);
seq_num++;
nack.UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement);
TEST(NackTrackerTest, FixedDelayMode) { const int kNackListSize = 200;
NackTracker nack(kNackListSize);
nack.UpdateSampleRate(kSampleRateHz);
uint16_t seq_num = 0;
uint32_t timestamp = 0x87654321;
nack.UpdateLastReceivedPacket(seq_num, timestamp);
nack.UpdateLastReceivedPacket(seq_num + 2,
timestamp + 2 * kTimestampIncrement);
EXPECT_THAT(nack.GetNackList(kShortRoundTripTime), ElementsAre(seq_num + 1)); // The RTT is larger than the fixed delay, so no packets should be NACKed.
EXPECT_THAT(nack.GetNackList(TimeDelta::Seconds(1)), IsEmpty());
// Update the latest received packet such that the lost packet is older than // the fixed delay.
nack.UpdateLastReceivedPacket(
seq_num + 3, timestamp + 2 * kTimestampIncrement + kSampleRateHz);
EXPECT_THAT(nack.GetNackList(kShortRoundTripTime), IsEmpty());
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.