| Index: webrtc/video/video_send_stream_tests.cc
 | 
| diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
 | 
| index 2663516b6bfe9074e9a69a7c0533a4cd8afad9c1..9d00e007de2f15427e1e3c0c07f13e27c3f40709 100644
 | 
| --- a/webrtc/video/video_send_stream_tests.cc
 | 
| +++ b/webrtc/video/video_send_stream_tests.cc
 | 
| @@ -1785,9 +1785,12 @@
 | 
|  
 | 
|      void PerformTest() override {
 | 
|        EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
 | 
| -      EXPECT_EQ(0u, num_releases());
 | 
| +      // Expect  |num_releases| == 1 since the encoder has been reconfigured
 | 
| +      // once when the first frame is encoded. Not until at that point is the
 | 
| +      // frame size known and the encoder can be properly initialized.
 | 
| +      EXPECT_EQ(1u, num_releases());
 | 
|        stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
 | 
| -      EXPECT_EQ(0u, num_releases());
 | 
| +      EXPECT_EQ(1u, num_releases());
 | 
|        stream_->Stop();
 | 
|        // Encoder should not be released before destroying the VideoSendStream.
 | 
|        EXPECT_FALSE(IsReleased());
 | 
| @@ -1809,7 +1812,7 @@
 | 
|    RunBaseTest(&test_encoder);
 | 
|  
 | 
|    EXPECT_TRUE(test_encoder.IsReleased());
 | 
| -  EXPECT_EQ(1u, test_encoder.num_releases());
 | 
| +  EXPECT_EQ(2u, test_encoder.num_releases());
 | 
|  }
 | 
|  
 | 
|  TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) {
 | 
| @@ -1841,7 +1844,7 @@
 | 
|      int32_t InitEncode(const VideoCodec* config,
 | 
|                         int32_t number_of_cores,
 | 
|                         size_t max_payload_size) override {
 | 
| -      if (num_initializations_ == 0) {
 | 
| +      if (num_initializations_ < 2) {
 | 
|          // Verify default values.
 | 
|          EXPECT_EQ(kRealtimeVideo, config->mode);
 | 
|        } else {
 | 
| @@ -1849,18 +1852,23 @@
 | 
|          EXPECT_EQ(kScreensharing, config->mode);
 | 
|        }
 | 
|        ++num_initializations_;
 | 
| -      init_encode_event_.Set();
 | 
| +      if (num_initializations_ > 1) {
 | 
| +        // Skip the first two InitEncode events: one with QCIF resolution when
 | 
| +        // the SendStream is created, the other with QVGA when the first frame
 | 
| +        // is encoded.
 | 
| +        init_encode_event_.Set();
 | 
| +      }
 | 
|        return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
 | 
|      }
 | 
|  
 | 
|      void PerformTest() override {
 | 
|        EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs));
 | 
| -      EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
 | 
| +      EXPECT_EQ(2u, num_initializations_) << "VideoEncoder not initialized.";
 | 
|  
 | 
|        encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
 | 
|        stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
 | 
|        EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs));
 | 
| -      EXPECT_EQ(2u, num_initializations_)
 | 
| +      EXPECT_EQ(3u, num_initializations_)
 | 
|            << "ReconfigureVideoEncoder did not reinitialize the encoder with "
 | 
|               "new encoder settings.";
 | 
|      }
 | 
| @@ -1937,7 +1945,12 @@
 | 
|      EXPECT_EQ(video_codec_type_, config->codecType);
 | 
|      VerifyCodecSpecifics(*config);
 | 
|      ++num_initializations_;
 | 
| -    init_encode_event_.Set();
 | 
| +    if (num_initializations_ > 1) {
 | 
| +      // Skip the first two InitEncode events: one with QCIF resolution when
 | 
| +      // the SendStream is created, the other with QVGA when the first frame is
 | 
| +      // encoded.
 | 
| +      init_encode_event_.Set();
 | 
| +    }
 | 
|      return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
 | 
|    }
 | 
|  
 | 
| @@ -1948,14 +1961,14 @@
 | 
|    void PerformTest() override {
 | 
|      EXPECT_TRUE(
 | 
|          init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
 | 
| -    ASSERT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
 | 
| +    ASSERT_EQ(2u, num_initializations_) << "VideoEncoder not initialized.";
 | 
|  
 | 
|      encoder_settings_.frameDroppingOn = true;
 | 
|      encoder_config_.encoder_specific_settings = GetEncoderSpecificSettings();
 | 
|      stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
 | 
|      ASSERT_TRUE(
 | 
|          init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
 | 
| -    EXPECT_EQ(2u, num_initializations_)
 | 
| +    EXPECT_EQ(3u, num_initializations_)
 | 
|          << "ReconfigureVideoEncoder did not reinitialize the encoder with "
 | 
|             "new encoder settings.";
 | 
|    }
 | 
| @@ -2202,7 +2215,8 @@
 | 
|                         size_t maxPayloadSize) override {
 | 
|        EXPECT_GE(codecSettings->startBitrate, codecSettings->minBitrate);
 | 
|        EXPECT_LE(codecSettings->startBitrate, codecSettings->maxBitrate);
 | 
| -      if (num_initializations_ == 0) {
 | 
| +      // First reinitialization happens due to that the frame size is updated.
 | 
| +      if (num_initializations_ == 0 || num_initializations_ == 1) {
 | 
|          EXPECT_EQ(static_cast<unsigned int>(kMinBitrateKbps),
 | 
|                    codecSettings->minBitrate);
 | 
|          EXPECT_EQ(static_cast<unsigned int>(kStartBitrateKbps),
 | 
| @@ -2210,14 +2224,14 @@
 | 
|          EXPECT_EQ(static_cast<unsigned int>(kMaxBitrateKbps),
 | 
|                    codecSettings->maxBitrate);
 | 
|          observation_complete_.Set();
 | 
| -      } else if (num_initializations_ == 1) {
 | 
| +      } else if (num_initializations_ == 2) {
 | 
|          EXPECT_EQ(static_cast<unsigned int>(kLowerMaxBitrateKbps),
 | 
|                    codecSettings->maxBitrate);
 | 
|          // The start bitrate should be kept (-1) and capped to the max bitrate.
 | 
|          // Since this is not an end-to-end call no receiver should have been
 | 
|          // returning a REMB that could lower this estimate.
 | 
|          EXPECT_EQ(codecSettings->startBitrate, codecSettings->maxBitrate);
 | 
| -      } else if (num_initializations_ == 2) {
 | 
| +      } else if (num_initializations_ == 3) {
 | 
|          EXPECT_EQ(static_cast<unsigned int>(kIncreasedMaxBitrateKbps),
 | 
|                    codecSettings->maxBitrate);
 | 
|          // The start bitrate will be whatever the rate BitRateController
 | 
| @@ -2225,8 +2239,9 @@
 | 
|          // bitrate.
 | 
|        }
 | 
|        ++num_initializations_;
 | 
| -      init_encode_event_.Set();
 | 
| -
 | 
| +      if (num_initializations_ > 1) {
 | 
| +        init_encode_event_.Set();
 | 
| +      }
 | 
|        return FakeEncoder::InitEncode(codecSettings, numberOfCores,
 | 
|                                       maxPayloadSize);
 | 
|      }
 | 
| @@ -2319,7 +2334,7 @@
 | 
|        send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
 | 
|        ASSERT_TRUE(
 | 
|            init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
 | 
| -      EXPECT_EQ(2, num_initializations_)
 | 
| +      EXPECT_EQ(3, num_initializations_)
 | 
|            << "Encoder should have been reconfigured with the new value.";
 | 
|        WaitForSetRates(kLowerMaxBitrateKbps);
 | 
|  
 | 
| @@ -2327,7 +2342,7 @@
 | 
|        send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
 | 
|        ASSERT_TRUE(
 | 
|            init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
 | 
| -      EXPECT_EQ(3, num_initializations_)
 | 
| +      EXPECT_EQ(4, num_initializations_)
 | 
|            << "Encoder should have been reconfigured with the new value.";
 | 
|        // Expected target bitrate is the start bitrate set in the call to
 | 
|        // call_->SetBitrateConfig.
 | 
| 
 |