tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

quant_test.cc (6428B)


      1 /*
      2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
      3 *
      4 * This source code is subject to the terms of the BSD 2 Clause License and
      5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
      6 * was not distributed with this source code in the LICENSE file, you can
      7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
      8 * Media Patent License 1.0 was not distributed with this source code in the
      9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
     10 */
     11 #include "config/aom_config.h"
     12 
     13 #include "av1/encoder/av1_quantize.h"
     14 #include "gtest/gtest.h"
     15 #include "test/codec_factory.h"
     16 #include "test/encode_test_driver.h"
     17 #include "test/i420_video_source.h"
     18 #include "test/util.h"
     19 #include "test/y4m_video_source.h"
     20 
     21 namespace {
     22 
     23 const ::libaom_test::TestMode kTestMode[] =
     24 #if CONFIG_REALTIME_ONLY
     25    { ::libaom_test::kRealTime };
     26 #else
     27    { ::libaom_test::kRealTime, ::libaom_test::kOnePassGood };
     28 #endif
     29 
     30 class QMTest
     31    : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>,
     32      public ::libaom_test::EncoderTest {
     33 protected:
     34  QMTest() : EncoderTest(GET_PARAM(0)) {}
     35  ~QMTest() override = default;
     36 
     37  void SetUp() override {
     38    InitializeConfig(GET_PARAM(1));
     39    set_cpu_used_ = GET_PARAM(2);
     40  }
     41 
     42  void PreEncodeFrameHook(::libaom_test::VideoSource *video,
     43                          ::libaom_test::Encoder *encoder) override {
     44    if (video->frame() == 0) {
     45      encoder->Control(AOME_SET_CPUUSED, set_cpu_used_);
     46      encoder->Control(AV1E_SET_ENABLE_QM, 1);
     47      encoder->Control(AV1E_SET_QM_MIN, qm_min_);
     48      encoder->Control(AV1E_SET_QM_MAX, qm_max_);
     49 
     50      encoder->Control(AOME_SET_MAX_INTRA_BITRATE_PCT, 100);
     51      if (mode_ == ::libaom_test::kRealTime) {
     52        encoder->Control(AV1E_SET_ALLOW_WARPED_MOTION, 0);
     53        encoder->Control(AV1E_SET_ENABLE_GLOBAL_MOTION, 0);
     54        encoder->Control(AV1E_SET_ENABLE_OBMC, 0);
     55      }
     56    }
     57  }
     58 
     59  void DoTest(int qm_min, int qm_max) {
     60    qm_min_ = qm_min;
     61    qm_max_ = qm_max;
     62    cfg_.kf_max_dist = 12;
     63    cfg_.rc_min_quantizer = 8;
     64    cfg_.rc_max_quantizer = 56;
     65    cfg_.rc_end_usage = AOM_CBR;
     66    cfg_.g_lag_in_frames = 6;
     67    cfg_.rc_buf_initial_sz = 500;
     68    cfg_.rc_buf_optimal_sz = 500;
     69    cfg_.rc_buf_sz = 1000;
     70    cfg_.rc_target_bitrate = 300;
     71    ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
     72                                         288, 30, 1, 0, 15);
     73    ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
     74  }
     75 
     76  int set_cpu_used_;
     77  int qm_min_;
     78  int qm_max_;
     79 };
     80 
     81 // encodes and decodes without a mismatch.
     82 TEST_P(QMTest, TestNoMisMatchQM1) { DoTest(5, 9); }
     83 
     84 // encodes and decodes without a mismatch.
     85 TEST_P(QMTest, TestNoMisMatchQM2) { DoTest(0, 8); }
     86 
     87 // encodes and decodes without a mismatch.
     88 TEST_P(QMTest, TestNoMisMatchQM3) { DoTest(9, 15); }
     89 
     90 AV1_INSTANTIATE_TEST_SUITE(QMTest, ::testing::ValuesIn(kTestMode),
     91                           ::testing::Range(5, 9));
     92 
     93 #if !CONFIG_REALTIME_ONLY
     94 struct QuantParam {
     95  const unsigned int min_q;
     96  const unsigned int max_q;
     97 };
     98 
     99 const QuantParam QuantTestParams[] = {
    100  { 0, 10 }, { 0, 60 }, { 20, 35 }, { 35, 50 }, { 50, 63 }
    101 };
    102 
    103 std::ostream &operator<<(std::ostream &os, const QuantParam &test_arg) {
    104  return os << "QuantParam { min_q:" << test_arg.min_q
    105            << " max_q:" << test_arg.max_q << " }";
    106 }
    107 
    108 /*
    109 * This class is used to test whether base_qindex is within min
    110 * and max quantizer range configured by user.
    111 */
    112 class QuantizerBoundsCheckTestLarge
    113    : public ::libaom_test::CodecTestWith3Params<libaom_test::TestMode,
    114                                                 QuantParam, aom_rc_mode>,
    115      public ::libaom_test::EncoderTest {
    116 protected:
    117  QuantizerBoundsCheckTestLarge()
    118      : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)),
    119        quant_param_(GET_PARAM(2)), rc_end_usage_(GET_PARAM(3)) {
    120    quant_bound_violated_ = false;
    121  }
    122  ~QuantizerBoundsCheckTestLarge() override = default;
    123 
    124  void SetUp() override {
    125    InitializeConfig(encoding_mode_);
    126    const aom_rational timebase = { 1, 30 };
    127    cfg_.g_timebase = timebase;
    128    cfg_.rc_end_usage = rc_end_usage_;
    129    cfg_.g_threads = 1;
    130    cfg_.rc_min_quantizer = quant_param_.min_q;
    131    cfg_.rc_max_quantizer = quant_param_.max_q;
    132    cfg_.g_lag_in_frames = 35;
    133    if (rc_end_usage_ != AOM_Q) {
    134      cfg_.rc_target_bitrate = 400;
    135    }
    136  }
    137 
    138  bool DoDecode() const override { return true; }
    139 
    140  void PreEncodeFrameHook(::libaom_test::VideoSource *video,
    141                          ::libaom_test::Encoder *encoder) override {
    142    if (video->frame() == 0) {
    143      encoder->Control(AOME_SET_CPUUSED, 5);
    144    }
    145  }
    146 
    147  bool HandleDecodeResult(const aom_codec_err_t res_dec,
    148                          libaom_test::Decoder *decoder) override {
    149    EXPECT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError();
    150    if (AOM_CODEC_OK == res_dec) {
    151      aom_codec_ctx_t *ctx_dec = decoder->GetDecoder();
    152      AOM_CODEC_CONTROL_TYPECHECKED(ctx_dec, AOMD_GET_LAST_QUANTIZER,
    153                                    &base_qindex_);
    154      min_bound_qindex_ = av1_quantizer_to_qindex(cfg_.rc_min_quantizer);
    155      max_bound_qindex_ = av1_quantizer_to_qindex(cfg_.rc_max_quantizer);
    156      if ((base_qindex_ < min_bound_qindex_ ||
    157           base_qindex_ > max_bound_qindex_) &&
    158          quant_bound_violated_ == false) {
    159        quant_bound_violated_ = true;
    160      }
    161    }
    162    return AOM_CODEC_OK == res_dec;
    163  }
    164 
    165  ::libaom_test::TestMode encoding_mode_;
    166  const QuantParam quant_param_;
    167  int base_qindex_;
    168  int min_bound_qindex_;
    169  int max_bound_qindex_;
    170  bool quant_bound_violated_;
    171  aom_rc_mode rc_end_usage_;
    172 };
    173 
    174 TEST_P(QuantizerBoundsCheckTestLarge, QuantizerBoundsCheckEncodeTest) {
    175  libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
    176                                     cfg_.g_timebase.den, cfg_.g_timebase.num,
    177                                     0, 50);
    178  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
    179  ASSERT_EQ(quant_bound_violated_, false);
    180 }
    181 
    182 AV1_INSTANTIATE_TEST_SUITE(QuantizerBoundsCheckTestLarge,
    183                           ::testing::Values(::libaom_test::kOnePassGood,
    184                                             ::libaom_test::kTwoPassGood),
    185                           ::testing::ValuesIn(QuantTestParams),
    186                           ::testing::Values(AOM_Q, AOM_VBR, AOM_CBR, AOM_CQ));
    187 #endif  // !CONFIG_REALTIME_ONLY
    188 }  // namespace