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 "src/dsp/intrapred_cfl.h"
16*09537850SAkhilesh Sanikop
17*09537850SAkhilesh Sanikop #include <cmath>
18*09537850SAkhilesh Sanikop #include <cstddef>
19*09537850SAkhilesh Sanikop #include <cstdint>
20*09537850SAkhilesh Sanikop #include <cstring>
21*09537850SAkhilesh Sanikop #include <memory>
22*09537850SAkhilesh Sanikop #include <ostream>
23*09537850SAkhilesh Sanikop
24*09537850SAkhilesh Sanikop #include "absl/strings/match.h"
25*09537850SAkhilesh Sanikop #include "absl/time/clock.h"
26*09537850SAkhilesh Sanikop #include "absl/time/time.h"
27*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
28*09537850SAkhilesh Sanikop #include "src/dsp/constants.h"
29*09537850SAkhilesh Sanikop #include "src/dsp/dsp.h"
30*09537850SAkhilesh Sanikop #include "src/utils/common.h"
31*09537850SAkhilesh Sanikop #include "src/utils/compiler_attributes.h"
32*09537850SAkhilesh Sanikop #include "src/utils/constants.h"
33*09537850SAkhilesh Sanikop #include "src/utils/cpu.h"
34*09537850SAkhilesh Sanikop #include "src/utils/memory.h"
35*09537850SAkhilesh Sanikop #include "tests/block_utils.h"
36*09537850SAkhilesh Sanikop #include "tests/third_party/libvpx/acm_random.h"
37*09537850SAkhilesh Sanikop #include "tests/utils.h"
38*09537850SAkhilesh Sanikop
39*09537850SAkhilesh Sanikop namespace libgav1 {
40*09537850SAkhilesh Sanikop namespace dsp {
41*09537850SAkhilesh Sanikop namespace {
42*09537850SAkhilesh Sanikop
43*09537850SAkhilesh Sanikop constexpr int kMaxBlockSize = 64;
44*09537850SAkhilesh Sanikop constexpr int kTotalPixels = kMaxBlockSize * kMaxBlockSize;
45*09537850SAkhilesh Sanikop
46*09537850SAkhilesh Sanikop const char* const kCflIntraPredName = "kCflIntraPredictor";
47*09537850SAkhilesh Sanikop
48*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
49*09537850SAkhilesh Sanikop class IntraPredTestBase : public testing::TestWithParam<TransformSize>,
50*09537850SAkhilesh Sanikop public test_utils::MaxAlignedAllocable {
51*09537850SAkhilesh Sanikop public:
52*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
IntraPredTestBase()53*09537850SAkhilesh Sanikop IntraPredTestBase() {
54*09537850SAkhilesh Sanikop switch (tx_size_) {
55*09537850SAkhilesh Sanikop case kNumTransformSizes:
56*09537850SAkhilesh Sanikop EXPECT_NE(tx_size_, kNumTransformSizes);
57*09537850SAkhilesh Sanikop break;
58*09537850SAkhilesh Sanikop default:
59*09537850SAkhilesh Sanikop block_width_ = kTransformWidth[tx_size_];
60*09537850SAkhilesh Sanikop block_height_ = kTransformHeight[tx_size_];
61*09537850SAkhilesh Sanikop break;
62*09537850SAkhilesh Sanikop }
63*09537850SAkhilesh Sanikop }
64*09537850SAkhilesh Sanikop
65*09537850SAkhilesh Sanikop IntraPredTestBase(const IntraPredTestBase&) = delete;
66*09537850SAkhilesh Sanikop IntraPredTestBase& operator=(const IntraPredTestBase&) = delete;
67*09537850SAkhilesh Sanikop ~IntraPredTestBase() override = default;
68*09537850SAkhilesh Sanikop
69*09537850SAkhilesh Sanikop protected:
70*09537850SAkhilesh Sanikop struct IntraPredMem {
Resetlibgav1::dsp::__anon0712f7390111::IntraPredTestBase::IntraPredMem71*09537850SAkhilesh Sanikop void Reset(libvpx_test::ACMRandom* rnd) {
72*09537850SAkhilesh Sanikop ASSERT_NE(rnd, nullptr);
73*09537850SAkhilesh Sanikop Pixel* const left = left_mem + 16;
74*09537850SAkhilesh Sanikop Pixel* const top = top_mem + 16;
75*09537850SAkhilesh Sanikop const int mask = (1 << bitdepth) - 1;
76*09537850SAkhilesh Sanikop for (auto& r : ref_src) r = rnd->Rand16() & mask;
77*09537850SAkhilesh Sanikop for (int i = 0; i < kMaxBlockSize; ++i) left[i] = rnd->Rand16() & mask;
78*09537850SAkhilesh Sanikop for (int i = -1; i < kMaxBlockSize; ++i) top[i] = rnd->Rand16() & mask;
79*09537850SAkhilesh Sanikop
80*09537850SAkhilesh Sanikop // Some directional predictors require top-right, bottom-left.
81*09537850SAkhilesh Sanikop for (int i = kMaxBlockSize; i < 2 * kMaxBlockSize; ++i) {
82*09537850SAkhilesh Sanikop left[i] = rnd->Rand16() & mask;
83*09537850SAkhilesh Sanikop top[i] = rnd->Rand16() & mask;
84*09537850SAkhilesh Sanikop }
85*09537850SAkhilesh Sanikop // TODO(jzern): reorder this and regenerate the digests after switching
86*09537850SAkhilesh Sanikop // random number generators.
87*09537850SAkhilesh Sanikop // Upsampling in the directional predictors extends left/top[-1] to [-2].
88*09537850SAkhilesh Sanikop left[-1] = rnd->Rand16() & mask;
89*09537850SAkhilesh Sanikop left[-2] = rnd->Rand16() & mask;
90*09537850SAkhilesh Sanikop top[-2] = rnd->Rand16() & mask;
91*09537850SAkhilesh Sanikop memset(left_mem, 0, sizeof(left_mem[0]) * 14);
92*09537850SAkhilesh Sanikop memset(top_mem, 0, sizeof(top_mem[0]) * 14);
93*09537850SAkhilesh Sanikop memset(top_mem + kMaxBlockSize * 2 + 16, 0,
94*09537850SAkhilesh Sanikop sizeof(top_mem[0]) * kTopMemPadding);
95*09537850SAkhilesh Sanikop }
96*09537850SAkhilesh Sanikop
97*09537850SAkhilesh Sanikop // Set ref_src, top-left, top and left to |pixel|.
Setlibgav1::dsp::__anon0712f7390111::IntraPredTestBase::IntraPredMem98*09537850SAkhilesh Sanikop void Set(const Pixel pixel) {
99*09537850SAkhilesh Sanikop Pixel* const left = left_mem + 16;
100*09537850SAkhilesh Sanikop Pixel* const top = top_mem + 16;
101*09537850SAkhilesh Sanikop for (auto& r : ref_src) r = pixel;
102*09537850SAkhilesh Sanikop // Upsampling in the directional predictors extends left/top[-1] to [-2].
103*09537850SAkhilesh Sanikop for (int i = -2; i < 2 * kMaxBlockSize; ++i) {
104*09537850SAkhilesh Sanikop left[i] = top[i] = pixel;
105*09537850SAkhilesh Sanikop }
106*09537850SAkhilesh Sanikop }
107*09537850SAkhilesh Sanikop
108*09537850SAkhilesh Sanikop // DirectionalZone1_Large() overreads up to 7 pixels in |top_mem|.
109*09537850SAkhilesh Sanikop static constexpr int kTopMemPadding = 7;
110*09537850SAkhilesh Sanikop alignas(kMaxAlignment) Pixel dst[kTotalPixels];
111*09537850SAkhilesh Sanikop alignas(kMaxAlignment) Pixel ref_src[kTotalPixels];
112*09537850SAkhilesh Sanikop alignas(kMaxAlignment) Pixel left_mem[kMaxBlockSize * 2 + 16];
113*09537850SAkhilesh Sanikop alignas(
114*09537850SAkhilesh Sanikop kMaxAlignment) Pixel top_mem[kMaxBlockSize * 2 + 16 + kTopMemPadding];
115*09537850SAkhilesh Sanikop };
116*09537850SAkhilesh Sanikop
SetUp()117*09537850SAkhilesh Sanikop void SetUp() override { test_utils::ResetDspTable(bitdepth); }
118*09537850SAkhilesh Sanikop
119*09537850SAkhilesh Sanikop const TransformSize tx_size_ = GetParam();
120*09537850SAkhilesh Sanikop int block_width_;
121*09537850SAkhilesh Sanikop int block_height_;
122*09537850SAkhilesh Sanikop IntraPredMem intra_pred_mem_;
123*09537850SAkhilesh Sanikop };
124*09537850SAkhilesh Sanikop
125*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
126*09537850SAkhilesh Sanikop // CflIntraPredTest
127*09537850SAkhilesh Sanikop
128*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
129*09537850SAkhilesh Sanikop class CflIntraPredTest : public IntraPredTestBase<bitdepth, Pixel> {
130*09537850SAkhilesh Sanikop public:
131*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
132*09537850SAkhilesh Sanikop CflIntraPredTest() = default;
133*09537850SAkhilesh Sanikop CflIntraPredTest(const CflIntraPredTest&) = delete;
134*09537850SAkhilesh Sanikop CflIntraPredTest& operator=(const CflIntraPredTest&) = delete;
135*09537850SAkhilesh Sanikop ~CflIntraPredTest() override = default;
136*09537850SAkhilesh Sanikop
137*09537850SAkhilesh Sanikop protected:
138*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::tx_size_;
139*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::block_width_;
140*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::block_height_;
141*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::intra_pred_mem_;
142*09537850SAkhilesh Sanikop
SetUp()143*09537850SAkhilesh Sanikop void SetUp() override {
144*09537850SAkhilesh Sanikop IntraPredTestBase<bitdepth, Pixel>::SetUp();
145*09537850SAkhilesh Sanikop IntraPredCflInit_C();
146*09537850SAkhilesh Sanikop
147*09537850SAkhilesh Sanikop const Dsp* const dsp = GetDspTable(bitdepth);
148*09537850SAkhilesh Sanikop ASSERT_NE(dsp, nullptr);
149*09537850SAkhilesh Sanikop base_cfl_intra_pred_ = dsp->cfl_intra_predictors[tx_size_];
150*09537850SAkhilesh Sanikop
151*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
152*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
153*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
154*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "C/")) {
155*09537850SAkhilesh Sanikop base_cfl_intra_pred_ = nullptr;
156*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "NEON/")) {
157*09537850SAkhilesh Sanikop IntraPredCflInit_NEON();
158*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "SSE41/")) {
159*09537850SAkhilesh Sanikop if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
160*09537850SAkhilesh Sanikop IntraPredCflInit_SSE4_1();
161*09537850SAkhilesh Sanikop } else {
162*09537850SAkhilesh Sanikop FAIL() << "Unrecognized architecture prefix in test case name: "
163*09537850SAkhilesh Sanikop << test_case;
164*09537850SAkhilesh Sanikop }
165*09537850SAkhilesh Sanikop
166*09537850SAkhilesh Sanikop cur_cfl_intra_pred_ = dsp->cfl_intra_predictors[tx_size_];
167*09537850SAkhilesh Sanikop
168*09537850SAkhilesh Sanikop if (cur_cfl_intra_pred_ == base_cfl_intra_pred_) {
169*09537850SAkhilesh Sanikop cur_cfl_intra_pred_ = nullptr;
170*09537850SAkhilesh Sanikop }
171*09537850SAkhilesh Sanikop }
172*09537850SAkhilesh Sanikop
173*09537850SAkhilesh Sanikop // This test modifies intra_pred_mem_.
174*09537850SAkhilesh Sanikop void TestSpeed(const char* digest, int num_runs);
175*09537850SAkhilesh Sanikop void TestSaturatedValues();
176*09537850SAkhilesh Sanikop void TestRandomValues();
177*09537850SAkhilesh Sanikop
178*09537850SAkhilesh Sanikop CflIntraPredictorFunc base_cfl_intra_pred_;
179*09537850SAkhilesh Sanikop CflIntraPredictorFunc cur_cfl_intra_pred_;
180*09537850SAkhilesh Sanikop };
181*09537850SAkhilesh Sanikop
182*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
TestSpeed(const char * const digest,const int num_runs)183*09537850SAkhilesh Sanikop void CflIntraPredTest<bitdepth, Pixel>::TestSpeed(const char* const digest,
184*09537850SAkhilesh Sanikop const int num_runs) {
185*09537850SAkhilesh Sanikop if (cur_cfl_intra_pred_ == nullptr) return;
186*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
187*09537850SAkhilesh Sanikop int16_t luma[kCflLumaBufferStride][kCflLumaBufferStride] = {};
188*09537850SAkhilesh Sanikop const int alpha = rnd(33) - 16;
189*09537850SAkhilesh Sanikop const int dc = rnd(1 << bitdepth);
190*09537850SAkhilesh Sanikop const int max_luma = ((1 << bitdepth) - 1) << 3;
191*09537850SAkhilesh Sanikop for (int i = 0; i < block_height_; ++i) {
192*09537850SAkhilesh Sanikop for (int j = 0; j < block_width_; ++j) {
193*09537850SAkhilesh Sanikop if (i < kCflLumaBufferStride && j < kCflLumaBufferStride) {
194*09537850SAkhilesh Sanikop luma[i][j] = max_luma - rnd(max_luma << 1);
195*09537850SAkhilesh Sanikop }
196*09537850SAkhilesh Sanikop }
197*09537850SAkhilesh Sanikop }
198*09537850SAkhilesh Sanikop for (auto& r : intra_pred_mem_.ref_src) r = dc;
199*09537850SAkhilesh Sanikop
200*09537850SAkhilesh Sanikop absl::Duration elapsed_time;
201*09537850SAkhilesh Sanikop for (int run = 0; run < num_runs; ++run) {
202*09537850SAkhilesh Sanikop const ptrdiff_t stride = kMaxBlockSize * sizeof(Pixel);
203*09537850SAkhilesh Sanikop memcpy(intra_pred_mem_.dst, intra_pred_mem_.ref_src,
204*09537850SAkhilesh Sanikop sizeof(intra_pred_mem_.dst));
205*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
206*09537850SAkhilesh Sanikop cur_cfl_intra_pred_(intra_pred_mem_.dst, stride, luma, alpha);
207*09537850SAkhilesh Sanikop elapsed_time += absl::Now() - start;
208*09537850SAkhilesh Sanikop }
209*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(ToString(tx_size_), kCflIntraPredName, digest,
210*09537850SAkhilesh Sanikop intra_pred_mem_.dst, sizeof(intra_pred_mem_.dst),
211*09537850SAkhilesh Sanikop elapsed_time);
212*09537850SAkhilesh Sanikop }
213*09537850SAkhilesh Sanikop
214*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
TestSaturatedValues()215*09537850SAkhilesh Sanikop void CflIntraPredTest<bitdepth, Pixel>::TestSaturatedValues() {
216*09537850SAkhilesh Sanikop // Skip the 'C' test case as this is used as the reference.
217*09537850SAkhilesh Sanikop if (base_cfl_intra_pred_ == nullptr) return;
218*09537850SAkhilesh Sanikop
219*09537850SAkhilesh Sanikop int16_t luma_buffer[kCflLumaBufferStride][kCflLumaBufferStride];
220*09537850SAkhilesh Sanikop for (auto& line : luma_buffer) {
221*09537850SAkhilesh Sanikop for (auto& luma : line) luma = ((1 << bitdepth) - 1) << 3;
222*09537850SAkhilesh Sanikop }
223*09537850SAkhilesh Sanikop
224*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
225*09537850SAkhilesh Sanikop static constexpr int kSaturatedAlpha[] = {-16, 16};
226*09537850SAkhilesh Sanikop for (const int alpha : kSaturatedAlpha) {
227*09537850SAkhilesh Sanikop for (auto& r : intra_pred_mem_.ref_src) r = (1 << bitdepth) - 1;
228*09537850SAkhilesh Sanikop memcpy(intra_pred_mem_.dst, intra_pred_mem_.ref_src,
229*09537850SAkhilesh Sanikop sizeof(intra_pred_mem_.dst));
230*09537850SAkhilesh Sanikop const ptrdiff_t stride = kMaxBlockSize * sizeof(Pixel);
231*09537850SAkhilesh Sanikop base_cfl_intra_pred_(intra_pred_mem_.ref_src, stride, luma_buffer, alpha);
232*09537850SAkhilesh Sanikop cur_cfl_intra_pred_(intra_pred_mem_.dst, stride, luma_buffer, alpha);
233*09537850SAkhilesh Sanikop if (!test_utils::CompareBlocks(intra_pred_mem_.dst, intra_pred_mem_.ref_src,
234*09537850SAkhilesh Sanikop block_width_, block_height_, kMaxBlockSize,
235*09537850SAkhilesh Sanikop kMaxBlockSize, true)) {
236*09537850SAkhilesh Sanikop ADD_FAILURE() << "Result from optimized version of CFL with alpha "
237*09537850SAkhilesh Sanikop << alpha << " differs from reference.";
238*09537850SAkhilesh Sanikop break;
239*09537850SAkhilesh Sanikop }
240*09537850SAkhilesh Sanikop }
241*09537850SAkhilesh Sanikop }
242*09537850SAkhilesh Sanikop
243*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
TestRandomValues()244*09537850SAkhilesh Sanikop void CflIntraPredTest<bitdepth, Pixel>::TestRandomValues() {
245*09537850SAkhilesh Sanikop // Skip the 'C' test case as this is used as the reference.
246*09537850SAkhilesh Sanikop if (base_cfl_intra_pred_ == nullptr) return;
247*09537850SAkhilesh Sanikop int16_t luma_buffer[kCflLumaBufferStride][kCflLumaBufferStride];
248*09537850SAkhilesh Sanikop
249*09537850SAkhilesh Sanikop const int max_luma = ((1 << bitdepth) - 1) << 3;
250*09537850SAkhilesh Sanikop // Use an alternate seed to differentiate this test from TestSpeed().
251*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(test_utils::kAlternateDeterministicSeed);
252*09537850SAkhilesh Sanikop for (auto& line : luma_buffer) {
253*09537850SAkhilesh Sanikop for (auto& luma : line) luma = max_luma - rnd(max_luma << 1);
254*09537850SAkhilesh Sanikop }
255*09537850SAkhilesh Sanikop const int dc = rnd(1 << bitdepth);
256*09537850SAkhilesh Sanikop for (auto& r : intra_pred_mem_.ref_src) r = dc;
257*09537850SAkhilesh Sanikop static constexpr int kSaturatedAlpha[] = {-16, 16};
258*09537850SAkhilesh Sanikop for (const int alpha : kSaturatedAlpha) {
259*09537850SAkhilesh Sanikop intra_pred_mem_.Reset(&rnd);
260*09537850SAkhilesh Sanikop memcpy(intra_pred_mem_.dst, intra_pred_mem_.ref_src,
261*09537850SAkhilesh Sanikop sizeof(intra_pred_mem_.dst));
262*09537850SAkhilesh Sanikop const ptrdiff_t stride = kMaxBlockSize * sizeof(Pixel);
263*09537850SAkhilesh Sanikop base_cfl_intra_pred_(intra_pred_mem_.ref_src, stride, luma_buffer, alpha);
264*09537850SAkhilesh Sanikop cur_cfl_intra_pred_(intra_pred_mem_.dst, stride, luma_buffer, alpha);
265*09537850SAkhilesh Sanikop if (!test_utils::CompareBlocks(intra_pred_mem_.dst, intra_pred_mem_.ref_src,
266*09537850SAkhilesh Sanikop block_width_, block_height_, kMaxBlockSize,
267*09537850SAkhilesh Sanikop kMaxBlockSize, true)) {
268*09537850SAkhilesh Sanikop ADD_FAILURE() << "Result from optimized version of CFL with alpha "
269*09537850SAkhilesh Sanikop << alpha << " differs from reference.";
270*09537850SAkhilesh Sanikop break;
271*09537850SAkhilesh Sanikop }
272*09537850SAkhilesh Sanikop }
273*09537850SAkhilesh Sanikop }
274*09537850SAkhilesh Sanikop
275*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel, SubsamplingType subsampling_type>
276*09537850SAkhilesh Sanikop class CflSubsamplerTest : public IntraPredTestBase<bitdepth, Pixel> {
277*09537850SAkhilesh Sanikop public:
278*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
279*09537850SAkhilesh Sanikop CflSubsamplerTest() = default;
280*09537850SAkhilesh Sanikop CflSubsamplerTest(const CflSubsamplerTest&) = delete;
281*09537850SAkhilesh Sanikop CflSubsamplerTest& operator=(const CflSubsamplerTest&) = delete;
282*09537850SAkhilesh Sanikop ~CflSubsamplerTest() override = default;
283*09537850SAkhilesh Sanikop
284*09537850SAkhilesh Sanikop protected:
285*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::tx_size_;
286*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::block_width_;
287*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::block_height_;
288*09537850SAkhilesh Sanikop using IntraPredTestBase<bitdepth, Pixel>::intra_pred_mem_;
289*09537850SAkhilesh Sanikop
SetUp()290*09537850SAkhilesh Sanikop void SetUp() override {
291*09537850SAkhilesh Sanikop IntraPredTestBase<bitdepth, Pixel>::SetUp();
292*09537850SAkhilesh Sanikop IntraPredCflInit_C();
293*09537850SAkhilesh Sanikop
294*09537850SAkhilesh Sanikop const Dsp* const dsp = GetDspTable(bitdepth);
295*09537850SAkhilesh Sanikop ASSERT_NE(dsp, nullptr);
296*09537850SAkhilesh Sanikop base_cfl_subsampler_ = dsp->cfl_subsamplers[tx_size_][subsampling_type];
297*09537850SAkhilesh Sanikop
298*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
299*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
300*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
301*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "C/")) {
302*09537850SAkhilesh Sanikop base_cfl_subsampler_ = nullptr;
303*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "NEON/")) {
304*09537850SAkhilesh Sanikop IntraPredCflInit_NEON();
305*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "SSE41/")) {
306*09537850SAkhilesh Sanikop if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
307*09537850SAkhilesh Sanikop IntraPredCflInit_SSE4_1();
308*09537850SAkhilesh Sanikop } else {
309*09537850SAkhilesh Sanikop FAIL() << "Unrecognized architecture prefix in test case name: "
310*09537850SAkhilesh Sanikop << test_case;
311*09537850SAkhilesh Sanikop }
312*09537850SAkhilesh Sanikop cur_cfl_subsampler_ = dsp->cfl_subsamplers[tx_size_][subsampling_type];
313*09537850SAkhilesh Sanikop }
314*09537850SAkhilesh Sanikop
315*09537850SAkhilesh Sanikop // This test modifies intra_pred_mem_.
316*09537850SAkhilesh Sanikop void TestSpeed(const char* digest, int num_runs);
317*09537850SAkhilesh Sanikop void TestSaturatedValues();
318*09537850SAkhilesh Sanikop void TestRandomValues();
319*09537850SAkhilesh Sanikop
SubsamplingType() const320*09537850SAkhilesh Sanikop enum SubsamplingType SubsamplingType() const { return subsampling_type; }
321*09537850SAkhilesh Sanikop
322*09537850SAkhilesh Sanikop CflSubsamplerFunc base_cfl_subsampler_;
323*09537850SAkhilesh Sanikop CflSubsamplerFunc cur_cfl_subsampler_;
324*09537850SAkhilesh Sanikop };
325*09537850SAkhilesh Sanikop
326*09537850SAkhilesh Sanikop // There is no case where both source and output have lowest height or width
327*09537850SAkhilesh Sanikop // when that dimension is subsampled.
GetLumaWidth(int block_width,SubsamplingType subsampling_type)328*09537850SAkhilesh Sanikop int GetLumaWidth(int block_width, SubsamplingType subsampling_type) {
329*09537850SAkhilesh Sanikop if (block_width == 4) {
330*09537850SAkhilesh Sanikop const int width_shift =
331*09537850SAkhilesh Sanikop static_cast<int>(subsampling_type != kSubsamplingType444);
332*09537850SAkhilesh Sanikop return block_width << width_shift;
333*09537850SAkhilesh Sanikop }
334*09537850SAkhilesh Sanikop return block_width;
335*09537850SAkhilesh Sanikop }
336*09537850SAkhilesh Sanikop
GetLumaHeight(int block_height,SubsamplingType subsampling_type)337*09537850SAkhilesh Sanikop int GetLumaHeight(int block_height, SubsamplingType subsampling_type) {
338*09537850SAkhilesh Sanikop if (block_height == 4) {
339*09537850SAkhilesh Sanikop const int height_shift =
340*09537850SAkhilesh Sanikop static_cast<int>(subsampling_type == kSubsamplingType420);
341*09537850SAkhilesh Sanikop return block_height << height_shift;
342*09537850SAkhilesh Sanikop }
343*09537850SAkhilesh Sanikop return block_height;
344*09537850SAkhilesh Sanikop }
345*09537850SAkhilesh Sanikop
346*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel, SubsamplingType subsampling_type>
TestSpeed(const char * const digest,const int num_runs)347*09537850SAkhilesh Sanikop void CflSubsamplerTest<bitdepth, Pixel, subsampling_type>::TestSpeed(
348*09537850SAkhilesh Sanikop const char* const digest, const int num_runs) {
349*09537850SAkhilesh Sanikop // C declines initializing the table in normal circumstances because there are
350*09537850SAkhilesh Sanikop // assembly implementations.
351*09537850SAkhilesh Sanikop if (cur_cfl_subsampler_ == nullptr) return;
352*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
353*09537850SAkhilesh Sanikop
354*09537850SAkhilesh Sanikop const int width = GetLumaWidth(block_width_, subsampling_type);
355*09537850SAkhilesh Sanikop const int height = GetLumaHeight(block_height_, subsampling_type);
356*09537850SAkhilesh Sanikop Pixel* src = intra_pred_mem_.ref_src;
357*09537850SAkhilesh Sanikop #if LIBGAV1_MSAN
358*09537850SAkhilesh Sanikop // Quiet 10bpp CflSubsampler420_NEON() msan warning.
359*09537850SAkhilesh Sanikop memset(src, 0, sizeof(intra_pred_mem_.ref_src));
360*09537850SAkhilesh Sanikop #endif
361*09537850SAkhilesh Sanikop for (int i = 0; i < height; ++i) {
362*09537850SAkhilesh Sanikop for (int j = 0; j < width; ++j) {
363*09537850SAkhilesh Sanikop src[j] = rnd.RandRange(1 << bitdepth);
364*09537850SAkhilesh Sanikop }
365*09537850SAkhilesh Sanikop src += kMaxBlockSize;
366*09537850SAkhilesh Sanikop }
367*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
368*09537850SAkhilesh Sanikop int16_t luma[kCflLumaBufferStride][kCflLumaBufferStride] = {};
369*09537850SAkhilesh Sanikop const ptrdiff_t stride = kMaxBlockSize * sizeof(Pixel);
370*09537850SAkhilesh Sanikop for (int run = 0; run < num_runs; ++run) {
371*09537850SAkhilesh Sanikop cur_cfl_subsampler_(luma, width, height, intra_pred_mem_.ref_src, stride);
372*09537850SAkhilesh Sanikop }
373*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
374*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(ToString(tx_size_), kCflIntraPredName, digest,
375*09537850SAkhilesh Sanikop luma, sizeof(luma), elapsed_time);
376*09537850SAkhilesh Sanikop }
377*09537850SAkhilesh Sanikop
378*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel, SubsamplingType subsampling_type>
379*09537850SAkhilesh Sanikop void CflSubsamplerTest<bitdepth, Pixel,
TestSaturatedValues()380*09537850SAkhilesh Sanikop subsampling_type>::TestSaturatedValues() {
381*09537850SAkhilesh Sanikop if (base_cfl_subsampler_ == nullptr) return;
382*09537850SAkhilesh Sanikop const ptrdiff_t stride = kMaxBlockSize * sizeof(Pixel);
383*09537850SAkhilesh Sanikop for (int width = GetLumaWidth(block_width_, subsampling_type); width > 0;
384*09537850SAkhilesh Sanikop width -= 8) {
385*09537850SAkhilesh Sanikop for (int height = GetLumaHeight(block_height_, subsampling_type);
386*09537850SAkhilesh Sanikop height > 0; height -= 8) {
387*09537850SAkhilesh Sanikop Pixel* src = intra_pred_mem_.ref_src;
388*09537850SAkhilesh Sanikop for (int y = 0; y < height; ++y) {
389*09537850SAkhilesh Sanikop Memset(src, (1 << bitdepth) - 1, width);
390*09537850SAkhilesh Sanikop Memset(src + width, 0, kMaxBlockSize - width);
391*09537850SAkhilesh Sanikop src += kMaxBlockSize;
392*09537850SAkhilesh Sanikop }
393*09537850SAkhilesh Sanikop Memset(intra_pred_mem_.ref_src + kMaxBlockSize * height, 0,
394*09537850SAkhilesh Sanikop kMaxBlockSize * (kMaxBlockSize - height));
395*09537850SAkhilesh Sanikop
396*09537850SAkhilesh Sanikop int16_t luma_base[kCflLumaBufferStride][kCflLumaBufferStride] = {};
397*09537850SAkhilesh Sanikop int16_t luma_cur[kCflLumaBufferStride][kCflLumaBufferStride] = {};
398*09537850SAkhilesh Sanikop base_cfl_subsampler_(luma_base, width, height, intra_pred_mem_.ref_src,
399*09537850SAkhilesh Sanikop stride);
400*09537850SAkhilesh Sanikop cur_cfl_subsampler_(luma_cur, width, height, intra_pred_mem_.ref_src,
401*09537850SAkhilesh Sanikop stride);
402*09537850SAkhilesh Sanikop if (!test_utils::CompareBlocks(reinterpret_cast<uint16_t*>(luma_cur[0]),
403*09537850SAkhilesh Sanikop reinterpret_cast<uint16_t*>(luma_base[0]),
404*09537850SAkhilesh Sanikop block_width_, block_height_,
405*09537850SAkhilesh Sanikop kCflLumaBufferStride, kCflLumaBufferStride,
406*09537850SAkhilesh Sanikop true)) {
407*09537850SAkhilesh Sanikop FAIL() << "Result from optimized version of CFL subsampler"
408*09537850SAkhilesh Sanikop << " differs from reference. max_luma_width: " << width
409*09537850SAkhilesh Sanikop << " max_luma_height: " << height;
410*09537850SAkhilesh Sanikop }
411*09537850SAkhilesh Sanikop }
412*09537850SAkhilesh Sanikop }
413*09537850SAkhilesh Sanikop }
414*09537850SAkhilesh Sanikop
415*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel, SubsamplingType subsampling_type>
TestRandomValues()416*09537850SAkhilesh Sanikop void CflSubsamplerTest<bitdepth, Pixel, subsampling_type>::TestRandomValues() {
417*09537850SAkhilesh Sanikop if (base_cfl_subsampler_ == nullptr) return;
418*09537850SAkhilesh Sanikop const ptrdiff_t stride = kMaxBlockSize * sizeof(Pixel);
419*09537850SAkhilesh Sanikop // Use an alternate seed to differentiate this test from TestSpeed().
420*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(test_utils::kAlternateDeterministicSeed);
421*09537850SAkhilesh Sanikop for (int width = GetLumaWidth(block_width_, subsampling_type); width > 0;
422*09537850SAkhilesh Sanikop width -= 8) {
423*09537850SAkhilesh Sanikop for (int height = GetLumaHeight(block_height_, subsampling_type);
424*09537850SAkhilesh Sanikop height > 0; height -= 8) {
425*09537850SAkhilesh Sanikop Pixel* src = intra_pred_mem_.ref_src;
426*09537850SAkhilesh Sanikop for (int i = 0; i < height; ++i) {
427*09537850SAkhilesh Sanikop for (int j = 0; j < width; ++j) {
428*09537850SAkhilesh Sanikop src[j] = rnd.RandRange(1 << bitdepth);
429*09537850SAkhilesh Sanikop }
430*09537850SAkhilesh Sanikop Memset(src + width, 0, kMaxBlockSize - width);
431*09537850SAkhilesh Sanikop src += kMaxBlockSize;
432*09537850SAkhilesh Sanikop }
433*09537850SAkhilesh Sanikop Memset(intra_pred_mem_.ref_src + kMaxBlockSize * height, 0,
434*09537850SAkhilesh Sanikop kMaxBlockSize * (kMaxBlockSize - height));
435*09537850SAkhilesh Sanikop
436*09537850SAkhilesh Sanikop int16_t luma_base[kCflLumaBufferStride][kCflLumaBufferStride] = {};
437*09537850SAkhilesh Sanikop int16_t luma_cur[kCflLumaBufferStride][kCflLumaBufferStride] = {};
438*09537850SAkhilesh Sanikop base_cfl_subsampler_(luma_base, width, height, intra_pred_mem_.ref_src,
439*09537850SAkhilesh Sanikop stride);
440*09537850SAkhilesh Sanikop cur_cfl_subsampler_(luma_cur, width, height, intra_pred_mem_.ref_src,
441*09537850SAkhilesh Sanikop stride);
442*09537850SAkhilesh Sanikop if (!test_utils::CompareBlocks(reinterpret_cast<uint16_t*>(luma_cur[0]),
443*09537850SAkhilesh Sanikop reinterpret_cast<uint16_t*>(luma_base[0]),
444*09537850SAkhilesh Sanikop block_width_, block_height_,
445*09537850SAkhilesh Sanikop kCflLumaBufferStride, kCflLumaBufferStride,
446*09537850SAkhilesh Sanikop true)) {
447*09537850SAkhilesh Sanikop FAIL() << "Result from optimized version of CFL subsampler"
448*09537850SAkhilesh Sanikop << " differs from reference. max_luma_width: " << width
449*09537850SAkhilesh Sanikop << " max_luma_height: " << height;
450*09537850SAkhilesh Sanikop }
451*09537850SAkhilesh Sanikop }
452*09537850SAkhilesh Sanikop }
453*09537850SAkhilesh Sanikop }
454*09537850SAkhilesh Sanikop
455*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
456*09537850SAkhilesh Sanikop
457*09537850SAkhilesh Sanikop using CflIntraPredTest8bpp = CflIntraPredTest<8, uint8_t>;
458*09537850SAkhilesh Sanikop
GetCflIntraPredDigest8bpp(TransformSize tx_size)459*09537850SAkhilesh Sanikop const char* GetCflIntraPredDigest8bpp(TransformSize tx_size) {
460*09537850SAkhilesh Sanikop static const char* const kDigest4x4 = "9ea7088e082867fd5ae394ca549fe1ed";
461*09537850SAkhilesh Sanikop static const char* const kDigest4x8 = "323b0b4784b6658da781398e61f2da3d";
462*09537850SAkhilesh Sanikop static const char* const kDigest4x16 = "99eb9c65f227ca7f71dcac24645a4fec";
463*09537850SAkhilesh Sanikop static const char* const kDigest8x4 = "e8e782e31c94f3974b87b93d455262d8";
464*09537850SAkhilesh Sanikop static const char* const kDigest8x8 = "23ab9fb65e7bbbdb985709e115115eb5";
465*09537850SAkhilesh Sanikop static const char* const kDigest8x16 = "52f5add2fc4bbb2ff893148645e95b9c";
466*09537850SAkhilesh Sanikop static const char* const kDigest8x32 = "283fdee9af8afdb76f72dd7339c92c3c";
467*09537850SAkhilesh Sanikop static const char* const kDigest16x4 = "eead35f515b1aa8b5175b283192b86e6";
468*09537850SAkhilesh Sanikop static const char* const kDigest16x8 = "5778e934254eaab04230bc370f64f778";
469*09537850SAkhilesh Sanikop static const char* const kDigest16x16 = "4e8ed38ccba0d62f1213171da2212ed3";
470*09537850SAkhilesh Sanikop static const char* const kDigest16x32 = "61a29bd7699e18ca6ea5641d1d023bfd";
471*09537850SAkhilesh Sanikop static const char* const kDigest32x8 = "7f31607bd4f9ec879aa47f4daf9c7bb0";
472*09537850SAkhilesh Sanikop static const char* const kDigest32x16 = "eb84dfab900fa6a90e132b186b4c6c36";
473*09537850SAkhilesh Sanikop static const char* const kDigest32x32 = "e0ff35d407cb214578d61ef419c94237";
474*09537850SAkhilesh Sanikop
475*09537850SAkhilesh Sanikop switch (tx_size) {
476*09537850SAkhilesh Sanikop case kTransformSize4x4:
477*09537850SAkhilesh Sanikop return kDigest4x4;
478*09537850SAkhilesh Sanikop case kTransformSize4x8:
479*09537850SAkhilesh Sanikop return kDigest4x8;
480*09537850SAkhilesh Sanikop case kTransformSize4x16:
481*09537850SAkhilesh Sanikop return kDigest4x16;
482*09537850SAkhilesh Sanikop case kTransformSize8x4:
483*09537850SAkhilesh Sanikop return kDigest8x4;
484*09537850SAkhilesh Sanikop case kTransformSize8x8:
485*09537850SAkhilesh Sanikop return kDigest8x8;
486*09537850SAkhilesh Sanikop case kTransformSize8x16:
487*09537850SAkhilesh Sanikop return kDigest8x16;
488*09537850SAkhilesh Sanikop case kTransformSize8x32:
489*09537850SAkhilesh Sanikop return kDigest8x32;
490*09537850SAkhilesh Sanikop case kTransformSize16x4:
491*09537850SAkhilesh Sanikop return kDigest16x4;
492*09537850SAkhilesh Sanikop case kTransformSize16x8:
493*09537850SAkhilesh Sanikop return kDigest16x8;
494*09537850SAkhilesh Sanikop case kTransformSize16x16:
495*09537850SAkhilesh Sanikop return kDigest16x16;
496*09537850SAkhilesh Sanikop case kTransformSize16x32:
497*09537850SAkhilesh Sanikop return kDigest16x32;
498*09537850SAkhilesh Sanikop case kTransformSize32x8:
499*09537850SAkhilesh Sanikop return kDigest32x8;
500*09537850SAkhilesh Sanikop case kTransformSize32x16:
501*09537850SAkhilesh Sanikop return kDigest32x16;
502*09537850SAkhilesh Sanikop case kTransformSize32x32:
503*09537850SAkhilesh Sanikop return kDigest32x32;
504*09537850SAkhilesh Sanikop default:
505*09537850SAkhilesh Sanikop ADD_FAILURE() << "Unknown transform size: " << tx_size;
506*09537850SAkhilesh Sanikop return nullptr;
507*09537850SAkhilesh Sanikop }
508*09537850SAkhilesh Sanikop }
509*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest8bpp,DISABLED_Speed)510*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest8bpp, DISABLED_Speed) {
511*09537850SAkhilesh Sanikop const auto num_runs =
512*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
513*09537850SAkhilesh Sanikop TestSpeed(GetCflIntraPredDigest8bpp(tx_size_), num_runs);
514*09537850SAkhilesh Sanikop }
515*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest8bpp,FixedInput)516*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest8bpp, FixedInput) {
517*09537850SAkhilesh Sanikop TestSpeed(GetCflIntraPredDigest8bpp(tx_size_), 1);
518*09537850SAkhilesh Sanikop }
519*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest8bpp,Overflow)520*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest8bpp, Overflow) { TestSaturatedValues(); }
521*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest8bpp,Random)522*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest8bpp, Random) { TestRandomValues(); }
523*09537850SAkhilesh Sanikop
524*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
525*09537850SAkhilesh Sanikop
526*09537850SAkhilesh Sanikop using CflSubsamplerTest8bpp444 =
527*09537850SAkhilesh Sanikop CflSubsamplerTest<8, uint8_t, kSubsamplingType444>;
528*09537850SAkhilesh Sanikop using CflSubsamplerTest8bpp422 =
529*09537850SAkhilesh Sanikop CflSubsamplerTest<8, uint8_t, kSubsamplingType422>;
530*09537850SAkhilesh Sanikop using CflSubsamplerTest8bpp420 =
531*09537850SAkhilesh Sanikop CflSubsamplerTest<8, uint8_t, kSubsamplingType420>;
532*09537850SAkhilesh Sanikop
GetCflSubsamplerDigest8bpp(TransformSize tx_size,SubsamplingType subsampling_type)533*09537850SAkhilesh Sanikop const char* GetCflSubsamplerDigest8bpp(TransformSize tx_size,
534*09537850SAkhilesh Sanikop SubsamplingType subsampling_type) {
535*09537850SAkhilesh Sanikop static const char* const kDigests4x4[3] = {
536*09537850SAkhilesh Sanikop "a8fa98d76cc3ccffcffc0d02dfae052c", "929cf2c23d926b500616797f8b1baf5b",
537*09537850SAkhilesh Sanikop "1d03f091956838e7f2b113aabd8b9da9"};
538*09537850SAkhilesh Sanikop static const char* const kDigests4x8[3] = {
539*09537850SAkhilesh Sanikop "717b84f867f413c87c90a7c5d0125c8c", "6ccd9f48842b1a802e128b46b8f4885d",
540*09537850SAkhilesh Sanikop "68a334f5d2abecbc78562b3280b5fb0c"};
541*09537850SAkhilesh Sanikop static const char* const kDigests4x16[3] = {
542*09537850SAkhilesh Sanikop "ecd1340b7e065dd8807fd9861abb7d99", "042c3fee17df7ef8fb8cef616f212a91",
543*09537850SAkhilesh Sanikop "b0600f0bc3fbfc374bb3628360dcae5c"};
544*09537850SAkhilesh Sanikop static const char* const kDigests8x4[3] = {
545*09537850SAkhilesh Sanikop "4ea5617f4ed8e9edc2fff88d0ab8e53f", "b02288905f218c9f54ce4a472ec7b22e",
546*09537850SAkhilesh Sanikop "3522d3a4dd3839d1a86fb39b31a86d52"};
547*09537850SAkhilesh Sanikop static const char* const kDigests8x8[3] = {
548*09537850SAkhilesh Sanikop "a0488493e6bcdb868713a95f9b4a0091", "ff6c1ac1d94fce63c282ba49186529bf",
549*09537850SAkhilesh Sanikop "082e34ba04d04d7cd6fe408823987602"};
550*09537850SAkhilesh Sanikop static const char* const kDigests8x16[3] = {
551*09537850SAkhilesh Sanikop "e01dd4bb21daaa6e991cd5b1e6f30300", "2a1b13f932e39cc5f561afea9956f47a",
552*09537850SAkhilesh Sanikop "d8d266282cb7123f780bd7266e8f5913"};
553*09537850SAkhilesh Sanikop static const char* const kDigests8x32[3] = {
554*09537850SAkhilesh Sanikop "0fc95e4ab798b95ccd2966ff75028b03", "6bc6e45ef2f664134449342fe76006ff",
555*09537850SAkhilesh Sanikop "d294fb6399edaa267aa167407c0ebccb"};
556*09537850SAkhilesh Sanikop static const char* const kDigests16x4[3] = {
557*09537850SAkhilesh Sanikop "4798c2cf649b786bd153ad88353d52aa", "43a4bfa3b8caf4b72f58c6a1d1054f64",
558*09537850SAkhilesh Sanikop "a928ebbec2db1508c8831a440d82eb98"};
559*09537850SAkhilesh Sanikop static const char* const kDigests16x8[3] = {
560*09537850SAkhilesh Sanikop "736b7f5b603cb34abcbe1b7e69b6ce93", "90422000ab20ecb519e4d277a9b3ea2b",
561*09537850SAkhilesh Sanikop "c8e71c2fddbb850c5a50592ee5975368"};
562*09537850SAkhilesh Sanikop static const char* const kDigests16x16[3] = {
563*09537850SAkhilesh Sanikop "4f15a694966ee50a9e987e9a0aa2423b", "9e31e2f5a7ce7bef738b135755e25dcd",
564*09537850SAkhilesh Sanikop "2ffeed4d592a0455f6d888913969827f"};
565*09537850SAkhilesh Sanikop static const char* const kDigests16x32[3] = {
566*09537850SAkhilesh Sanikop "3a10438bfe17ea39efad20608a0520eb", "79e8e8732a6ffc29dfbb0b3fc29c2883",
567*09537850SAkhilesh Sanikop "185ca976ccbef7fb5f3f8c6aa22d5a79"};
568*09537850SAkhilesh Sanikop static const char* const kDigests32x8[3] = {
569*09537850SAkhilesh Sanikop "683704f08839a15e42603e4977a3e815", "13d311635372aee8998fca1758e75e20",
570*09537850SAkhilesh Sanikop "9847d88eaaa57c086a2e6aed583048d3"};
571*09537850SAkhilesh Sanikop static const char* const kDigests32x16[3] = {
572*09537850SAkhilesh Sanikop "14b6761bf9f1156cf2496f532512aa99", "ee57bb7f0aa2302d29cdc1bfce72d5fc",
573*09537850SAkhilesh Sanikop "a4189655fe714b82eb88cb5092c0ad76"};
574*09537850SAkhilesh Sanikop static const char* const kDigests32x32[3] = {
575*09537850SAkhilesh Sanikop "dcfbe71b70a37418ccb90dbf27f04226", "c578556a584019c1bdc2d0c3b9fd0c88",
576*09537850SAkhilesh Sanikop "db200bc8ccbeacd6a42d6b8e5ad1d931"};
577*09537850SAkhilesh Sanikop
578*09537850SAkhilesh Sanikop switch (tx_size) {
579*09537850SAkhilesh Sanikop case kTransformSize4x4:
580*09537850SAkhilesh Sanikop return kDigests4x4[subsampling_type];
581*09537850SAkhilesh Sanikop case kTransformSize4x8:
582*09537850SAkhilesh Sanikop return kDigests4x8[subsampling_type];
583*09537850SAkhilesh Sanikop case kTransformSize4x16:
584*09537850SAkhilesh Sanikop return kDigests4x16[subsampling_type];
585*09537850SAkhilesh Sanikop case kTransformSize8x4:
586*09537850SAkhilesh Sanikop return kDigests8x4[subsampling_type];
587*09537850SAkhilesh Sanikop case kTransformSize8x8:
588*09537850SAkhilesh Sanikop return kDigests8x8[subsampling_type];
589*09537850SAkhilesh Sanikop case kTransformSize8x16:
590*09537850SAkhilesh Sanikop return kDigests8x16[subsampling_type];
591*09537850SAkhilesh Sanikop case kTransformSize8x32:
592*09537850SAkhilesh Sanikop return kDigests8x32[subsampling_type];
593*09537850SAkhilesh Sanikop case kTransformSize16x4:
594*09537850SAkhilesh Sanikop return kDigests16x4[subsampling_type];
595*09537850SAkhilesh Sanikop case kTransformSize16x8:
596*09537850SAkhilesh Sanikop return kDigests16x8[subsampling_type];
597*09537850SAkhilesh Sanikop case kTransformSize16x16:
598*09537850SAkhilesh Sanikop return kDigests16x16[subsampling_type];
599*09537850SAkhilesh Sanikop case kTransformSize16x32:
600*09537850SAkhilesh Sanikop return kDigests16x32[subsampling_type];
601*09537850SAkhilesh Sanikop case kTransformSize32x8:
602*09537850SAkhilesh Sanikop return kDigests32x8[subsampling_type];
603*09537850SAkhilesh Sanikop case kTransformSize32x16:
604*09537850SAkhilesh Sanikop return kDigests32x16[subsampling_type];
605*09537850SAkhilesh Sanikop case kTransformSize32x32:
606*09537850SAkhilesh Sanikop return kDigests32x32[subsampling_type];
607*09537850SAkhilesh Sanikop default:
608*09537850SAkhilesh Sanikop ADD_FAILURE() << "Unknown transform size: " << tx_size;
609*09537850SAkhilesh Sanikop return nullptr;
610*09537850SAkhilesh Sanikop }
611*09537850SAkhilesh Sanikop }
612*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp444,DISABLED_Speed)613*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp444, DISABLED_Speed) {
614*09537850SAkhilesh Sanikop const auto num_runs =
615*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
616*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest8bpp(tx_size_, SubsamplingType()), num_runs);
617*09537850SAkhilesh Sanikop }
618*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp444,FixedInput)619*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp444, FixedInput) {
620*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest8bpp(tx_size_, SubsamplingType()), 1);
621*09537850SAkhilesh Sanikop }
622*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp444,Overflow)623*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp444, Overflow) { TestSaturatedValues(); }
624*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp444,Random)625*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp444, Random) { TestRandomValues(); }
626*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp422,DISABLED_Speed)627*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp422, DISABLED_Speed) {
628*09537850SAkhilesh Sanikop const auto num_runs =
629*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
630*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest8bpp(tx_size_, SubsamplingType()), num_runs);
631*09537850SAkhilesh Sanikop }
632*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp422,FixedInput)633*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp422, FixedInput) {
634*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest8bpp(tx_size_, SubsamplingType()), 1);
635*09537850SAkhilesh Sanikop }
636*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp422,Overflow)637*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp422, Overflow) { TestSaturatedValues(); }
638*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp422,Random)639*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp422, Random) { TestRandomValues(); }
640*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp420,DISABLED_Speed)641*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp420, DISABLED_Speed) {
642*09537850SAkhilesh Sanikop const auto num_runs =
643*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
644*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest8bpp(tx_size_, SubsamplingType()), num_runs);
645*09537850SAkhilesh Sanikop }
646*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp420,FixedInput)647*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp420, FixedInput) {
648*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest8bpp(tx_size_, SubsamplingType()), 1);
649*09537850SAkhilesh Sanikop }
650*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp420,Overflow)651*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp420, Overflow) { TestSaturatedValues(); }
652*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest8bpp420,Random)653*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest8bpp420, Random) { TestRandomValues(); }
654*09537850SAkhilesh Sanikop
655*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
656*09537850SAkhilesh Sanikop
657*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
658*09537850SAkhilesh Sanikop using CflIntraPredTest10bpp = CflIntraPredTest<10, uint16_t>;
659*09537850SAkhilesh Sanikop
GetCflIntraPredDigest10bpp(TransformSize tx_size)660*09537850SAkhilesh Sanikop const char* GetCflIntraPredDigest10bpp(TransformSize tx_size) {
661*09537850SAkhilesh Sanikop static const char* const kDigest4x4 = "b4ca5f6fbb643a94eb05d59976d44c5d";
662*09537850SAkhilesh Sanikop static const char* const kDigest4x8 = "040139b76ee22af05c56baf887d3d43b";
663*09537850SAkhilesh Sanikop static const char* const kDigest4x16 = "4a1d59ace84ff07e68a0d30e9b1cebdd";
664*09537850SAkhilesh Sanikop static const char* const kDigest8x4 = "c2c149cea5fdcd18bfe5c19ec2a8aa90";
665*09537850SAkhilesh Sanikop static const char* const kDigest8x8 = "68ad90bd6f409548fa5551496b7cb0d0";
666*09537850SAkhilesh Sanikop static const char* const kDigest8x16 = "bdc54eff4de8c5d597b03afaa705d3fe";
667*09537850SAkhilesh Sanikop static const char* const kDigest8x32 = "362aebc6d68ff0d312d55dcd6a8a927d";
668*09537850SAkhilesh Sanikop static const char* const kDigest16x4 = "349e813aedd211581c5e64ba1938eaa7";
669*09537850SAkhilesh Sanikop static const char* const kDigest16x8 = "35c64f6da17f836618b5804185cf3eef";
670*09537850SAkhilesh Sanikop static const char* const kDigest16x16 = "95be0c78dbd8dda793c62c6635b4bfb7";
671*09537850SAkhilesh Sanikop static const char* const kDigest16x32 = "4752b9eda069854d3f5c56d3f2057e79";
672*09537850SAkhilesh Sanikop static const char* const kDigest32x8 = "dafc5e973e4b6a55861f4586a11b7dd1";
673*09537850SAkhilesh Sanikop static const char* const kDigest32x16 = "1e177ed3914a165183916aca1d01bb74";
674*09537850SAkhilesh Sanikop static const char* const kDigest32x32 = "4c9ab3cf9baa27bb34e29729dabc1ea6";
675*09537850SAkhilesh Sanikop
676*09537850SAkhilesh Sanikop switch (tx_size) {
677*09537850SAkhilesh Sanikop case kTransformSize4x4:
678*09537850SAkhilesh Sanikop return kDigest4x4;
679*09537850SAkhilesh Sanikop case kTransformSize4x8:
680*09537850SAkhilesh Sanikop return kDigest4x8;
681*09537850SAkhilesh Sanikop case kTransformSize4x16:
682*09537850SAkhilesh Sanikop return kDigest4x16;
683*09537850SAkhilesh Sanikop case kTransformSize8x4:
684*09537850SAkhilesh Sanikop return kDigest8x4;
685*09537850SAkhilesh Sanikop case kTransformSize8x8:
686*09537850SAkhilesh Sanikop return kDigest8x8;
687*09537850SAkhilesh Sanikop case kTransformSize8x16:
688*09537850SAkhilesh Sanikop return kDigest8x16;
689*09537850SAkhilesh Sanikop case kTransformSize8x32:
690*09537850SAkhilesh Sanikop return kDigest8x32;
691*09537850SAkhilesh Sanikop case kTransformSize16x4:
692*09537850SAkhilesh Sanikop return kDigest16x4;
693*09537850SAkhilesh Sanikop case kTransformSize16x8:
694*09537850SAkhilesh Sanikop return kDigest16x8;
695*09537850SAkhilesh Sanikop case kTransformSize16x16:
696*09537850SAkhilesh Sanikop return kDigest16x16;
697*09537850SAkhilesh Sanikop case kTransformSize16x32:
698*09537850SAkhilesh Sanikop return kDigest16x32;
699*09537850SAkhilesh Sanikop case kTransformSize32x8:
700*09537850SAkhilesh Sanikop return kDigest32x8;
701*09537850SAkhilesh Sanikop case kTransformSize32x16:
702*09537850SAkhilesh Sanikop return kDigest32x16;
703*09537850SAkhilesh Sanikop case kTransformSize32x32:
704*09537850SAkhilesh Sanikop return kDigest32x32;
705*09537850SAkhilesh Sanikop default:
706*09537850SAkhilesh Sanikop ADD_FAILURE() << "Unknown transform size: " << tx_size;
707*09537850SAkhilesh Sanikop return nullptr;
708*09537850SAkhilesh Sanikop }
709*09537850SAkhilesh Sanikop }
710*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest10bpp,DISABLED_Speed)711*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest10bpp, DISABLED_Speed) {
712*09537850SAkhilesh Sanikop const auto num_runs =
713*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
714*09537850SAkhilesh Sanikop TestSpeed(GetCflIntraPredDigest10bpp(tx_size_), num_runs);
715*09537850SAkhilesh Sanikop }
716*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest10bpp,FixedInput)717*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest10bpp, FixedInput) {
718*09537850SAkhilesh Sanikop TestSpeed(GetCflIntraPredDigest10bpp(tx_size_), 1);
719*09537850SAkhilesh Sanikop }
720*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest10bpp,Overflow)721*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest10bpp, Overflow) { TestSaturatedValues(); }
722*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest10bpp,Random)723*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest10bpp, Random) { TestRandomValues(); }
724*09537850SAkhilesh Sanikop
725*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
726*09537850SAkhilesh Sanikop
727*09537850SAkhilesh Sanikop using CflSubsamplerTest10bpp444 =
728*09537850SAkhilesh Sanikop CflSubsamplerTest<10, uint16_t, kSubsamplingType444>;
729*09537850SAkhilesh Sanikop using CflSubsamplerTest10bpp422 =
730*09537850SAkhilesh Sanikop CflSubsamplerTest<10, uint16_t, kSubsamplingType422>;
731*09537850SAkhilesh Sanikop using CflSubsamplerTest10bpp420 =
732*09537850SAkhilesh Sanikop CflSubsamplerTest<10, uint16_t, kSubsamplingType420>;
733*09537850SAkhilesh Sanikop
GetCflSubsamplerDigest10bpp(TransformSize tx_size,SubsamplingType subsampling_type)734*09537850SAkhilesh Sanikop const char* GetCflSubsamplerDigest10bpp(TransformSize tx_size,
735*09537850SAkhilesh Sanikop SubsamplingType subsampling_type) {
736*09537850SAkhilesh Sanikop static const char* const kDigests4x4[3] = {
737*09537850SAkhilesh Sanikop "a8abcad9a6c9b046a100689135a108cb", "01081c2a0d0c15dabdbc725be5660451",
738*09537850SAkhilesh Sanikop "93d1d9df2861240d88f5618e42178654"};
739*09537850SAkhilesh Sanikop static const char* const kDigests4x8[3] = {
740*09537850SAkhilesh Sanikop "d1fd8cd0709ca6634ad85f3e331672e1", "0d603fcc910aca3db41fc7f64e826c27",
741*09537850SAkhilesh Sanikop "cf88b6d1b7b025cfa0082361775aeb75"};
742*09537850SAkhilesh Sanikop static const char* const kDigests4x16[3] = {
743*09537850SAkhilesh Sanikop "ce2e036a950388a564d8637b1416a6c6", "6c36c46cd72057a6b36bc12188b6d22c",
744*09537850SAkhilesh Sanikop "0884a0e53384cd5173035ad8966d8f2f"};
745*09537850SAkhilesh Sanikop static const char* const kDigests8x4[3] = {
746*09537850SAkhilesh Sanikop "174e961983ed71fb105ed71aa3f9daf5", "330946cc369a534618a1014b4e3f6f18",
747*09537850SAkhilesh Sanikop "8070668aa389c1d09f8aaf43c1223e8c"};
748*09537850SAkhilesh Sanikop static const char* const kDigests8x8[3] = {
749*09537850SAkhilesh Sanikop "86884feb35217010f73ccdbadecb635e", "b8cbc646e1bf1352e5b4b599eaef1193",
750*09537850SAkhilesh Sanikop "4a1110382e56b42d3b7a4132bccc01ee"};
751*09537850SAkhilesh Sanikop static const char* const kDigests8x16[3] = {
752*09537850SAkhilesh Sanikop "a694c4e1f89648ffb49efd6a1d35b300", "864b9da67d23a2f8284b28b2a1e5aa30",
753*09537850SAkhilesh Sanikop "bd012ca1cea256dd02c231339a4cf200"};
754*09537850SAkhilesh Sanikop static const char* const kDigests8x32[3] = {
755*09537850SAkhilesh Sanikop "60c42201bc24e518c1a3b3b6306d8125", "4d530e47c2b7555d5f311ee910d61842",
756*09537850SAkhilesh Sanikop "71888b17b832ef55c0cd9449c0e6b077"};
757*09537850SAkhilesh Sanikop static const char* const kDigests16x4[3] = {
758*09537850SAkhilesh Sanikop "6b6d5ae4cc294c070ce65ab31c5a7d4f", "0fbecee20d294939e7a0183c2b4a0b96",
759*09537850SAkhilesh Sanikop "917cd884923139d5c05a11000722e3b6"};
760*09537850SAkhilesh Sanikop static const char* const kDigests16x8[3] = {
761*09537850SAkhilesh Sanikop "688c41726d9ac35fb5b18c57bca76b9c", "d439a2e0a60d672b644cd1189e2858b9",
762*09537850SAkhilesh Sanikop "edded6d166a77a6c3ff46fddc13f372f"};
763*09537850SAkhilesh Sanikop static const char* const kDigests16x16[3] = {
764*09537850SAkhilesh Sanikop "feb2bad9f6bb3f60eaeaf6c1bfd89ca5", "d65cabce5fcd9a29d1dfc530e4764f3a",
765*09537850SAkhilesh Sanikop "2f1a91898812d2c9320c7506b3a72eb4"};
766*09537850SAkhilesh Sanikop static const char* const kDigests16x32[3] = {
767*09537850SAkhilesh Sanikop "6f23b1851444d29633e62ce77bf09559", "4a449fd078bd0c9657cdc24b709c0796",
768*09537850SAkhilesh Sanikop "e44e18cb8bda2d34b52c96d5b6b510be"};
769*09537850SAkhilesh Sanikop static const char* const kDigests32x8[3] = {
770*09537850SAkhilesh Sanikop "77bf9ba56f7e1d2f04068a8a00b139da", "a85a1dea82963dedab9a2f7ad4169b5f",
771*09537850SAkhilesh Sanikop "d12746071bee96ddc075c6368bc9fbaf"};
772*09537850SAkhilesh Sanikop static const char* const kDigests32x16[3] = {
773*09537850SAkhilesh Sanikop "cce3422f7f8cf57145f979359ac92f98", "1c18738d40bfa91296e5fdb7230bf9a7",
774*09537850SAkhilesh Sanikop "02513142d109aee10f081cacfb33d1c5"};
775*09537850SAkhilesh Sanikop static const char* const kDigests32x32[3] = {
776*09537850SAkhilesh Sanikop "789008e49d0276de186af968196dd4a7", "b8848b00968a7ba4787765b7214da05f",
777*09537850SAkhilesh Sanikop "12d13828db57605b00ce99469489651d"};
778*09537850SAkhilesh Sanikop
779*09537850SAkhilesh Sanikop switch (tx_size) {
780*09537850SAkhilesh Sanikop case kTransformSize4x4:
781*09537850SAkhilesh Sanikop return kDigests4x4[subsampling_type];
782*09537850SAkhilesh Sanikop case kTransformSize4x8:
783*09537850SAkhilesh Sanikop return kDigests4x8[subsampling_type];
784*09537850SAkhilesh Sanikop case kTransformSize4x16:
785*09537850SAkhilesh Sanikop return kDigests4x16[subsampling_type];
786*09537850SAkhilesh Sanikop case kTransformSize8x4:
787*09537850SAkhilesh Sanikop return kDigests8x4[subsampling_type];
788*09537850SAkhilesh Sanikop case kTransformSize8x8:
789*09537850SAkhilesh Sanikop return kDigests8x8[subsampling_type];
790*09537850SAkhilesh Sanikop case kTransformSize8x16:
791*09537850SAkhilesh Sanikop return kDigests8x16[subsampling_type];
792*09537850SAkhilesh Sanikop case kTransformSize8x32:
793*09537850SAkhilesh Sanikop return kDigests8x32[subsampling_type];
794*09537850SAkhilesh Sanikop case kTransformSize16x4:
795*09537850SAkhilesh Sanikop return kDigests16x4[subsampling_type];
796*09537850SAkhilesh Sanikop case kTransformSize16x8:
797*09537850SAkhilesh Sanikop return kDigests16x8[subsampling_type];
798*09537850SAkhilesh Sanikop case kTransformSize16x16:
799*09537850SAkhilesh Sanikop return kDigests16x16[subsampling_type];
800*09537850SAkhilesh Sanikop case kTransformSize16x32:
801*09537850SAkhilesh Sanikop return kDigests16x32[subsampling_type];
802*09537850SAkhilesh Sanikop case kTransformSize32x8:
803*09537850SAkhilesh Sanikop return kDigests32x8[subsampling_type];
804*09537850SAkhilesh Sanikop case kTransformSize32x16:
805*09537850SAkhilesh Sanikop return kDigests32x16[subsampling_type];
806*09537850SAkhilesh Sanikop case kTransformSize32x32:
807*09537850SAkhilesh Sanikop return kDigests32x32[subsampling_type];
808*09537850SAkhilesh Sanikop default:
809*09537850SAkhilesh Sanikop ADD_FAILURE() << "Unknown transform size: " << tx_size;
810*09537850SAkhilesh Sanikop return nullptr;
811*09537850SAkhilesh Sanikop }
812*09537850SAkhilesh Sanikop }
813*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp444,DISABLED_Speed)814*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp444, DISABLED_Speed) {
815*09537850SAkhilesh Sanikop const auto num_runs =
816*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
817*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest10bpp(tx_size_, SubsamplingType()), num_runs);
818*09537850SAkhilesh Sanikop }
819*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp444,FixedInput)820*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp444, FixedInput) {
821*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest10bpp(tx_size_, SubsamplingType()), 1);
822*09537850SAkhilesh Sanikop }
823*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp444,Overflow)824*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp444, Overflow) { TestSaturatedValues(); }
825*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp444,Random)826*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp444, Random) { TestRandomValues(); }
827*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp422,DISABLED_Speed)828*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp422, DISABLED_Speed) {
829*09537850SAkhilesh Sanikop const auto num_runs =
830*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
831*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest10bpp(tx_size_, SubsamplingType()), num_runs);
832*09537850SAkhilesh Sanikop }
833*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp422,FixedInput)834*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp422, FixedInput) {
835*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest10bpp(tx_size_, SubsamplingType()), 1);
836*09537850SAkhilesh Sanikop }
837*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp422,Overflow)838*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp422, Overflow) { TestSaturatedValues(); }
839*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp422,Random)840*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp422, Random) { TestRandomValues(); }
841*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp420,DISABLED_Speed)842*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp420, DISABLED_Speed) {
843*09537850SAkhilesh Sanikop const auto num_runs =
844*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
845*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest10bpp(tx_size_, SubsamplingType()), num_runs);
846*09537850SAkhilesh Sanikop }
847*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp420,FixedInput)848*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp420, FixedInput) {
849*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest10bpp(tx_size_, SubsamplingType()), 1);
850*09537850SAkhilesh Sanikop }
851*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp420,Overflow)852*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp420, Overflow) { TestSaturatedValues(); }
853*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest10bpp420,Random)854*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest10bpp420, Random) { TestRandomValues(); }
855*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
856*09537850SAkhilesh Sanikop
857*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
858*09537850SAkhilesh Sanikop
859*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
860*09537850SAkhilesh Sanikop using CflIntraPredTest12bpp = CflIntraPredTest<12, uint16_t>;
861*09537850SAkhilesh Sanikop
GetCflIntraPredDigest12bpp(TransformSize tx_size)862*09537850SAkhilesh Sanikop const char* GetCflIntraPredDigest12bpp(TransformSize tx_size) {
863*09537850SAkhilesh Sanikop static const char* const kDigest4x4 = "1d92a681a58f99396f22acd8b3154e2b";
864*09537850SAkhilesh Sanikop static const char* const kDigest4x8 = "cf6833ebc64c9ae45f192ee384ef4aa3";
865*09537850SAkhilesh Sanikop static const char* const kDigest4x16 = "06a4fbb8590aca98a045c902ed15c777";
866*09537850SAkhilesh Sanikop static const char* const kDigest8x4 = "ad5944c7455f731ae8dd28b2b25a1b9f";
867*09537850SAkhilesh Sanikop static const char* const kDigest8x8 = "c19621e42ca2bc184d5065131d27be2c";
868*09537850SAkhilesh Sanikop static const char* const kDigest8x16 = "8faa7c95e8c3c18621168ed6759c1ac1";
869*09537850SAkhilesh Sanikop static const char* const kDigest8x32 = "502699ef7a8c7aebc8c3bc653e733703";
870*09537850SAkhilesh Sanikop static const char* const kDigest16x4 = "7f30bb038217967336fb8548a6f7df45";
871*09537850SAkhilesh Sanikop static const char* const kDigest16x8 = "b70943098d0fb256c2943e2ebdbe6d34";
872*09537850SAkhilesh Sanikop static const char* const kDigest16x16 = "4c34f5669880ab78d648b16b68ea0c24";
873*09537850SAkhilesh Sanikop static const char* const kDigest16x32 = "5d85daf690020ed235617870a1a179b1";
874*09537850SAkhilesh Sanikop static const char* const kDigest32x8 = "f8eec12e58c469ffb698fc60b13b927c";
875*09537850SAkhilesh Sanikop static const char* const kDigest32x16 = "f272bb7e5d2df333aa63d806c95e6748";
876*09537850SAkhilesh Sanikop static const char* const kDigest32x32 = "c737987c0a5414b03e6014f145dd999c";
877*09537850SAkhilesh Sanikop
878*09537850SAkhilesh Sanikop switch (tx_size) {
879*09537850SAkhilesh Sanikop case kTransformSize4x4:
880*09537850SAkhilesh Sanikop return kDigest4x4;
881*09537850SAkhilesh Sanikop case kTransformSize4x8:
882*09537850SAkhilesh Sanikop return kDigest4x8;
883*09537850SAkhilesh Sanikop case kTransformSize4x16:
884*09537850SAkhilesh Sanikop return kDigest4x16;
885*09537850SAkhilesh Sanikop case kTransformSize8x4:
886*09537850SAkhilesh Sanikop return kDigest8x4;
887*09537850SAkhilesh Sanikop case kTransformSize8x8:
888*09537850SAkhilesh Sanikop return kDigest8x8;
889*09537850SAkhilesh Sanikop case kTransformSize8x16:
890*09537850SAkhilesh Sanikop return kDigest8x16;
891*09537850SAkhilesh Sanikop case kTransformSize8x32:
892*09537850SAkhilesh Sanikop return kDigest8x32;
893*09537850SAkhilesh Sanikop case kTransformSize16x4:
894*09537850SAkhilesh Sanikop return kDigest16x4;
895*09537850SAkhilesh Sanikop case kTransformSize16x8:
896*09537850SAkhilesh Sanikop return kDigest16x8;
897*09537850SAkhilesh Sanikop case kTransformSize16x16:
898*09537850SAkhilesh Sanikop return kDigest16x16;
899*09537850SAkhilesh Sanikop case kTransformSize16x32:
900*09537850SAkhilesh Sanikop return kDigest16x32;
901*09537850SAkhilesh Sanikop case kTransformSize32x8:
902*09537850SAkhilesh Sanikop return kDigest32x8;
903*09537850SAkhilesh Sanikop case kTransformSize32x16:
904*09537850SAkhilesh Sanikop return kDigest32x16;
905*09537850SAkhilesh Sanikop case kTransformSize32x32:
906*09537850SAkhilesh Sanikop return kDigest32x32;
907*09537850SAkhilesh Sanikop default:
908*09537850SAkhilesh Sanikop ADD_FAILURE() << "Unknown transform size: " << tx_size;
909*09537850SAkhilesh Sanikop return nullptr;
910*09537850SAkhilesh Sanikop }
911*09537850SAkhilesh Sanikop }
912*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest12bpp,DISABLED_Speed)913*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest12bpp, DISABLED_Speed) {
914*09537850SAkhilesh Sanikop const auto num_runs =
915*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
916*09537850SAkhilesh Sanikop TestSpeed(GetCflIntraPredDigest12bpp(tx_size_), num_runs);
917*09537850SAkhilesh Sanikop }
918*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest12bpp,FixedInput)919*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest12bpp, FixedInput) {
920*09537850SAkhilesh Sanikop TestSpeed(GetCflIntraPredDigest12bpp(tx_size_), 1);
921*09537850SAkhilesh Sanikop }
922*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest12bpp,Overflow)923*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest12bpp, Overflow) { TestSaturatedValues(); }
924*09537850SAkhilesh Sanikop
TEST_P(CflIntraPredTest12bpp,Random)925*09537850SAkhilesh Sanikop TEST_P(CflIntraPredTest12bpp, Random) { TestRandomValues(); }
926*09537850SAkhilesh Sanikop
927*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
928*09537850SAkhilesh Sanikop
929*09537850SAkhilesh Sanikop using CflSubsamplerTest12bpp444 =
930*09537850SAkhilesh Sanikop CflSubsamplerTest<12, uint16_t, kSubsamplingType444>;
931*09537850SAkhilesh Sanikop using CflSubsamplerTest12bpp422 =
932*09537850SAkhilesh Sanikop CflSubsamplerTest<12, uint16_t, kSubsamplingType422>;
933*09537850SAkhilesh Sanikop using CflSubsamplerTest12bpp420 =
934*09537850SAkhilesh Sanikop CflSubsamplerTest<12, uint16_t, kSubsamplingType420>;
935*09537850SAkhilesh Sanikop
GetCflSubsamplerDigest12bpp(TransformSize tx_size,SubsamplingType subsampling_type)936*09537850SAkhilesh Sanikop const char* GetCflSubsamplerDigest12bpp(TransformSize tx_size,
937*09537850SAkhilesh Sanikop SubsamplingType subsampling_type) {
938*09537850SAkhilesh Sanikop static const char* const kDigests4x4[3] = {
939*09537850SAkhilesh Sanikop "44af37c60e9ccaacea004b57d5dea4cf",
940*09537850SAkhilesh Sanikop "e29dd1d93f23b23778ed8cd85910d987",
941*09537850SAkhilesh Sanikop "81e5dac2fd4c90f872ab814ed0f76ae5",
942*09537850SAkhilesh Sanikop };
943*09537850SAkhilesh Sanikop static const char* const kDigests4x8[3] = {
944*09537850SAkhilesh Sanikop "bfc04aed9fe41ec07b0462a219652d16",
945*09537850SAkhilesh Sanikop "693dd064636a0aa3be7aa098e867c512",
946*09537850SAkhilesh Sanikop "0636c25d88aacd85d63e56011e7c5d15",
947*09537850SAkhilesh Sanikop };
948*09537850SAkhilesh Sanikop static const char* const kDigests4x16[3] = {
949*09537850SAkhilesh Sanikop "6479ab30377288e75a78068d47c7e194",
950*09537850SAkhilesh Sanikop "7d6f9b8b3eb85e73626118fc9210e622",
951*09537850SAkhilesh Sanikop "1f3d474cd7c86899da90e515b8b7a906",
952*09537850SAkhilesh Sanikop };
953*09537850SAkhilesh Sanikop static const char* const kDigests8x4[3] = {
954*09537850SAkhilesh Sanikop "7da5a2029bcdab159225c475fdff02da",
955*09537850SAkhilesh Sanikop "096bfef24caa0670d2cd7b0bb63a7ba6",
956*09537850SAkhilesh Sanikop "f749310dfc8a6129ed438dbc845470c0",
957*09537850SAkhilesh Sanikop };
958*09537850SAkhilesh Sanikop static const char* const kDigests8x8[3] = {
959*09537850SAkhilesh Sanikop "08494051a7ff50718313a79ec7c51f92",
960*09537850SAkhilesh Sanikop "637efad0630e253f7cce11af1a0af456",
961*09537850SAkhilesh Sanikop "b220faf7dfedef860d59079dcf201757",
962*09537850SAkhilesh Sanikop };
963*09537850SAkhilesh Sanikop static const char* const kDigests8x16[3] = {
964*09537850SAkhilesh Sanikop "19f027af516e88d3b9e613e578deb126",
965*09537850SAkhilesh Sanikop "4f3bb155d70f9ea76d05b2f41b297a0c",
966*09537850SAkhilesh Sanikop "b7504347eeda1e59ba8e36385c219e40",
967*09537850SAkhilesh Sanikop };
968*09537850SAkhilesh Sanikop static const char* const kDigests8x32[3] = {
969*09537850SAkhilesh Sanikop "b8f1ef01c5672c87ee1004bb3cd7b8bc",
970*09537850SAkhilesh Sanikop "b3e3318b050eb1c165d1e320ef622fa7",
971*09537850SAkhilesh Sanikop "67754f7c5ae84dc23bb76ffaa2fa848e",
972*09537850SAkhilesh Sanikop };
973*09537850SAkhilesh Sanikop static const char* const kDigests16x4[3] = {
974*09537850SAkhilesh Sanikop "f687fb4e22d8a1446eeb4915036874f4",
975*09537850SAkhilesh Sanikop "7b5ef3d393a98dfe0ba49a0db2083465",
976*09537850SAkhilesh Sanikop "840bbb6edaa50e9f7d391033a3dda2d9",
977*09537850SAkhilesh Sanikop };
978*09537850SAkhilesh Sanikop static const char* const kDigests16x8[3] = {
979*09537850SAkhilesh Sanikop "dd9aed11d115a028035f0cee5b90d433",
980*09537850SAkhilesh Sanikop "340d5d0784356ea199d3d751f4d6ed5e",
981*09537850SAkhilesh Sanikop "e55f6fb5f34d829727e9dc2068098933",
982*09537850SAkhilesh Sanikop };
983*09537850SAkhilesh Sanikop static const char* const kDigests16x16[3] = {
984*09537850SAkhilesh Sanikop "1df36a20d76a405c6273b88b38693cf9",
985*09537850SAkhilesh Sanikop "2a7590d01df60b4bc6f10bfdb07b7a65",
986*09537850SAkhilesh Sanikop "510ee31a5bd609e8f4542bb817539668",
987*09537850SAkhilesh Sanikop };
988*09537850SAkhilesh Sanikop static const char* const kDigests16x32[3] = {
989*09537850SAkhilesh Sanikop "bdbc13b9fb7c3c50d25fda57f86f5ad9",
990*09537850SAkhilesh Sanikop "7c138c568794b3d0c8aabff2edc07efd",
991*09537850SAkhilesh Sanikop "581bef267c2a66e4c2fb079968440dbe",
992*09537850SAkhilesh Sanikop };
993*09537850SAkhilesh Sanikop static const char* const kDigests32x8[3] = {
994*09537850SAkhilesh Sanikop "26f62743793811475e2afe1414c5fee1",
995*09537850SAkhilesh Sanikop "6e6bf1678a04f2f727f0679564fb3630",
996*09537850SAkhilesh Sanikop "a4c15562c26dbcfa43fe03a2b6e728b5",
997*09537850SAkhilesh Sanikop };
998*09537850SAkhilesh Sanikop static const char* const kDigests32x16[3] = {
999*09537850SAkhilesh Sanikop "791f0713bbf032081da8ec08e58b9cd3",
1000*09537850SAkhilesh Sanikop "5dc7a673e92767186ae86996f4a30691",
1001*09537850SAkhilesh Sanikop "651f09d1244c817d92d1baa094c86f56",
1002*09537850SAkhilesh Sanikop };
1003*09537850SAkhilesh Sanikop static const char* const kDigests32x32[3] = {
1004*09537850SAkhilesh Sanikop "543a9d76e7238d88ba86218ec47c1f49",
1005*09537850SAkhilesh Sanikop "b0f2b29aae4858c1f09c27fc4344fd15",
1006*09537850SAkhilesh Sanikop "1d45083875fed14c4e5f149384a3cd2d",
1007*09537850SAkhilesh Sanikop };
1008*09537850SAkhilesh Sanikop
1009*09537850SAkhilesh Sanikop switch (tx_size) {
1010*09537850SAkhilesh Sanikop case kTransformSize4x4:
1011*09537850SAkhilesh Sanikop return kDigests4x4[subsampling_type];
1012*09537850SAkhilesh Sanikop case kTransformSize4x8:
1013*09537850SAkhilesh Sanikop return kDigests4x8[subsampling_type];
1014*09537850SAkhilesh Sanikop case kTransformSize4x16:
1015*09537850SAkhilesh Sanikop return kDigests4x16[subsampling_type];
1016*09537850SAkhilesh Sanikop case kTransformSize8x4:
1017*09537850SAkhilesh Sanikop return kDigests8x4[subsampling_type];
1018*09537850SAkhilesh Sanikop case kTransformSize8x8:
1019*09537850SAkhilesh Sanikop return kDigests8x8[subsampling_type];
1020*09537850SAkhilesh Sanikop case kTransformSize8x16:
1021*09537850SAkhilesh Sanikop return kDigests8x16[subsampling_type];
1022*09537850SAkhilesh Sanikop case kTransformSize8x32:
1023*09537850SAkhilesh Sanikop return kDigests8x32[subsampling_type];
1024*09537850SAkhilesh Sanikop case kTransformSize16x4:
1025*09537850SAkhilesh Sanikop return kDigests16x4[subsampling_type];
1026*09537850SAkhilesh Sanikop case kTransformSize16x8:
1027*09537850SAkhilesh Sanikop return kDigests16x8[subsampling_type];
1028*09537850SAkhilesh Sanikop case kTransformSize16x16:
1029*09537850SAkhilesh Sanikop return kDigests16x16[subsampling_type];
1030*09537850SAkhilesh Sanikop case kTransformSize16x32:
1031*09537850SAkhilesh Sanikop return kDigests16x32[subsampling_type];
1032*09537850SAkhilesh Sanikop case kTransformSize32x8:
1033*09537850SAkhilesh Sanikop return kDigests32x8[subsampling_type];
1034*09537850SAkhilesh Sanikop case kTransformSize32x16:
1035*09537850SAkhilesh Sanikop return kDigests32x16[subsampling_type];
1036*09537850SAkhilesh Sanikop case kTransformSize32x32:
1037*09537850SAkhilesh Sanikop return kDigests32x32[subsampling_type];
1038*09537850SAkhilesh Sanikop default:
1039*09537850SAkhilesh Sanikop ADD_FAILURE() << "Unknown transform size: " << tx_size;
1040*09537850SAkhilesh Sanikop return nullptr;
1041*09537850SAkhilesh Sanikop }
1042*09537850SAkhilesh Sanikop }
1043*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp444,DISABLED_Speed)1044*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp444, DISABLED_Speed) {
1045*09537850SAkhilesh Sanikop const auto num_runs =
1046*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
1047*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest12bpp(tx_size_, SubsamplingType()), num_runs);
1048*09537850SAkhilesh Sanikop }
1049*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp444,FixedInput)1050*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp444, FixedInput) {
1051*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest12bpp(tx_size_, SubsamplingType()), 1);
1052*09537850SAkhilesh Sanikop }
1053*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp444,Overflow)1054*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp444, Overflow) { TestSaturatedValues(); }
1055*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp444,Random)1056*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp444, Random) { TestRandomValues(); }
1057*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp422,DISABLED_Speed)1058*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp422, DISABLED_Speed) {
1059*09537850SAkhilesh Sanikop const auto num_runs =
1060*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
1061*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest12bpp(tx_size_, SubsamplingType()), num_runs);
1062*09537850SAkhilesh Sanikop }
1063*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp422,FixedInput)1064*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp422, FixedInput) {
1065*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest12bpp(tx_size_, SubsamplingType()), 1);
1066*09537850SAkhilesh Sanikop }
1067*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp422,Overflow)1068*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp422, Overflow) { TestSaturatedValues(); }
1069*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp422,Random)1070*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp422, Random) { TestRandomValues(); }
1071*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp420,DISABLED_Speed)1072*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp420, DISABLED_Speed) {
1073*09537850SAkhilesh Sanikop const auto num_runs =
1074*09537850SAkhilesh Sanikop static_cast<int>(2.0e9 / (block_width_ * block_height_));
1075*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest12bpp(tx_size_, SubsamplingType()), num_runs);
1076*09537850SAkhilesh Sanikop }
1077*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp420,FixedInput)1078*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp420, FixedInput) {
1079*09537850SAkhilesh Sanikop TestSpeed(GetCflSubsamplerDigest12bpp(tx_size_, SubsamplingType()), 1);
1080*09537850SAkhilesh Sanikop }
1081*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp420,Overflow)1082*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp420, Overflow) { TestSaturatedValues(); }
1083*09537850SAkhilesh Sanikop
TEST_P(CflSubsamplerTest12bpp420,Random)1084*09537850SAkhilesh Sanikop TEST_P(CflSubsamplerTest12bpp420, Random) { TestRandomValues(); }
1085*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1086*09537850SAkhilesh Sanikop
1087*09537850SAkhilesh Sanikop // Cfl predictors are available only for transform sizes with
1088*09537850SAkhilesh Sanikop // max(width, height) <= 32.
1089*09537850SAkhilesh Sanikop constexpr TransformSize kTransformSizesSmallerThan32x32[] = {
1090*09537850SAkhilesh Sanikop kTransformSize4x4, kTransformSize4x8, kTransformSize4x16,
1091*09537850SAkhilesh Sanikop kTransformSize8x4, kTransformSize8x8, kTransformSize8x16,
1092*09537850SAkhilesh Sanikop kTransformSize8x32, kTransformSize16x4, kTransformSize16x8,
1093*09537850SAkhilesh Sanikop kTransformSize16x16, kTransformSize16x32, kTransformSize32x8,
1094*09537850SAkhilesh Sanikop kTransformSize32x16, kTransformSize32x32};
1095*09537850SAkhilesh Sanikop
1096*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflIntraPredTest8bpp,
1097*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1098*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest8bpp444,
1099*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1100*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest8bpp422,
1101*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1102*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest8bpp420,
1103*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1104*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
1105*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, CflIntraPredTest8bpp,
1106*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1107*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, CflSubsamplerTest8bpp444,
1108*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1109*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, CflSubsamplerTest8bpp420,
1110*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1111*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_SSE4_1
1112*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1113*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, CflIntraPredTest8bpp,
1114*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1115*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, CflSubsamplerTest8bpp444,
1116*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1117*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, CflSubsamplerTest8bpp420,
1118*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1119*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_NEON
1120*09537850SAkhilesh Sanikop
1121*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1122*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflIntraPredTest10bpp,
1123*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1124*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest10bpp444,
1125*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1126*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest10bpp422,
1127*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1128*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest10bpp420,
1129*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1130*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
1131*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, CflIntraPredTest10bpp,
1132*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1133*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, CflSubsamplerTest10bpp444,
1134*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1135*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, CflSubsamplerTest10bpp420,
1136*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1137*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_SSE4_1
1138*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1139*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, CflIntraPredTest10bpp,
1140*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1141*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, CflSubsamplerTest10bpp444,
1142*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1143*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, CflSubsamplerTest10bpp420,
1144*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1145*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_NEON
1146*09537850SAkhilesh Sanikop
1147*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1148*09537850SAkhilesh Sanikop
1149*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1150*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflIntraPredTest12bpp,
1151*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1152*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest12bpp444,
1153*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1154*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest12bpp422,
1155*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1156*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, CflSubsamplerTest12bpp420,
1157*09537850SAkhilesh Sanikop testing::ValuesIn(kTransformSizesSmallerThan32x32));
1158*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1159*09537850SAkhilesh Sanikop
1160*09537850SAkhilesh Sanikop } // namespace
1161*09537850SAkhilesh Sanikop } // namespace dsp
1162*09537850SAkhilesh Sanikop
operator <<(std::ostream & os,const TransformSize tx_size)1163*09537850SAkhilesh Sanikop static std::ostream& operator<<(std::ostream& os, const TransformSize tx_size) {
1164*09537850SAkhilesh Sanikop return os << ToString(tx_size);
1165*09537850SAkhilesh Sanikop }
1166*09537850SAkhilesh Sanikop
1167*09537850SAkhilesh Sanikop } // namespace libgav1
1168