| 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 e5b12ce0b1e96027dfac849543c2965303307bca..d788b3536b8b9df6f4eccd4359147157fa2198e2 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);
 | 
| @@ -2522,6 +2524,15 @@ TEST_F(EndToEndTest, GetStats) {
 | 
|  
 | 
|     private:
 | 
|      Action OnSendRtp(const uint8_t* packet, size_t length) override {
 | 
| +      const int kPacketLossFrac = 25;  // Drop every 25th packet => 4% loss.
 | 
| +      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;
 | 
|      }
 | 
| @@ -2622,8 +2633,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;
 | 
| @@ -2641,10 +2652,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;
 | 
| @@ -2675,10 +2690,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;
 | 
| @@ -2701,9 +2714,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]);
 | 
| @@ -2711,7 +2733,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_;
 | 
| 
 |