/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

#include <stdio.h>
#include <stdlib.h>

#include "av1/encoder/firstpass.h"
#include "av1/encoder/ratectrl.h"
#include "third_party/googletest/src/googletest/include/gtest/gtest.h"

namespace {

TEST(RatectrlTest, QModeGetQIndexTest) {
  int base_q_index = 36;
  int gf_update_type = INTNL_ARF_UPDATE;
  int gf_pyramid_level = 1;
  int arf_q = 100;
  int q_index = av1_q_mode_get_q_index(base_q_index, gf_update_type,
                                       gf_pyramid_level, arf_q);
  EXPECT_EQ(q_index, arf_q);

  gf_update_type = INTNL_ARF_UPDATE;
  gf_pyramid_level = 3;
  q_index = av1_q_mode_get_q_index(base_q_index, gf_update_type,
                                   gf_pyramid_level, arf_q);
  EXPECT_LT(q_index, arf_q);

  gf_update_type = LF_UPDATE;
  q_index = av1_q_mode_get_q_index(base_q_index, gf_update_type,
                                   gf_pyramid_level, arf_q);
  EXPECT_EQ(q_index, base_q_index);
}

#if !CONFIG_REALTIME_ONLY
// TODO(angiebird): Move this test to tpl_mode_test.cc
TEST(RatectrlTest, QModeComputeGOPQIndicesTest) {
  const int base_q_index = 80;
  const double arf_qstep_ratio = 0.5;
  const aom_bit_depth_t bit_depth = AOM_BITS_8;

  const int gf_frame_index = 0;
  GF_GROUP gf_group = {};
  gf_group.size = 5;
  const int layer_depth[5] = { 1, 3, 2, 3, 1 };
  const int update_type[5] = { KF_UPDATE, INTNL_ARF_UPDATE,
                               INTNL_OVERLAY_UPDATE, INTNL_ARF_UPDATE,
                               ARF_UPDATE };

  for (int i = 0; i < gf_group.size; i++) {
    gf_group.layer_depth[i] = layer_depth[i];
    gf_group.update_type[i] = update_type[i];
  }

  const int arf_q = av1_get_q_index_from_qstep_ratio(
      base_q_index, arf_qstep_ratio, bit_depth);

  av1_q_mode_compute_gop_q_indices(gf_frame_index, base_q_index,
                                   arf_qstep_ratio, bit_depth, &gf_group,
                                   gf_group.q_val);

  for (int i = 0; i < gf_group.size; i++) {
    if (layer_depth[i] == 1) {
      EXPECT_EQ(gf_group.q_val[i], arf_q);
    } else {
      EXPECT_GT(gf_group.q_val[i], arf_q);
    }
  }
}
#endif  // !CONFIG_REALTIME_ONLY

}  // namespace
