tor-browser

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

block_test.cc (8349B)


      1 /*
      2 * Copyright (c) 2018, 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 
     12 #include "aom/aom_codec.h"
     13 #include "av1/common/blockd.h"
     14 #include "gtest/gtest.h"
     15 #include "test/codec_factory.h"
     16 #include "test/encode_test_driver.h"
     17 #include "test/y4m_video_source.h"
     18 #include "test/util.h"
     19 
     20 // Verify the optimized implementation of get_partition_subsize() produces the
     21 // same results as the Partition_Subsize lookup table in the spec.
     22 TEST(BlockdTest, GetPartitionSubsize) {
     23  // The Partition_Subsize table in the spec (Section 9.3. Conversion tables).
     24  /* clang-format off */
     25  static const BLOCK_SIZE kPartitionSubsize[10][BLOCK_SIZES_ALL] = {
     26    {
     27                                    BLOCK_4X4,
     28      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X8,
     29      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X16,
     30      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X32,
     31      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X64,
     32      BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X128,
     33      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     34      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     35    }, {
     36                                    BLOCK_INVALID,
     37      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X4,
     38      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X8,
     39      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16,
     40      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32,
     41      BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X64,
     42      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     43      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     44    }, {
     45                                    BLOCK_INVALID,
     46      BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X8,
     47      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X16,
     48      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32,
     49      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64,
     50      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X128,
     51      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     52      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     53    }, {
     54                                    BLOCK_INVALID,
     55      BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X4,
     56      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X8,
     57      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X16,
     58      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X32,
     59      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X64,
     60      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     61      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     62    }, {
     63                                    BLOCK_INVALID,
     64      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     65      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X8,
     66      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16,
     67      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32,
     68      BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X64,
     69      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     70      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     71    }, {
     72                                    BLOCK_INVALID,
     73      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     74      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X8,
     75      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16,
     76      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32,
     77      BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X64,
     78      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     79      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     80    }, {
     81                                    BLOCK_INVALID,
     82      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     83      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X16,
     84      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32,
     85      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64,
     86      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X128,
     87      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     88      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     89    }, {
     90                                    BLOCK_INVALID,
     91      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     92      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X16,
     93      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32,
     94      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64,
     95      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X128,
     96      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
     97      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
     98    }, {
     99                                    BLOCK_INVALID,
    100      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
    101      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X4,
    102      BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X8,
    103      BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X16,
    104      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
    105      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
    106      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
    107    }, {
    108                                    BLOCK_INVALID,
    109      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
    110      BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X16,
    111      BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X32,
    112      BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X64,
    113      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
    114      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
    115      BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID
    116    }
    117  };
    118  /* clang-format on */
    119 
    120  for (int partition = 0; partition < 10; partition++) {
    121    for (int bsize = BLOCK_4X4; bsize < BLOCK_SIZES_ALL; bsize++) {
    122      EXPECT_EQ(kPartitionSubsize[partition][bsize],
    123                get_partition_subsize(static_cast<BLOCK_SIZE>(bsize),
    124                                      static_cast<PARTITION_TYPE>(partition)));
    125    }
    126  }
    127 }
    128 
    129 #if CONFIG_AV1_DECODER && CONFIG_AV1_ENCODER
    130 namespace {
    131 // This class is used to validate if sb_size configured is respected
    132 // in the bitstream
    133 class SuperBlockSizeTestLarge
    134    : public ::libaom_test::CodecTestWith3Params<
    135          libaom_test::TestMode, aom_superblock_size_t, aom_rc_mode>,
    136      public ::libaom_test::EncoderTest {
    137 protected:
    138  SuperBlockSizeTestLarge()
    139      : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)),
    140        superblock_size_(GET_PARAM(2)), rc_end_usage_(GET_PARAM(3)) {
    141    sb_size_violated_ = false;
    142  }
    143  ~SuperBlockSizeTestLarge() override = default;
    144 
    145  void SetUp() override {
    146    InitializeConfig(encoding_mode_);
    147    const aom_rational timebase = { 1, 30 };
    148    cfg_.g_timebase = timebase;
    149    cfg_.rc_end_usage = rc_end_usage_;
    150    cfg_.g_threads = 1;
    151    cfg_.g_lag_in_frames = 35;
    152    cfg_.rc_target_bitrate = 1000;
    153  }
    154 
    155  bool DoDecode() const override { return true; }
    156 
    157  void PreEncodeFrameHook(::libaom_test::VideoSource *video,
    158                          ::libaom_test::Encoder *encoder) override {
    159    if (video->frame() == 0) {
    160      encoder->Control(AOME_SET_CPUUSED, 5);
    161      encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1);
    162      encoder->Control(AV1E_SET_SUPERBLOCK_SIZE, superblock_size_);
    163    }
    164  }
    165 
    166  bool HandleDecodeResult(const aom_codec_err_t res_dec,
    167                          libaom_test::Decoder *decoder) override {
    168    EXPECT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError();
    169    if (AOM_CODEC_OK == res_dec &&
    170        superblock_size_ != AOM_SUPERBLOCK_SIZE_DYNAMIC) {
    171      aom_codec_ctx_t *ctx_dec = decoder->GetDecoder();
    172      aom_superblock_size_t sb_size;
    173      AOM_CODEC_CONTROL_TYPECHECKED(ctx_dec, AOMD_GET_SB_SIZE, &sb_size);
    174      if (superblock_size_ != sb_size) {
    175        sb_size_violated_ = true;
    176      }
    177    }
    178    return AOM_CODEC_OK == res_dec;
    179  }
    180 
    181  ::libaom_test::TestMode encoding_mode_;
    182  aom_superblock_size_t superblock_size_;
    183  bool sb_size_violated_;
    184  aom_rc_mode rc_end_usage_;
    185 };
    186 
    187 TEST_P(SuperBlockSizeTestLarge, SuperBlockSizeTest) {
    188  ::libaom_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 1);
    189  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
    190  ASSERT_EQ(sb_size_violated_, false)
    191      << "Failed for SB size " << superblock_size_;
    192 }
    193 
    194 const ::libaom_test::TestMode kTestModes[] = {
    195 #if CONFIG_REALTIME_ONLY
    196  ::libaom_test::kRealTime
    197 #else
    198  ::libaom_test::kRealTime, ::libaom_test::kOnePassGood,
    199  ::libaom_test::kTwoPassGood
    200 #endif
    201 };
    202 
    203 AV1_INSTANTIATE_TEST_SUITE(SuperBlockSizeTestLarge,
    204                           ::testing::ValuesIn(kTestModes),
    205                           ::testing::Values(AOM_SUPERBLOCK_SIZE_64X64,
    206                                             AOM_SUPERBLOCK_SIZE_128X128),
    207                           ::testing::Values(AOM_Q, AOM_VBR, AOM_CBR, AOM_CQ));
    208 }  // namespace
    209 #endif