/*
 *  Copyright (c) 2014 The WebM 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 "third_party/googletest/src/include/gtest/gtest.h"
#include "./vpx_config.h"
#include "./vpx_version.h"
#include "test/codec_factory.h"
#include "test/encode_test_driver.h"
#include "test/i420_video_source.h"
#include "test/util.h"
#include "test/y4m_video_source.h"
#include "vpx_ports/vpx_timer.h"

namespace {

const int kMaxPsnr = 100;
const double kUsecsInSec = 1000000.0;

struct EncodePerfTestVideo {
  EncodePerfTestVideo(const char *name_, uint32_t width_, uint32_t height_,
                      uint32_t bitrate_, int frames_)
      : name(name_),
        width(width_),
        height(height_),
        bitrate(bitrate_),
        frames(frames_) {}
  const char *name;
  uint32_t width;
  uint32_t height;
  uint32_t bitrate;
  int frames;
};

const EncodePerfTestVideo kVP9EncodePerfTestVectors[] = {
  EncodePerfTestVideo("desktop_640_360_30.yuv", 640, 360, 200, 2484),
  EncodePerfTestVideo("kirland_640_480_30.yuv", 640, 480, 200, 300),
  EncodePerfTestVideo("macmarcomoving_640_480_30.yuv", 640, 480, 200, 987),
  EncodePerfTestVideo("macmarcostationary_640_480_30.yuv", 640, 480, 200, 718),
  EncodePerfTestVideo("niklas_640_480_30.yuv", 640, 480, 200, 471),
  EncodePerfTestVideo("tacomanarrows_640_480_30.yuv", 640, 480, 200, 300),
  EncodePerfTestVideo("tacomasmallcameramovement_640_480_30.yuv",
                      640, 480, 200, 300),
  EncodePerfTestVideo("thaloundeskmtg_640_480_30.yuv", 640, 480, 200, 300),
  EncodePerfTestVideo("niklas_1280_720_30.yuv", 1280, 720, 600, 470),
};

const int kEncodePerfTestSpeeds[] = { 5, 6, 7, 12 };

#define NELEMENTS(x) (sizeof((x)) / sizeof((x)[0]))

class VP9EncodePerfTest
    : public ::libvpx_test::EncoderTest,
      public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 protected:
  VP9EncodePerfTest()
      : EncoderTest(GET_PARAM(0)),
        min_psnr_(kMaxPsnr),
        nframes_(0),
        encoding_mode_(GET_PARAM(1)),
        speed_(0) {}

  virtual ~VP9EncodePerfTest() {}

  virtual void SetUp() {
    InitializeConfig();
    SetMode(encoding_mode_);

    cfg_.g_lag_in_frames = 0;
    cfg_.rc_min_quantizer = 2;
    cfg_.rc_max_quantizer = 56;
    cfg_.rc_dropframe_thresh = 0;
    cfg_.rc_undershoot_pct = 50;
    cfg_.rc_overshoot_pct = 50;
    cfg_.rc_buf_sz = 1000;
    cfg_.rc_buf_initial_sz = 500;
    cfg_.rc_buf_optimal_sz = 600;
    cfg_.rc_resize_allowed = 0;
    cfg_.rc_end_usage = VPX_CBR;
  }

  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
                                  ::libvpx_test::Encoder *encoder) {
    if (video->frame() == 1) {
      encoder->Control(VP8E_SET_CPUUSED, speed_);
    }
  }

  virtual void BeginPassHook(unsigned int /*pass*/) {
    min_psnr_ = kMaxPsnr;
    nframes_ = 0;
  }

  virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {
    if (pkt->data.psnr.psnr[0] < min_psnr_) {
      min_psnr_= pkt->data.psnr.psnr[0];
    }
  }

  // for performance reasons don't decode
  virtual bool DoDecode() { return 0; }

  double min_psnr() const {
    return min_psnr_;
  }

  void set_speed(unsigned int speed) {
    speed_ = speed;
  }

 private:
  double min_psnr_;
  unsigned int nframes_;
  libvpx_test::TestMode encoding_mode_;
  unsigned speed_;
};

TEST_P(VP9EncodePerfTest, PerfTest) {
  for (size_t i = 0; i < NELEMENTS(kVP9EncodePerfTestVectors); ++i) {
    for (size_t j = 0; j < NELEMENTS(kEncodePerfTestSpeeds); ++j) {
      SetUp();

      const vpx_rational timebase = { 33333333, 1000000000 };
      cfg_.g_timebase = timebase;
      cfg_.rc_target_bitrate = kVP9EncodePerfTestVectors[i].bitrate;

      init_flags_ = VPX_CODEC_USE_PSNR;

      const unsigned frames = kVP9EncodePerfTestVectors[i].frames;
      const char *video_name = kVP9EncodePerfTestVectors[i].name;
      libvpx_test::I420VideoSource video(
          video_name,
          kVP9EncodePerfTestVectors[i].width,
          kVP9EncodePerfTestVectors[i].height,
          timebase.den, timebase.num, 0,
          kVP9EncodePerfTestVectors[i].frames);
      set_speed(kEncodePerfTestSpeeds[j]);

      vpx_usec_timer t;
      vpx_usec_timer_start(&t);

      ASSERT_NO_FATAL_FAILURE(RunLoop(&video));

      vpx_usec_timer_mark(&t);
      const double elapsed_secs = vpx_usec_timer_elapsed(&t) / kUsecsInSec;
      const double fps = frames / elapsed_secs;
      const double minimum_psnr = min_psnr();

      printf("{\n");
      printf("\t\"type\" : \"encode_perf_test\",\n");
      printf("\t\"version\" : \"%s\",\n", VERSION_STRING_NOSP);
      printf("\t\"videoName\" : \"%s\",\n", video_name);
      printf("\t\"encodeTimeSecs\" : %f,\n", elapsed_secs);
      printf("\t\"totalFrames\" : %u,\n", frames);
      printf("\t\"framesPerSecond\" : %f,\n", fps);
      printf("\t\"minPsnr\" : %f,\n", minimum_psnr);
      printf("\t\"speed\" : %d\n", kEncodePerfTestSpeeds[j]);
      printf("}\n");
    }
  }
}

VP9_INSTANTIATE_TEST_CASE(
    VP9EncodePerfTest, ::testing::Values(::libvpx_test::kRealTime));
}  // namespace
