/*
 *  Copyright (c) 2017 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 "webrtc/test/testsupport/fileutils.h"

namespace webrtc {
namespace test {

namespace {

// Loop variables.
const int kBitrates[] = {500};
const VideoCodecType kVideoCodecType[] = {kVideoCodecVP8};
const bool kHwCodec[] = {false};

// Codec settings.
const bool kResilienceOn = false;
const int kNumTemporalLayers = 1;
const bool kDenoisingOn = false;
const bool kErrorConcealmentOn = false;
const bool kSpatialResizeOn = false;
const bool kFrameDropperOn = false;

// Test settings.
const bool kUseSingleCore = false;
const VisualizationParams kVisualizationParams = {
    false,  // save_encoded_ivf
    false,  // save_decoded_y4m
};

const int kNumFrames = 30;

}  // namespace

// Tests for plotting statistics from logs.
class VideoProcessorIntegrationTestParameterized
    : public VideoProcessorIntegrationTest,
      public ::testing::WithParamInterface<
          ::testing::tuple<int, VideoCodecType, bool>> {
 protected:
  VideoProcessorIntegrationTestParameterized()
      : bitrate_(::testing::get<0>(GetParam())),
        codec_type_(::testing::get<1>(GetParam())),
        hw_codec_(::testing::get<2>(GetParam())) {}
  ~VideoProcessorIntegrationTestParameterized() override = default;

  void RunTest(int width,
               int height,
               int framerate,
               const std::string& filename) {
    config_.filename = filename;
    config_.input_filename = ResourcePath(filename, "yuv");
    config_.output_filename =
        TempFilename(OutputPath(), "plot_videoprocessor_integrationtest");
    config_.use_single_core = kUseSingleCore;
    config_.verbose = true;
    config_.hw_encoder = hw_codec_;
    config_.hw_decoder = hw_codec_;
    SetCodecSettings(&config_, codec_type_, kNumTemporalLayers,
                     kErrorConcealmentOn, kDenoisingOn, kFrameDropperOn,
                     kSpatialResizeOn, kResilienceOn, width, height);

    RateProfile rate_profile;
    SetRateProfile(&rate_profile,
                   0,  // update_index
                   bitrate_, framerate,
                   0);  // frame_index_rate_update
    rate_profile.frame_index_rate_update[1] = kNumFrames + 1;
    rate_profile.num_frames = kNumFrames;

    ProcessFramesAndMaybeVerify(rate_profile, nullptr, nullptr,
                                &kVisualizationParams);
  }

  const int bitrate_;
  const VideoCodecType codec_type_;
  const bool hw_codec_;
};

INSTANTIATE_TEST_CASE_P(CodecSettings,
                        VideoProcessorIntegrationTestParameterized,
                        ::testing::Combine(::testing::ValuesIn(kBitrates),
                                           ::testing::ValuesIn(kVideoCodecType),
                                           ::testing::ValuesIn(kHwCodec)));

TEST_P(VideoProcessorIntegrationTestParameterized, Process_128x96_30fps) {
  RunTest(128, 96, 30, "foreman_128x96");
}

TEST_P(VideoProcessorIntegrationTestParameterized, Process_160x120_30fps) {
  RunTest(160, 120, 30, "foreman_160x120");
}

TEST_P(VideoProcessorIntegrationTestParameterized, Process_176x144_30fps) {
  RunTest(176, 144, 30, "foreman_176x144");
}

TEST_P(VideoProcessorIntegrationTestParameterized, Process_320x240_30fps) {
  RunTest(320, 240, 30, "foreman_320x240");
}

TEST_P(VideoProcessorIntegrationTestParameterized, Process_352x288_30fps) {
  RunTest(352, 288, 30, "foreman_cif");
}

}  // namespace test
}  // namespace webrtc
