Index: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
index f0b6411af2711ffc3d2d39c446774268e5ecebec..88607b34357c199b77d911b6c39b4c959b4be9cc 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
@@ -145,7 +145,7 @@ class RtpSenderTest : public ::testing::Test { |
rtp_sender_.reset(new RTPSender( |
false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr, |
&seq_num_allocator_, nullptr, nullptr, nullptr, nullptr, |
- &mock_rtc_event_log_, &send_packet_observer_)); |
+ &mock_rtc_event_log_, &send_packet_observer_, nullptr)); |
rtp_sender_->SetSequenceNumber(kSeqNum); |
} |
@@ -1011,7 +1011,7 @@ TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) { |
rtp_sender_.reset(new RTPSender( |
false, &fake_clock_, &transport_, &mock_paced_sender_, |
nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr, |
- nullptr, nullptr, &send_packet_observer_)); |
+ nullptr, nullptr, &send_packet_observer_, nullptr)); |
rtp_sender_->SetSequenceNumber(kSeqNum); |
rtp_sender_->SetStorePacketsStatus(true, 10); |
@@ -1029,7 +1029,7 @@ TEST_F(RtpSenderTest, SendRedundantPayloads) { |
MockTransport transport; |
rtp_sender_.reset(new RTPSender( |
false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr, |
- nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr)); |
+ nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr, nullptr)); |
rtp_sender_->SetSequenceNumber(kSeqNum); |
rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); |
@@ -1176,7 +1176,7 @@ TEST_F(RtpSenderTest, FrameCountCallbacks) { |
rtp_sender_.reset(new RTPSender( |
false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr, |
- nullptr, &callback, nullptr, nullptr, nullptr)); |
+ nullptr, &callback, nullptr, nullptr, nullptr, nullptr)); |
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
const uint8_t payload_type = 127; |
@@ -1213,30 +1213,39 @@ TEST_F(RtpSenderTest, FrameCountCallbacks) { |
TEST_F(RtpSenderTest, BitrateCallbacks) { |
class TestCallback : public BitrateStatisticsObserver { |
public: |
- TestCallback() : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0) {} |
+ TestCallback() |
+ : BitrateStatisticsObserver(), |
+ num_calls_(0), |
+ ssrc_(0), |
+ total_bitrate_(0), |
+ retransmit_bitrate_(0) {} |
virtual ~TestCallback() {} |
- void Notify(const BitrateStatistics& total_stats, |
- const BitrateStatistics& retransmit_stats, |
+ void Notify(uint32_t total_bitrate, |
+ uint32_t retransmit_bitrate, |
uint32_t ssrc) override { |
++num_calls_; |
ssrc_ = ssrc; |
- total_stats_ = total_stats; |
- retransmit_stats_ = retransmit_stats; |
+ total_bitrate_ = total_bitrate; |
+ retransmit_bitrate_ = retransmit_bitrate; |
} |
uint32_t num_calls_; |
uint32_t ssrc_; |
- BitrateStatistics total_stats_; |
- BitrateStatistics retransmit_stats_; |
+ uint32_t total_bitrate_; |
+ uint32_t retransmit_bitrate_; |
} callback; |
rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
nullptr, nullptr, &callback, nullptr, nullptr, |
- nullptr, nullptr)); |
+ nullptr, nullptr, nullptr)); |
- // Simulate kNumPackets sent with kPacketInterval ms intervals. |
- const uint32_t kNumPackets = 15; |
+ // Simulate kNumPackets sent with kPacketInterval ms intervals, with the |
+ // number of packets selected so that we fill (but don't overflow) the one |
+ // second averaging window. |
+ const uint32_t kWindowSizeMs = 1000; |
const uint32_t kPacketInterval = 20; |
+ const uint32_t kNumPackets = |
+ (kWindowSizeMs - kPacketInterval) / kPacketInterval; |
// Overhead = 12 bytes RTP header + 1 byte generic header. |
const uint32_t kPacketOverhead = 13; |
@@ -1250,7 +1259,6 @@ TEST_F(RtpSenderTest, BitrateCallbacks) { |
// Initial process call so we get a new time window. |
rtp_sender_->ProcessBitrate(); |
- uint64_t start_time = fake_clock_.CurrentNtpInMilliseconds(); |
// Send a few frames. |
for (uint32_t i = 0; i < kNumPackets; ++i) { |
@@ -1262,17 +1270,18 @@ TEST_F(RtpSenderTest, BitrateCallbacks) { |
rtp_sender_->ProcessBitrate(); |
- const uint32_t expected_packet_rate = 1000 / kPacketInterval; |
- |
// We get one call for every stats updated, thus two calls since both the |
// stream stats and the retransmit stats are updated once. |
EXPECT_EQ(2u, callback.num_calls_); |
EXPECT_EQ(ssrc, callback.ssrc_); |
- EXPECT_EQ(start_time + (kNumPackets * kPacketInterval), |
- callback.total_stats_.timestamp_ms); |
- EXPECT_EQ(expected_packet_rate, callback.total_stats_.packet_rate); |
- EXPECT_EQ((kPacketOverhead + sizeof(payload)) * 8 * expected_packet_rate, |
- callback.total_stats_.bitrate_bps); |
+ const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload); |
+ // Bitrate measured over delta between last and first timestamp, plus one. |
+ const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1; |
+ const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8; |
+ const uint32_t KexpectedRateBps = |
+ (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) / |
+ kExpectedWindowMs; |
+ EXPECT_EQ(KexpectedRateBps, callback.total_bitrate_); |
rtp_sender_.reset(); |
} |
@@ -1285,7 +1294,7 @@ class RtpSenderAudioTest : public RtpSenderTest { |
payload_ = kAudioPayload; |
rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, |
nullptr, nullptr, nullptr, nullptr, nullptr, |
- nullptr, nullptr)); |
+ nullptr, nullptr, nullptr)); |
rtp_sender_->SetSequenceNumber(kSeqNum); |
} |
}; |