Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index 8e3105f7411d9af37012cb7ea6635ef7edf4b79a..21a6654a833a88398fe886aafcafba737b3b9b3a 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -26,6 +26,7 @@ |
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
#include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
+#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
#include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
@@ -1527,7 +1528,8 @@ class TransportFeedbackTester : public test::EndToEndTest { |
: EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs), |
feedback_enabled_(feedback_enabled), |
num_video_streams_(num_video_streams), |
- num_audio_streams_(num_audio_streams) { |
+ num_audio_streams_(num_audio_streams), |
+ receiver_call_(nullptr) { |
// Only one stream of each supported for now. |
EXPECT_LE(num_video_streams, 1u); |
EXPECT_LE(num_audio_streams, 1u); |
@@ -2539,6 +2541,16 @@ TEST_F(EndToEndTest, GetStats) { |
private: |
Action OnSendRtp(const uint8_t* packet, size_t length) override { |
+ // Drop every 25th packet => 4% loss. |
+ static const int kPacketLossFrac = 25; |
+ RTPHeader header; |
+ RtpUtility::RtpHeaderParser parser(packet, length); |
+ if (parser.Parse(&header) && |
+ expected_send_ssrcs_.find(header.ssrc) != |
+ expected_send_ssrcs_.end() && |
+ header.sequenceNumber % kPacketLossFrac == 0) { |
+ return DROP_PACKET; |
+ } |
check_stats_event_.Set(); |
return SEND_PACKET; |
} |
@@ -2639,8 +2651,8 @@ TEST_F(EndToEndTest, GetStats) { |
for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it = |
stats.substreams.begin(); |
it != stats.substreams.end(); ++it) { |
- EXPECT_TRUE(expected_send_ssrcs_.find(it->first) != |
- expected_send_ssrcs_.end()); |
+ if (expected_send_ssrcs_.find(it->first) == expected_send_ssrcs_.end()) |
+ continue; // Probably RTX. |
send_stats_filled_[CompoundKey("CapturedFrameRate", it->first)] |= |
stats.input_frame_rate != 0; |
@@ -2658,10 +2670,14 @@ TEST_F(EndToEndTest, GetStats) { |
stream_stats.rtp_stats.retransmitted.packets != 0 || |
stream_stats.rtp_stats.transmitted.packets != 0; |
- send_stats_filled_[CompoundKey("BitrateStatisticsObserver", |
+ send_stats_filled_[CompoundKey("BitrateStatisticsObserver.Total", |
it->first)] |= |
stream_stats.total_bitrate_bps != 0; |
+ send_stats_filled_[CompoundKey("BitrateStatisticsObserver.Retransmit", |
+ it->first)] |= |
+ stream_stats.retransmit_bitrate_bps != 0; |
+ |
send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |= |
stream_stats.frame_counts.delta_frames != 0 || |
stream_stats.frame_counts.key_frames != 0; |
@@ -2692,10 +2708,8 @@ TEST_F(EndToEndTest, GetStats) { |
} |
bool AllStatsFilled(const std::map<std::string, bool>& stats_map) { |
- for (std::map<std::string, bool>::const_iterator it = stats_map.begin(); |
- it != stats_map.end(); |
- ++it) { |
- if (!it->second) |
+ for (const auto& stat : stats_map) { |
+ if (!stat.second) |
return false; |
} |
return true; |
@@ -2718,9 +2732,18 @@ TEST_F(EndToEndTest, GetStats) { |
VideoSendStream::Config* send_config, |
std::vector<VideoReceiveStream::Config>* receive_configs, |
VideoEncoderConfig* encoder_config) override { |
+ // Set low rates to avoid waiting for rampup. |
+ for (size_t i = 0; i < encoder_config->streams.size(); ++i) { |
+ encoder_config->streams[i].min_bitrate_bps = 10000; |
+ encoder_config->streams[i].target_bitrate_bps = 15000; |
+ encoder_config->streams[i].max_bitrate_bps = 20000; |
+ } |
send_config->pre_encode_callback = this; // Used to inject delay. |
expected_cname_ = send_config->rtp.c_name = "SomeCName"; |
+ send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
+ send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
+ |
const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs; |
for (size_t i = 0; i < ssrcs.size(); ++i) { |
expected_send_ssrcs_.insert(ssrcs[i]); |
@@ -2728,7 +2751,17 @@ TEST_F(EndToEndTest, GetStats) { |
(*receive_configs)[i].rtp.remote_ssrc); |
(*receive_configs)[i].render_delay_ms = kExpectedRenderDelayMs; |
(*receive_configs)[i].renderer = &receive_stream_renderer_; |
+ (*receive_configs)[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
+ |
+ (*receive_configs)[i].rtp.rtx[kFakeVideoSendPayloadType].ssrc = |
+ kSendRtxSsrcs[i]; |
+ (*receive_configs)[i].rtp.rtx[kFakeVideoSendPayloadType].payload_type = |
+ kSendRtxPayloadType; |
} |
+ |
+ for (size_t i = 0; i < kNumSsrcs; ++i) |
+ send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); |
+ |
// Use a delayed encoder to make sure we see CpuOveruseMetrics stats that |
// are non-zero. |
send_config->encoder_settings.encoder = &encoder_; |