| Index: webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
 | 
| diff --git a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
 | 
| index 6c0e1254fcaded68b1259d844dfcbd31d480886d..5f187563655cc845d638884310a6274086fbf24d 100644
 | 
| --- a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
 | 
| +++ b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
 | 
| @@ -78,6 +78,7 @@ struct RateControlMetrics {
 | 
|    int max_encoding_rate_mismatch;
 | 
|    int max_time_hit_target;
 | 
|    int num_spatial_resizes;
 | 
| +  int num_key_frames;
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -208,6 +209,8 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|             num_temporal_layers_;
 | 
|         config_.codec_settings->codecSpecific.VP9.frameDroppingOn =
 | 
|             frame_dropper_on_;
 | 
| +       config_.codec_settings->codecSpecific.VP9.automaticResizeOn =
 | 
| +           spatial_resize_on_;
 | 
|         config_.codec_settings->codecSpecific.VP9.keyFrameInterval =
 | 
|             kBaseKeyFrameInterval;
 | 
|         break;
 | 
| @@ -307,7 +310,8 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|                           int max_encoding_rate_mismatch,
 | 
|                           int max_time_hit_target,
 | 
|                           int max_num_dropped_frames,
 | 
| -                         int num_spatial_resizes) {
 | 
| +                         int num_spatial_resizes,
 | 
| +                         int num_key_frames) {
 | 
|      int num_dropped_frames = processor_->NumberDroppedFrames();
 | 
|      int num_resize_actions = processor_->NumberSpatialResizes();
 | 
|      printf("For update #: %d,\n "
 | 
| @@ -354,6 +358,7 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|      EXPECT_LE(num_frames_to_hit_target_, max_time_hit_target);
 | 
|      EXPECT_LE(num_dropped_frames, max_num_dropped_frames);
 | 
|      EXPECT_EQ(num_resize_actions, num_spatial_resizes);
 | 
| +    EXPECT_EQ(num_key_frames_, num_key_frames);
 | 
|    }
 | 
|  
 | 
|    // Layer index corresponding to frame number, for up to 3 layers.
 | 
| @@ -406,15 +411,6 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  VideoFrameType FrameType(int frame_number) {
 | 
| -    if (frame_number == 0 || ((frame_number) % key_frame_interval_ == 0 &&
 | 
| -        key_frame_interval_ > 0)) {
 | 
| -      return kKeyFrame;
 | 
| -    } else {
 | 
| -      return kDeltaFrame;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
|    void TearDown() {
 | 
|      delete processor_;
 | 
|      delete packet_manipulator_;
 | 
| @@ -459,7 +455,8 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|          frame_number < num_frames) {
 | 
|        // Get the layer index for the frame |frame_number|.
 | 
|        LayerIndexForFrame(frame_number);
 | 
| -      frame_type = FrameType(frame_number);
 | 
| +      // Get the frame_type.
 | 
| +      frame_type = processor_->EncodedFrameType();
 | 
|        // Counter for whole sequence run.
 | 
|        ++frame_number;
 | 
|        // Counters for each rate update.
 | 
| @@ -477,7 +474,8 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|              rc_metrics[update_index].max_encoding_rate_mismatch,
 | 
|              rc_metrics[update_index].max_time_hit_target,
 | 
|              rc_metrics[update_index].max_num_dropped_frames,
 | 
| -            rc_metrics[update_index].num_spatial_resizes);
 | 
| +            rc_metrics[update_index].num_spatial_resizes,
 | 
| +            rc_metrics[update_index].num_key_frames);
 | 
|          // Update layer rates and the codec with new rates.
 | 
|          ++update_index;
 | 
|          bit_rate_ =  rate_profile.target_bit_rate[update_index];
 | 
| @@ -495,7 +493,8 @@ class VideoProcessorIntegrationTest: public testing::Test {
 | 
|          rc_metrics[update_index].max_encoding_rate_mismatch,
 | 
|          rc_metrics[update_index].max_time_hit_target,
 | 
|          rc_metrics[update_index].max_num_dropped_frames,
 | 
| -        rc_metrics[update_index].num_spatial_resizes);
 | 
| +        rc_metrics[update_index].num_spatial_resizes,
 | 
| +        rc_metrics[update_index].num_key_frames);
 | 
|      EXPECT_EQ(num_frames, frame_number);
 | 
|      EXPECT_EQ(num_frames + 1, static_cast<int>(stats_.stats_.size()));
 | 
|  
 | 
| @@ -576,7 +575,8 @@ void SetRateControlMetrics(RateControlMetrics* rc_metrics,
 | 
|                             int max_delta_frame_size_mismatch,
 | 
|                             int max_encoding_rate_mismatch,
 | 
|                             int max_time_hit_target,
 | 
| -                           int num_spatial_resizes) {
 | 
| +                           int num_spatial_resizes,
 | 
| +                           int num_key_frames) {
 | 
|    rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames;
 | 
|    rc_metrics[update_index].max_key_frame_size_mismatch =
 | 
|        max_key_frame_size_mismatch;
 | 
| @@ -586,6 +586,7 @@ void SetRateControlMetrics(RateControlMetrics* rc_metrics,
 | 
|        max_encoding_rate_mismatch;
 | 
|    rc_metrics[update_index].max_time_hit_target = max_time_hit_target;
 | 
|    rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes;
 | 
| +  rc_metrics[update_index].num_key_frames = num_key_frames;
 | 
|  }
 | 
|  
 | 
|  // VP9: Run with no packet loss and fixed bitrate. Quality should be very high.
 | 
| @@ -606,7 +607,7 @@ TEST_F(VideoProcessorIntegrationTest, Process0PercentPacketLossVP9) {
 | 
|    SetQualityMetrics(&quality_metrics, 37.0, 36.0, 0.93, 0.92);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0, 1);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -630,7 +631,7 @@ TEST_F(VideoProcessorIntegrationTest, Process5PercentPacketLossVP9) {
 | 
|    SetQualityMetrics(&quality_metrics, 17.0, 14.0, 0.45, 0.36);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0, 1);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -659,9 +660,9 @@ TEST_F(VideoProcessorIntegrationTest, ProcessNoLossChangeBitRateVP9) {
 | 
|    SetQualityMetrics(&quality_metrics, 35.9, 30.0, 0.90, 0.85);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[3];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 30, 20, 20, 30, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 1, 2, 0, 20, 20, 60, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 2, 0, 0, 25, 20, 40, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 30, 20, 20, 30, 0, 1);
 | 
| +  SetRateControlMetrics(rc_metrics, 1, 2, 0, 20, 20, 60, 0, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 2, 0, 0, 25, 20, 40, 0, 0);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -694,9 +695,9 @@ TEST_F(VideoProcessorIntegrationTest,
 | 
|    SetQualityMetrics(&quality_metrics, 31.5, 18.0, 0.80, 0.44);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[3];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 35, 50, 70, 15, 45, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 1, 10, 0, 40, 10, 30, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 2, 5, 0, 30, 5, 20, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 35, 50, 70, 15, 45, 0, 1);
 | 
| +  SetRateControlMetrics(rc_metrics, 1, 10, 0, 40, 10, 30, 0, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 2, 5, 0, 30, 5, 20, 0, 0);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -719,7 +720,33 @@ TEST_F(VideoProcessorIntegrationTest, ProcessNoLossDenoiserOnVP9) {
 | 
|    SetQualityMetrics(&quality_metrics, 36.8, 35.8, 0.92, 0.91);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0, 1);
 | 
| +  ProcessFramesAndVerify(quality_metrics,
 | 
| +                         rate_profile,
 | 
| +                         process_settings,
 | 
| +                         rc_metrics);
 | 
| +}
 | 
| +
 | 
| +// Run with no packet loss, at low bitrate.
 | 
| +// spatial_resize is on, so expect one resize during the sequence,
 | 
| +// resize happens on delta frame. Expect only one key frame (first frame).
 | 
| +TEST_F(VideoProcessorIntegrationTest, ProcessNoLossSpatialResizeFrameDropVP9) {
 | 
| +  config_.networking_config.packet_loss_probability = 0;
 | 
| +  // Bitrate and frame rate profile.
 | 
| +  RateProfile rate_profile;
 | 
| +  SetRateProfilePars(&rate_profile, 0, 50, 30, 0);
 | 
| +  rate_profile.frame_index_rate_update[1] = kNbrFramesLong + 1;
 | 
| +  rate_profile.num_frames = kNbrFramesLong;
 | 
| +  // Codec/network settings.
 | 
| +  CodecConfigPars process_settings;
 | 
| +  SetCodecParameters(&process_settings, kVideoCodecVP9, 0.0f, -1,
 | 
| +                     1, false, false, true, true);
 | 
| +  // Metrics for expected quality.
 | 
| +  QualityMetrics quality_metrics;
 | 
| +  SetQualityMetrics(&quality_metrics, 25.0, 13.0, 0.70, 0.40);
 | 
| +  // Metrics for rate control.
 | 
| +  RateControlMetrics rc_metrics[1];
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 160, 70, 120, 10, 80, 1, 1);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -747,7 +774,7 @@ TEST_F(VideoProcessorIntegrationTest, ProcessZeroPacketLoss) {
 | 
|    SetQualityMetrics(&quality_metrics, 34.95, 33.0, 0.90, 0.89);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0, 1);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -771,7 +798,7 @@ TEST_F(VideoProcessorIntegrationTest, Process5PercentPacketLoss) {
 | 
|    SetQualityMetrics(&quality_metrics, 20.0, 16.0, 0.60, 0.40);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0, 1);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -795,7 +822,7 @@ TEST_F(VideoProcessorIntegrationTest, Process10PercentPacketLoss) {
 | 
|    SetQualityMetrics(&quality_metrics, 19.0, 16.0, 0.50, 0.35);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0, 1);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -833,9 +860,9 @@ TEST_F(VideoProcessorIntegrationTest,
 | 
|    SetQualityMetrics(&quality_metrics, 34.0, 32.0, 0.85, 0.80);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[3];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 45, 20, 10, 15, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 1, 0, 0, 25, 20, 10, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 2, 0, 0, 25, 15, 10, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 45, 20, 10, 15, 0, 1);
 | 
| +  SetRateControlMetrics(rc_metrics, 1, 0, 0, 25, 20, 10, 0, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 2, 0, 0, 25, 15, 10, 0, 0);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -868,9 +895,9 @@ TEST_F(VideoProcessorIntegrationTest,
 | 
|    SetQualityMetrics(&quality_metrics, 31.0, 22.0, 0.80, 0.65);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[3];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 40, 20, 75, 15, 60, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 1, 10, 0, 25, 10, 35, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 2, 0, 0, 20, 10, 15, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 40, 20, 75, 15, 60, 0, 1);
 | 
| +  SetRateControlMetrics(rc_metrics, 1, 10, 0, 25, 10, 35, 0, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 2, 0, 0, 20, 10, 15, 0, 0);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -878,7 +905,7 @@ TEST_F(VideoProcessorIntegrationTest,
 | 
|  }
 | 
|  
 | 
|  // Run with no packet loss, at low bitrate. During this time we should've
 | 
| -// resized once.
 | 
| +// resized once. Expect 2 key frames generated (first and one for resize).
 | 
|  TEST_F(VideoProcessorIntegrationTest,
 | 
|         DISABLED_ON_ANDROID(ProcessNoLossSpatialResizeFrameDropVP8)) {
 | 
|    config_.networking_config.packet_loss_probability = 0;
 | 
| @@ -889,14 +916,14 @@ TEST_F(VideoProcessorIntegrationTest,
 | 
|    rate_profile.num_frames = kNbrFramesLong;
 | 
|    // Codec/network settings.
 | 
|    CodecConfigPars process_settings;
 | 
| -  SetCodecParameters(&process_settings, kVideoCodecVP8, 0.0f, kNbrFramesLong,
 | 
| +  SetCodecParameters(&process_settings, kVideoCodecVP8, 0.0f, -1,
 | 
|                       1, false, true, true, true);
 | 
|    // Metrics for expected quality.
 | 
|    QualityMetrics quality_metrics;
 | 
|    SetQualityMetrics(&quality_metrics, 25.0, 15.0, 0.70, 0.40);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[1];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 160, 60, 120, 20, 70, 1);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 160, 60, 120, 20, 70, 1, 2);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| @@ -926,8 +953,8 @@ TEST_F(VideoProcessorIntegrationTest,
 | 
|    SetQualityMetrics(&quality_metrics, 32.5, 30.0, 0.85, 0.80);
 | 
|    // Metrics for rate control.
 | 
|    RateControlMetrics rc_metrics[2];
 | 
| -  SetRateControlMetrics(rc_metrics, 0, 0, 20, 30, 10, 10, 0);
 | 
| -  SetRateControlMetrics(rc_metrics, 1, 0, 0, 30, 15, 10, 0);
 | 
| +  SetRateControlMetrics(rc_metrics, 0, 0, 20, 30, 10, 10, 0, 1);
 | 
| +  SetRateControlMetrics(rc_metrics, 1, 0, 0, 30, 15, 10, 0, 0);
 | 
|    ProcessFramesAndVerify(quality_metrics,
 | 
|                           rate_profile,
 | 
|                           process_settings,
 | 
| 
 |