/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h"

#include <vector>

#include "webrtc/test/testsupport/fileutils.h"

namespace webrtc {
namespace test {

namespace {

// Codec settings.
const bool kResilienceOn = true;
const int kCifWidth = 352;
const int kCifHeight = 288;
#if !defined(WEBRTC_IOS)
const int kNumFramesShort = 100;
#endif
const int kNumFramesLong = 300;

const std::nullptr_t kNoVisualizationParams = nullptr;

}  // namespace

class VideoProcessorIntegrationTestLibvpx
    : public VideoProcessorIntegrationTest {
 protected:
  VideoProcessorIntegrationTestLibvpx() {
    config_.filename = "foreman_cif";
    config_.input_filename = ResourcePath(config_.filename, "yuv");
    config_.output_filename =
        TempFilename(OutputPath(), "videoprocessor_integrationtest_libvpx");
    config_.networking_config.packet_loss_probability = 0.0;
    // Only allow encoder/decoder to use single core, for predictability.
    config_.use_single_core = true;
    config_.verbose = false;
    config_.hw_encoder = false;
    config_.hw_decoder = false;
  }
};

// Fails on iOS. See webrtc:4755.
#if !defined(WEBRTC_IOS)

#if !defined(RTC_DISABLE_VP9)
// VP9: Run with no packet loss and fixed bitrate. Quality should be very high.
// One key frame (first frame only) in sequence.
TEST_F(VideoProcessorIntegrationTestLibvpx, Process0PercentPacketLossVP9) {
  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 500, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
  rate_profile.num_frames = kNumFramesShort;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(37.0, 36.0, 0.93, 0.92);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP9: Run with 5% packet loss and fixed bitrate. Quality should be a bit
// lower. One key frame (first frame only) in sequence.
TEST_F(VideoProcessorIntegrationTestLibvpx, Process5PercentPacketLossVP9) {
  config_.networking_config.packet_loss_probability = 0.05f;
  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 500, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
  rate_profile.num_frames = kNumFramesShort;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(17.0, 14.0, 0.45, 0.36);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP9: Run with no packet loss, with varying bitrate (3 rate updates):
// low to high to medium. Check that quality and encoder response to the new
// target rate/per-frame bandwidth (for each rate update) is within limits.
// One key frame (first frame only) in sequence.
TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessNoLossChangeBitRateVP9) {
  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 200, 30, 0);
  SetRateProfile(&rate_profile, 1, 700, 30, 100);
  SetRateProfile(&rate_profile, 2, 500, 30, 200);
  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
  rate_profile.num_frames = kNumFramesLong;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 30, 20, 20, 35, 0, 1, &rc_thresholds);
  AddRateControlThresholds(2, 0, 20, 20, 60, 0, 0, &rc_thresholds);
  AddRateControlThresholds(0, 0, 25, 20, 40, 0, 0, &rc_thresholds);

  QualityThresholds quality_thresholds(35.5, 30.0, 0.90, 0.85);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP9: Run with no packet loss, with an update (decrease) in frame rate.
// Lower frame rate means higher per-frame-bandwidth, so easier to encode.
// At the low bitrate in this test, this means better rate control after the
// update(s) to lower frame rate. So expect less frame drops, and max values
// for the rate control metrics can be lower. One key frame (first frame only).
// Note: quality after update should be higher but we currently compute quality
// metrics averaged over whole sequence run.
TEST_F(VideoProcessorIntegrationTestLibvpx,
       ProcessNoLossChangeFrameRateFrameDropVP9) {
  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 100, 24, 0);
  SetRateProfile(&rate_profile, 1, 100, 15, 100);
  SetRateProfile(&rate_profile, 2, 100, 10, 200);
  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
  rate_profile.num_frames = kNumFramesLong;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(45, 50, 95, 15, 45, 0, 1, &rc_thresholds);
  AddRateControlThresholds(20, 0, 50, 10, 30, 0, 0, &rc_thresholds);
  AddRateControlThresholds(5, 0, 30, 5, 25, 0, 0, &rc_thresholds);

  QualityThresholds quality_thresholds(31.5, 18.0, 0.80, 0.43);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP9: Run with no packet loss and denoiser on. One key frame (first frame).
TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessNoLossDenoiserOnVP9) {
  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 500, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
  rate_profile.num_frames = kNumFramesShort;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(36.8, 35.8, 0.92, 0.91);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// Run with no packet loss, at low bitrate.
// spatial_resize is on, for this low bitrate expect one resize in sequence.
// Resize happens on delta frame. Expect only one key frame (first frame).
TEST_F(VideoProcessorIntegrationTestLibvpx,
       DISABLED_ProcessNoLossSpatialResizeFrameDropVP9) {
  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, true,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 50, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesLong + 1;
  rate_profile.num_frames = kNumFramesLong;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(228, 70, 160, 15, 80, 1, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(24.0, 13.0, 0.65, 0.37);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// TODO(marpan): Add temporal layer test for VP9, once changes are in
// vp9 wrapper for this.

#endif  // !defined(RTC_DISABLE_VP9)

// VP8: Run with no packet loss and fixed bitrate. Quality should be very high.
// One key frame (first frame only) in sequence. Setting |key_frame_interval|
// to -1 below means no periodic key frames in test.
TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessZeroPacketLoss) {
  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 500, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
  rate_profile.num_frames = kNumFramesShort;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(34.95, 33.0, 0.90, 0.89);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP8: Run with 5% packet loss and fixed bitrate. Quality should be a bit
// lower. One key frame (first frame only) in sequence.
TEST_F(VideoProcessorIntegrationTestLibvpx, Process5PercentPacketLoss) {
  config_.networking_config.packet_loss_probability = 0.05f;
  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 500, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
  rate_profile.num_frames = kNumFramesShort;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(20.0, 16.0, 0.60, 0.40);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP8: Run with 10% packet loss and fixed bitrate. Quality should be lower.
// One key frame (first frame only) in sequence.
TEST_F(VideoProcessorIntegrationTestLibvpx, Process10PercentPacketLoss) {
  config_.networking_config.packet_loss_probability = 0.1f;
  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 500, 30, 0);
  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
  rate_profile.num_frames = kNumFramesShort;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);

  QualityThresholds quality_thresholds(19.0, 16.0, 0.50, 0.35);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

#endif  // !defined(WEBRTC_IOS)

// The tests below are currently disabled for Android. For ARM, the encoder
// uses |cpu_speed| = 12, as opposed to default |cpu_speed| <= 6 for x86,
// which leads to significantly different quality. The quality and rate control
// settings in the tests below are defined for encoder speed setting
// |cpu_speed| <= ~6. A number of settings would need to be significantly
// modified for the |cpu_speed| = 12 case. For now, keep the tests below
// disabled on Android. Some quality parameter in the above test has been
// adjusted to also pass for |cpu_speed| <= 12.

// VP8: Run with no packet loss, with varying bitrate (3 rate updates):
// low to high to medium. Check that quality and encoder response to the new
// target rate/per-frame bandwidth (for each rate update) is within limits.
// One key frame (first frame only) in sequence.
// Too slow to finish before timeout on iOS. See webrtc:4755.
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
#define MAYBE_ProcessNoLossChangeBitRateVP8 \
  DISABLED_ProcessNoLossChangeBitRateVP8
#else
#define MAYBE_ProcessNoLossChangeBitRateVP8 ProcessNoLossChangeBitRateVP8
#endif
TEST_F(VideoProcessorIntegrationTestLibvpx,
       MAYBE_ProcessNoLossChangeBitRateVP8) {
  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 200, 30, 0);
  SetRateProfile(&rate_profile, 1, 800, 30, 100);
  SetRateProfile(&rate_profile, 2, 500, 30, 200);
  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
  rate_profile.num_frames = kNumFramesLong;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 45, 20, 10, 15, 0, 1, &rc_thresholds);
  AddRateControlThresholds(0, 0, 25, 20, 10, 0, 0, &rc_thresholds);
  AddRateControlThresholds(0, 0, 25, 15, 10, 0, 0, &rc_thresholds);

  QualityThresholds quality_thresholds(34.0, 32.0, 0.85, 0.80);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP8: Run with no packet loss, with an update (decrease) in frame rate.
// Lower frame rate means higher per-frame-bandwidth, so easier to encode.
// At the bitrate in this test, this means better rate control after the
// update(s) to lower frame rate. So expect less frame drops, and max values
// for the rate control metrics can be lower. One key frame (first frame only).
// Note: quality after update should be higher but we currently compute quality
// metrics averaged over whole sequence run.
// Too slow to finish before timeout on iOS. See webrtc:4755.
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
#define MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8 \
  DISABLED_ProcessNoLossChangeFrameRateFrameDropVP8
#else
#define MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8 \
  ProcessNoLossChangeFrameRateFrameDropVP8
#endif
TEST_F(VideoProcessorIntegrationTestLibvpx,
       MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8) {
  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 80, 24, 0);
  SetRateProfile(&rate_profile, 1, 80, 15, 100);
  SetRateProfile(&rate_profile, 2, 80, 10, 200);
  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
  rate_profile.num_frames = kNumFramesLong;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(40, 20, 75, 15, 60, 0, 1, &rc_thresholds);
  AddRateControlThresholds(10, 0, 25, 10, 35, 0, 0, &rc_thresholds);
  AddRateControlThresholds(0, 0, 20, 10, 15, 0, 0, &rc_thresholds);

  QualityThresholds quality_thresholds(31.0, 22.0, 0.80, 0.65);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

// VP8: Run with no packet loss, with 3 temporal layers, with a rate update in
// the middle of the sequence. The max values for the frame size mismatch and
// encoding rate mismatch are applied to each layer.
// No dropped frames in this test, and internal spatial resizer is off.
// One key frame (first frame only) in sequence, so no spatial resizing.
// Too slow to finish before timeout on iOS. See webrtc:4755.
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
#define MAYBE_ProcessNoLossTemporalLayersVP8 \
  DISABLED_ProcessNoLossTemporalLayersVP8
#else
#define MAYBE_ProcessNoLossTemporalLayersVP8 ProcessNoLossTemporalLayersVP8
#endif
TEST_F(VideoProcessorIntegrationTestLibvpx,
       MAYBE_ProcessNoLossTemporalLayersVP8) {
  SetCodecSettings(&config_, kVideoCodecVP8, 3, false, true, true, false,
                   kResilienceOn, kCifWidth, kCifHeight);

  RateProfile rate_profile;
  SetRateProfile(&rate_profile, 0, 200, 30, 0);
  SetRateProfile(&rate_profile, 1, 400, 30, 150);
  rate_profile.frame_index_rate_update[2] = kNumFramesLong + 1;
  rate_profile.num_frames = kNumFramesLong;

  std::vector<RateControlThresholds> rc_thresholds;
  AddRateControlThresholds(0, 20, 30, 10, 10, 0, 1, &rc_thresholds);
  AddRateControlThresholds(0, 0, 30, 15, 10, 0, 0, &rc_thresholds);

  QualityThresholds quality_thresholds(32.5, 30.0, 0.85, 0.80);

  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
                              kNoVisualizationParams);
}

}  // namespace test
}  // namespace webrtc
