xref: /aosp_15_r20/external/libgav1/src/scan_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1*09537850SAkhilesh Sanikop // Copyright 2021 The libgav1 Authors
2*09537850SAkhilesh Sanikop //
3*09537850SAkhilesh Sanikop // Licensed under the Apache License, Version 2.0 (the "License");
4*09537850SAkhilesh Sanikop // you may not use this file except in compliance with the License.
5*09537850SAkhilesh Sanikop // You may obtain a copy of the License at
6*09537850SAkhilesh Sanikop //
7*09537850SAkhilesh Sanikop //      http://www.apache.org/licenses/LICENSE-2.0
8*09537850SAkhilesh Sanikop //
9*09537850SAkhilesh Sanikop // Unless required by applicable law or agreed to in writing, software
10*09537850SAkhilesh Sanikop // distributed under the License is distributed on an "AS IS" BASIS,
11*09537850SAkhilesh Sanikop // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*09537850SAkhilesh Sanikop // See the License for the specific language governing permissions and
13*09537850SAkhilesh Sanikop // limitations under the License.
14*09537850SAkhilesh Sanikop 
15*09537850SAkhilesh Sanikop #include <algorithm>
16*09537850SAkhilesh Sanikop #include <cstdint>
17*09537850SAkhilesh Sanikop #include <tuple>
18*09537850SAkhilesh Sanikop #include <vector>
19*09537850SAkhilesh Sanikop 
20*09537850SAkhilesh Sanikop #include "gmock/gmock.h"
21*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
22*09537850SAkhilesh Sanikop #include "src/utils/common.h"
23*09537850SAkhilesh Sanikop #include "src/utils/constants.h"
24*09537850SAkhilesh Sanikop 
25*09537850SAkhilesh Sanikop namespace libgav1 {
26*09537850SAkhilesh Sanikop namespace {
27*09537850SAkhilesh Sanikop 
28*09537850SAkhilesh Sanikop // Import all the constants in the anonymous namespace.
29*09537850SAkhilesh Sanikop #include "src/scan_tables.inc"
30*09537850SAkhilesh Sanikop 
31*09537850SAkhilesh Sanikop class ScanOrderTest
32*09537850SAkhilesh Sanikop     : public testing::TestWithParam<std::tuple<TransformClass, TransformSize>> {
33*09537850SAkhilesh Sanikop  public:
34*09537850SAkhilesh Sanikop   ScanOrderTest() = default;
35*09537850SAkhilesh Sanikop   ScanOrderTest(const ScanOrderTest&) = delete;
36*09537850SAkhilesh Sanikop   ScanOrderTest& operator=(const ScanOrderTest&) = delete;
37*09537850SAkhilesh Sanikop   ~ScanOrderTest() override = default;
38*09537850SAkhilesh Sanikop 
39*09537850SAkhilesh Sanikop  protected:
40*09537850SAkhilesh Sanikop   TransformClass tx_class_ = std::get<0>(GetParam());
41*09537850SAkhilesh Sanikop   TransformSize tx_size_ = std::get<1>(GetParam());
42*09537850SAkhilesh Sanikop };
43*09537850SAkhilesh Sanikop 
TEST_P(ScanOrderTest,AllIndicesAreScannedExactlyOnce)44*09537850SAkhilesh Sanikop TEST_P(ScanOrderTest, AllIndicesAreScannedExactlyOnce) {
45*09537850SAkhilesh Sanikop   const int tx_width = kTransformWidth[tx_size_];
46*09537850SAkhilesh Sanikop   const int tx_height = kTransformHeight[tx_size_];
47*09537850SAkhilesh Sanikop   int num_indices;
48*09537850SAkhilesh Sanikop   if (tx_class_ == kTransformClass2D || std::max(tx_width, tx_height) == 64) {
49*09537850SAkhilesh Sanikop     const int clamped_tx_width = std::min(32, tx_width);
50*09537850SAkhilesh Sanikop     const int clamped_tx_height = std::min(32, tx_height);
51*09537850SAkhilesh Sanikop     num_indices = clamped_tx_width * clamped_tx_height;
52*09537850SAkhilesh Sanikop   } else {
53*09537850SAkhilesh Sanikop     num_indices =
54*09537850SAkhilesh Sanikop         (std::max(tx_width, tx_height) > 16) ? 64 : tx_width * tx_height;
55*09537850SAkhilesh Sanikop   }
56*09537850SAkhilesh Sanikop   const uint16_t* const scan = kScan[tx_class_][tx_size_];
57*09537850SAkhilesh Sanikop   ASSERT_NE(scan, nullptr);
58*09537850SAkhilesh Sanikop   // Ensure that all the indices are scanned exactly once.
59*09537850SAkhilesh Sanikop   std::vector<int> scanned;
60*09537850SAkhilesh Sanikop   scanned.resize(num_indices);
61*09537850SAkhilesh Sanikop   for (int i = 0; i < num_indices; ++i) {
62*09537850SAkhilesh Sanikop     scanned[scan[i]]++;
63*09537850SAkhilesh Sanikop   }
64*09537850SAkhilesh Sanikop   EXPECT_THAT(scanned, testing::Each(1));
65*09537850SAkhilesh Sanikop }
66*09537850SAkhilesh Sanikop 
67*09537850SAkhilesh Sanikop constexpr TransformClass kTestTransformClasses[] = {
68*09537850SAkhilesh Sanikop     kTransformClass2D, kTransformClassVertical, kTransformClassHorizontal};
69*09537850SAkhilesh Sanikop 
70*09537850SAkhilesh Sanikop constexpr TransformSize kTestTransformSizes[] = {
71*09537850SAkhilesh Sanikop     kTransformSize4x4,   kTransformSize4x8,   kTransformSize4x16,
72*09537850SAkhilesh Sanikop     kTransformSize8x4,   kTransformSize8x8,   kTransformSize8x16,
73*09537850SAkhilesh Sanikop     kTransformSize8x32,  kTransformSize16x4,  kTransformSize16x8,
74*09537850SAkhilesh Sanikop     kTransformSize16x16, kTransformSize16x32, kTransformSize16x64,
75*09537850SAkhilesh Sanikop     kTransformSize32x8,  kTransformSize32x16, kTransformSize32x32,
76*09537850SAkhilesh Sanikop     kTransformSize32x64, kTransformSize64x16, kTransformSize64x32,
77*09537850SAkhilesh Sanikop     kTransformSize64x64};
78*09537850SAkhilesh Sanikop 
79*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
80*09537850SAkhilesh Sanikop     C, ScanOrderTest,
81*09537850SAkhilesh Sanikop     testing::Combine(testing::ValuesIn(kTestTransformClasses),
82*09537850SAkhilesh Sanikop                      testing::ValuesIn(kTestTransformSizes)));
83*09537850SAkhilesh Sanikop 
84*09537850SAkhilesh Sanikop }  // namespace
85*09537850SAkhilesh Sanikop }  // namespace libgav1
86