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/film_grain.h"
16*09537850SAkhilesh Sanikop
17*09537850SAkhilesh Sanikop #include <algorithm>
18*09537850SAkhilesh Sanikop #include <cassert>
19*09537850SAkhilesh Sanikop #include <cstddef>
20*09537850SAkhilesh Sanikop #include <cstdint>
21*09537850SAkhilesh Sanikop #include <cstdio>
22*09537850SAkhilesh Sanikop #include <cstring>
23*09537850SAkhilesh Sanikop #include <memory>
24*09537850SAkhilesh Sanikop #include <new>
25*09537850SAkhilesh Sanikop #include <string>
26*09537850SAkhilesh Sanikop #include <tuple>
27*09537850SAkhilesh Sanikop #include <type_traits>
28*09537850SAkhilesh Sanikop
29*09537850SAkhilesh Sanikop #include "absl/strings/match.h"
30*09537850SAkhilesh Sanikop #include "absl/strings/str_format.h"
31*09537850SAkhilesh Sanikop #include "absl/time/clock.h"
32*09537850SAkhilesh Sanikop #include "absl/time/time.h"
33*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
34*09537850SAkhilesh Sanikop #include "src/dsp/common.h"
35*09537850SAkhilesh Sanikop #include "src/dsp/dsp.h"
36*09537850SAkhilesh Sanikop #include "src/dsp/film_grain_common.h"
37*09537850SAkhilesh Sanikop #include "src/film_grain.h"
38*09537850SAkhilesh Sanikop #include "src/utils/array_2d.h"
39*09537850SAkhilesh Sanikop #include "src/utils/common.h"
40*09537850SAkhilesh Sanikop #include "src/utils/constants.h"
41*09537850SAkhilesh Sanikop #include "src/utils/cpu.h"
42*09537850SAkhilesh Sanikop #include "src/utils/memory.h"
43*09537850SAkhilesh Sanikop #include "src/utils/threadpool.h"
44*09537850SAkhilesh Sanikop #include "src/utils/types.h"
45*09537850SAkhilesh Sanikop #include "tests/block_utils.h"
46*09537850SAkhilesh Sanikop #include "tests/third_party/libvpx/acm_random.h"
47*09537850SAkhilesh Sanikop #include "tests/utils.h"
48*09537850SAkhilesh Sanikop
49*09537850SAkhilesh Sanikop namespace libgav1 {
50*09537850SAkhilesh Sanikop namespace dsp {
51*09537850SAkhilesh Sanikop namespace film_grain {
52*09537850SAkhilesh Sanikop namespace {
53*09537850SAkhilesh Sanikop
54*09537850SAkhilesh Sanikop constexpr int kNumSpeedTests = 50;
55*09537850SAkhilesh Sanikop constexpr int kNumFilmGrainTestParams = 10;
56*09537850SAkhilesh Sanikop constexpr size_t kLumaBlockSize = kLumaWidth * kLumaHeight;
57*09537850SAkhilesh Sanikop constexpr size_t kChromaBlockSize = kMaxChromaWidth * kMaxChromaHeight;
58*09537850SAkhilesh Sanikop // Dimensions for unit tests concerning applying grain to the whole frame.
59*09537850SAkhilesh Sanikop constexpr size_t kNumTestStripes = 64;
60*09537850SAkhilesh Sanikop constexpr int kNoiseStripeHeight = 34;
61*09537850SAkhilesh Sanikop constexpr size_t kFrameWidth = 1921;
62*09537850SAkhilesh Sanikop constexpr size_t kFrameHeight = (kNumTestStripes - 1) * 32 + 1;
63*09537850SAkhilesh Sanikop
64*09537850SAkhilesh Sanikop /*
65*09537850SAkhilesh Sanikop The film grain parameters for 10 frames were generated with the following
66*09537850SAkhilesh Sanikop command line:
67*09537850SAkhilesh Sanikop aomenc --end-usage=q --cq-level=20 --cpu-used=8 -w 1920 -h 1080 \
68*09537850SAkhilesh Sanikop --denoise-noise-level=50 --ivf breaking_bad_21m23s_10frames.1920_1080.yuv \
69*09537850SAkhilesh Sanikop -o breaking_bad_21m23s_10frames.1920_1080.noise50.ivf
70*09537850SAkhilesh Sanikop */
71*09537850SAkhilesh Sanikop constexpr FilmGrainParams kFilmGrainParams[10] = {
72*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
73*09537850SAkhilesh Sanikop /*update_grain=*/true,
74*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
75*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
76*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
77*09537850SAkhilesh Sanikop /*num_y_points=*/7,
78*09537850SAkhilesh Sanikop /*num_u_points=*/8,
79*09537850SAkhilesh Sanikop /*num_v_points=*/8,
80*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 121, 255, 0, 0, 0, 0, 0, 0, 0},
81*09537850SAkhilesh Sanikop /*point_y_scaling=*/{71, 71, 91, 99, 98, 100, 100, 0, 0, 0, 0, 0, 0, 0},
82*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 27, 40, 54, 67, 94, 255, 0, 0},
83*09537850SAkhilesh Sanikop /*point_u_scaling=*/{37, 37, 43, 48, 48, 50, 51, 51, 0, 0},
84*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 107, 255, 0, 0},
85*09537850SAkhilesh Sanikop /*point_v_scaling=*/{48, 48, 43, 33, 32, 33, 34, 34, 0, 0},
86*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
87*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
88*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{2, -2, -2, 10, 3, -2, 1, -4,
89*09537850SAkhilesh Sanikop 5, -1, -25, -13, 3, -1, 0, 7,
90*09537850SAkhilesh Sanikop -20, 103, 26, -2, 1, 14, -49, 117},
91*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-2, 1, -3, 4, -4, 0, 3, 5, -5,
92*09537850SAkhilesh Sanikop -17, 17, 0, -10, -5, -3, -30, 14, 70,
93*09537850SAkhilesh Sanikop 29, 9, -2, -10, 50, 71, -11},
94*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{3, -2, -7, 6, -7, -8, 3, 1, -12,
95*09537850SAkhilesh Sanikop -15, 28, 5, -11, -2, -7, -27, 32, 62,
96*09537850SAkhilesh Sanikop 31, 18, -2, -6, 61, 43, 2},
97*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
98*09537850SAkhilesh Sanikop /*grain_seed=*/7391,
99*09537850SAkhilesh Sanikop /*reference_index=*/0,
100*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
101*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
102*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
103*09537850SAkhilesh Sanikop /*u_offset=*/0,
104*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
105*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
106*09537850SAkhilesh Sanikop /*v_offset=*/0},
107*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
108*09537850SAkhilesh Sanikop /*update_grain=*/true,
109*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
110*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
111*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
112*09537850SAkhilesh Sanikop /*num_y_points=*/8,
113*09537850SAkhilesh Sanikop /*num_u_points=*/7,
114*09537850SAkhilesh Sanikop /*num_v_points=*/8,
115*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 94, 134, 255, 0, 0, 0, 0, 0, 0},
116*09537850SAkhilesh Sanikop /*point_y_scaling=*/{72, 72, 91, 99, 97, 100, 102, 102, 0, 0, 0, 0, 0, 0},
117*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 67, 134, 255, 0, 0, 0},
118*09537850SAkhilesh Sanikop /*point_u_scaling=*/{38, 38, 50, 49, 51, 53, 53, 0, 0, 0},
119*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 121, 255, 0, 0},
120*09537850SAkhilesh Sanikop /*point_v_scaling=*/{50, 50, 45, 34, 33, 35, 37, 37, 0, 0},
121*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
122*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
123*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{2, -2, -2, 10, 3, -1, 1, -3,
124*09537850SAkhilesh Sanikop 3, 1, -27, -12, 2, -1, 1, 7,
125*09537850SAkhilesh Sanikop -17, 100, 27, 0, -1, 13, -50, 116},
126*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 3, -3, -1, 2, 5, -3,
127*09537850SAkhilesh Sanikop -16, 16, -2, -10, -2, -1, -31, 14, 70,
128*09537850SAkhilesh Sanikop 29, 9, -1, -10, 47, 70, -11},
129*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{1, 0, -5, 5, -6, -6, 2, 1, -10,
130*09537850SAkhilesh Sanikop -14, 26, 4, -10, -3, -5, -26, 29, 63,
131*09537850SAkhilesh Sanikop 31, 17, -1, -6, 55, 47, 2},
132*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
133*09537850SAkhilesh Sanikop /*grain_seed=*/10772,
134*09537850SAkhilesh Sanikop /*reference_index=*/0,
135*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
136*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
137*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
138*09537850SAkhilesh Sanikop /*u_offset=*/0,
139*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
140*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
141*09537850SAkhilesh Sanikop /*v_offset=*/0},
142*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
143*09537850SAkhilesh Sanikop /*update_grain=*/true,
144*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
145*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
146*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
147*09537850SAkhilesh Sanikop /*num_y_points=*/8,
148*09537850SAkhilesh Sanikop /*num_u_points=*/7,
149*09537850SAkhilesh Sanikop /*num_v_points=*/8,
150*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 94, 134, 255, 0, 0, 0, 0, 0, 0},
151*09537850SAkhilesh Sanikop /*point_y_scaling=*/{71, 71, 91, 99, 98, 101, 103, 103, 0, 0, 0, 0, 0, 0},
152*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 81, 107, 255, 0, 0, 0},
153*09537850SAkhilesh Sanikop /*point_u_scaling=*/{37, 37, 49, 48, 51, 52, 52, 0, 0, 0},
154*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 121, 255, 0, 0},
155*09537850SAkhilesh Sanikop /*point_v_scaling=*/{49, 49, 44, 34, 32, 34, 36, 36, 0, 0},
156*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
157*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
158*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{1, -2, -2, 10, 3, -1, 1, -4,
159*09537850SAkhilesh Sanikop 4, 1, -26, -12, 2, -1, 1, 7,
160*09537850SAkhilesh Sanikop -18, 101, 26, -1, 0, 13, -49, 116},
161*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -3, 4, -3, -1, 2, 5, -4,
162*09537850SAkhilesh Sanikop -16, 17, -2, -10, -3, -2, -31, 15, 70,
163*09537850SAkhilesh Sanikop 28, 9, -1, -10, 48, 70, -11},
164*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{1, -1, -6, 5, -6, -7, 2, 2, -11,
165*09537850SAkhilesh Sanikop -14, 27, 5, -11, -3, -6, -26, 30, 62,
166*09537850SAkhilesh Sanikop 30, 18, -2, -6, 58, 45, 2},
167*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
168*09537850SAkhilesh Sanikop /*grain_seed=*/14153,
169*09537850SAkhilesh Sanikop /*reference_index=*/0,
170*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
171*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
172*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
173*09537850SAkhilesh Sanikop /*u_offset=*/0,
174*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
175*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
176*09537850SAkhilesh Sanikop /*v_offset=*/0},
177*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
178*09537850SAkhilesh Sanikop /*update_grain=*/true,
179*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
180*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
181*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
182*09537850SAkhilesh Sanikop /*num_y_points=*/7,
183*09537850SAkhilesh Sanikop /*num_u_points=*/5,
184*09537850SAkhilesh Sanikop /*num_v_points=*/7,
185*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 121, 255, 0, 0, 0, 0, 0, 0, 0},
186*09537850SAkhilesh Sanikop /*point_y_scaling=*/{71, 71, 90, 99, 98, 100, 100, 0, 0, 0, 0, 0, 0, 0},
187*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 107, 255, 0, 0, 0, 0, 0},
188*09537850SAkhilesh Sanikop /*point_u_scaling=*/{37, 37, 48, 51, 51, 0, 0, 0, 0, 0},
189*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 94, 255, 0, 0, 0},
190*09537850SAkhilesh Sanikop /*point_v_scaling=*/{49, 49, 43, 33, 32, 34, 34, 0, 0, 0},
191*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
192*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
193*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{2, -2, -2, 10, 3, -1, 1, -4,
194*09537850SAkhilesh Sanikop 6, 0, -26, -13, 3, -1, 1, 6,
195*09537850SAkhilesh Sanikop -20, 103, 26, -2, 1, 13, -48, 117},
196*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 4, -4, -1, 2, 5, -5,
197*09537850SAkhilesh Sanikop -16, 18, -1, -10, -3, -2, -30, 16, 69,
198*09537850SAkhilesh Sanikop 28, 9, -2, -10, 50, 68, -11},
199*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{2, -1, -6, 5, -6, -7, 2, 2, -11,
200*09537850SAkhilesh Sanikop -15, 29, 4, -10, -3, -6, -26, 30, 62,
201*09537850SAkhilesh Sanikop 31, 18, -3, -6, 59, 45, 3},
202*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
203*09537850SAkhilesh Sanikop /*grain_seed=*/17534,
204*09537850SAkhilesh Sanikop /*reference_index=*/0,
205*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
206*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
207*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
208*09537850SAkhilesh Sanikop /*u_offset=*/0,
209*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
210*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
211*09537850SAkhilesh Sanikop /*v_offset=*/0},
212*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
213*09537850SAkhilesh Sanikop /*update_grain=*/true,
214*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
215*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
216*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
217*09537850SAkhilesh Sanikop /*num_y_points=*/8,
218*09537850SAkhilesh Sanikop /*num_u_points=*/7,
219*09537850SAkhilesh Sanikop /*num_v_points=*/7,
220*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 94, 134, 255, 0, 0, 0, 0, 0, 0},
221*09537850SAkhilesh Sanikop /*point_y_scaling=*/{71, 71, 91, 99, 98, 101, 103, 103, 0, 0, 0, 0, 0, 0},
222*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 81, 107, 255, 0, 0, 0},
223*09537850SAkhilesh Sanikop /*point_u_scaling=*/{37, 37, 49, 49, 52, 53, 53, 0, 0, 0},
224*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 94, 255, 0, 0, 0},
225*09537850SAkhilesh Sanikop /*point_v_scaling=*/{50, 50, 44, 34, 33, 36, 37, 0, 0, 0},
226*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
227*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
228*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{2, -2, -2, 10, 3, -1, 1, -4,
229*09537850SAkhilesh Sanikop 3, 1, -26, -12, 2, -1, 1, 7,
230*09537850SAkhilesh Sanikop -17, 101, 26, 0, 0, 13, -50, 116},
231*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-2, 1, -2, 3, -3, -1, 2, 5, -4,
232*09537850SAkhilesh Sanikop -16, 16, -2, -10, -3, -1, -31, 14, 70,
233*09537850SAkhilesh Sanikop 28, 9, -1, -10, 48, 70, -11},
234*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{1, 0, -5, 5, -6, -6, 2, 2, -10,
235*09537850SAkhilesh Sanikop -14, 26, 4, -10, -3, -5, -26, 29, 63,
236*09537850SAkhilesh Sanikop 30, 17, -1, -6, 56, 47, 3},
237*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
238*09537850SAkhilesh Sanikop /*grain_seed=*/20915,
239*09537850SAkhilesh Sanikop /*reference_index=*/0,
240*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
241*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
242*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
243*09537850SAkhilesh Sanikop /*u_offset=*/0,
244*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
245*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
246*09537850SAkhilesh Sanikop /*v_offset=*/0},
247*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
248*09537850SAkhilesh Sanikop /*update_grain=*/true,
249*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
250*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
251*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
252*09537850SAkhilesh Sanikop /*num_y_points=*/7,
253*09537850SAkhilesh Sanikop /*num_u_points=*/7,
254*09537850SAkhilesh Sanikop /*num_v_points=*/7,
255*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 134, 255, 0, 0, 0, 0, 0, 0, 0},
256*09537850SAkhilesh Sanikop /*point_y_scaling=*/{72, 72, 91, 99, 97, 101, 101, 0, 0, 0, 0, 0, 0, 0},
257*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 67, 107, 255, 0, 0, 0},
258*09537850SAkhilesh Sanikop /*point_u_scaling=*/{38, 38, 51, 50, 52, 53, 54, 0, 0, 0},
259*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 94, 255, 0, 0, 0},
260*09537850SAkhilesh Sanikop /*point_v_scaling=*/{51, 51, 45, 35, 33, 36, 36, 0, 0, 0},
261*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
262*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
263*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{2, -2, -2, 9, 3, -1, 1, -3,
264*09537850SAkhilesh Sanikop 2, 2, -27, -12, 2, 0, 1, 7,
265*09537850SAkhilesh Sanikop -16, 100, 27, 0, -1, 13, -51, 116},
266*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 3, -3, -1, 1, 4, -2,
267*09537850SAkhilesh Sanikop -17, 14, -3, -10, -2, 0, -31, 14, 71,
268*09537850SAkhilesh Sanikop 29, 8, -2, -10, 45, 71, -11},
269*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{0, -1, -5, 4, -6, -5, 2, 1, -9,
270*09537850SAkhilesh Sanikop -14, 24, 3, -10, -3, -4, -25, 29, 63,
271*09537850SAkhilesh Sanikop 31, 16, -1, -7, 54, 48, 2},
272*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
273*09537850SAkhilesh Sanikop /*grain_seed=*/24296,
274*09537850SAkhilesh Sanikop /*reference_index=*/0,
275*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
276*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
277*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
278*09537850SAkhilesh Sanikop /*u_offset=*/0,
279*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
280*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
281*09537850SAkhilesh Sanikop /*v_offset=*/0},
282*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
283*09537850SAkhilesh Sanikop /*update_grain=*/true,
284*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
285*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
286*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
287*09537850SAkhilesh Sanikop /*num_y_points=*/7,
288*09537850SAkhilesh Sanikop /*num_u_points=*/7,
289*09537850SAkhilesh Sanikop /*num_v_points=*/8,
290*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 134, 255, 0, 0, 0, 0, 0, 0, 0},
291*09537850SAkhilesh Sanikop /*point_y_scaling=*/{72, 72, 91, 99, 97, 101, 101, 0, 0, 0, 0, 0, 0, 0},
292*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 67, 134, 255, 0, 0, 0},
293*09537850SAkhilesh Sanikop /*point_u_scaling=*/{38, 38, 50, 50, 51, 53, 53, 0, 0, 0},
294*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 121, 255, 0, 0},
295*09537850SAkhilesh Sanikop /*point_v_scaling=*/{50, 50, 45, 34, 33, 35, 36, 36, 0, 0},
296*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
297*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
298*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{2, -2, -2, 10, 3, -1, 1, -3,
299*09537850SAkhilesh Sanikop 3, 2, -27, -12, 2, 0, 1, 7,
300*09537850SAkhilesh Sanikop -17, 100, 27, 0, -1, 13, -51, 116},
301*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 3, -3, -1, 1, 5, -3,
302*09537850SAkhilesh Sanikop -16, 15, -2, -10, -2, -1, -31, 14, 70,
303*09537850SAkhilesh Sanikop 29, 8, -1, -10, 46, 71, -11},
304*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{1, 0, -5, 5, -6, -5, 2, 1, -9,
305*09537850SAkhilesh Sanikop -14, 25, 4, -10, -3, -5, -25, 29, 63,
306*09537850SAkhilesh Sanikop 31, 17, -1, -7, 55, 47, 2},
307*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
308*09537850SAkhilesh Sanikop /*grain_seed=*/27677,
309*09537850SAkhilesh Sanikop /*reference_index=*/0,
310*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
311*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
312*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
313*09537850SAkhilesh Sanikop /*u_offset=*/0,
314*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
315*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
316*09537850SAkhilesh Sanikop /*v_offset=*/0},
317*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
318*09537850SAkhilesh Sanikop /*update_grain=*/true,
319*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
320*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
321*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
322*09537850SAkhilesh Sanikop /*num_y_points=*/7,
323*09537850SAkhilesh Sanikop /*num_u_points=*/7,
324*09537850SAkhilesh Sanikop /*num_v_points=*/8,
325*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 121, 255, 0, 0, 0, 0, 0, 0, 0},
326*09537850SAkhilesh Sanikop /*point_y_scaling=*/{72, 72, 92, 99, 97, 101, 101, 0, 0, 0, 0, 0, 0, 0},
327*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 67, 174, 255, 0, 0, 0},
328*09537850SAkhilesh Sanikop /*point_u_scaling=*/{38, 38, 51, 50, 52, 54, 54, 0, 0, 0},
329*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 121, 255, 0, 0},
330*09537850SAkhilesh Sanikop /*point_v_scaling=*/{51, 51, 46, 35, 33, 35, 37, 37, 0, 0},
331*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
332*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
333*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{1, -1, -2, 9, 3, -1, 1, -3,
334*09537850SAkhilesh Sanikop 2, 2, -28, -12, 2, 0, 1, 8,
335*09537850SAkhilesh Sanikop -16, 99, 27, 0, -1, 13, -51, 116},
336*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 3, -3, -1, 2, 4, -2,
337*09537850SAkhilesh Sanikop -16, 14, -3, -10, -2, 0, -31, 13, 71,
338*09537850SAkhilesh Sanikop 29, 8, -2, -11, 44, 72, -11},
339*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{0, -1, -5, 4, -6, -4, 2, 1, -9,
340*09537850SAkhilesh Sanikop -13, 23, 3, -10, -3, -4, -25, 28, 63,
341*09537850SAkhilesh Sanikop 32, 16, -1, -7, 54, 49, 2},
342*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
343*09537850SAkhilesh Sanikop /*grain_seed=*/31058,
344*09537850SAkhilesh Sanikop /*reference_index=*/0,
345*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
346*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
347*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
348*09537850SAkhilesh Sanikop /*u_offset=*/0,
349*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
350*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
351*09537850SAkhilesh Sanikop /*v_offset=*/0},
352*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
353*09537850SAkhilesh Sanikop /*update_grain=*/true,
354*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
355*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
356*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
357*09537850SAkhilesh Sanikop /*num_y_points=*/7,
358*09537850SAkhilesh Sanikop /*num_u_points=*/7,
359*09537850SAkhilesh Sanikop /*num_v_points=*/9,
360*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 121, 255, 0, 0, 0, 0, 0, 0, 0},
361*09537850SAkhilesh Sanikop /*point_y_scaling=*/{72, 72, 92, 99, 98, 100, 98, 0, 0, 0, 0, 0, 0, 0},
362*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 67, 228, 255, 0, 0, 0},
363*09537850SAkhilesh Sanikop /*point_u_scaling=*/{38, 38, 51, 51, 52, 54, 54, 0, 0, 0},
364*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 121, 201, 255, 0},
365*09537850SAkhilesh Sanikop /*point_v_scaling=*/{51, 51, 46, 35, 34, 35, 37, 37, 37, 0},
366*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
367*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
368*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{1, -1, -2, 9, 3, -1, 1, -3,
369*09537850SAkhilesh Sanikop 2, 2, -28, -12, 2, 0, 1, 8,
370*09537850SAkhilesh Sanikop -16, 99, 27, 0, -1, 13, -52, 116},
371*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 3, -3, -1, 1, 4, -2,
372*09537850SAkhilesh Sanikop -16, 13, -3, -10, -2, 0, -31, 13, 71,
373*09537850SAkhilesh Sanikop 29, 8, -2, -11, 44, 72, -11},
374*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{0, -1, -5, 4, -6, -4, 2, 2, -8,
375*09537850SAkhilesh Sanikop -13, 23, 3, -10, -3, -4, -25, 28, 63,
376*09537850SAkhilesh Sanikop 32, 16, -1, -7, 54, 49, 2},
377*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
378*09537850SAkhilesh Sanikop /*grain_seed=*/34439,
379*09537850SAkhilesh Sanikop /*reference_index=*/0,
380*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
381*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
382*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
383*09537850SAkhilesh Sanikop /*u_offset=*/0,
384*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
385*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
386*09537850SAkhilesh Sanikop /*v_offset=*/0},
387*09537850SAkhilesh Sanikop {/*apply_grain=*/true,
388*09537850SAkhilesh Sanikop /*update_grain=*/true,
389*09537850SAkhilesh Sanikop /*chroma_scaling_from_luma=*/false,
390*09537850SAkhilesh Sanikop /*overlap_flag=*/true,
391*09537850SAkhilesh Sanikop /*clip_to_restricted_range=*/false,
392*09537850SAkhilesh Sanikop /*num_y_points=*/7,
393*09537850SAkhilesh Sanikop /*num_u_points=*/7,
394*09537850SAkhilesh Sanikop /*num_v_points=*/9,
395*09537850SAkhilesh Sanikop /*point_y_value=*/{0, 13, 27, 40, 54, 121, 255, 0, 0, 0, 0, 0, 0, 0},
396*09537850SAkhilesh Sanikop /*point_y_scaling=*/{72, 72, 92, 99, 98, 99, 95, 0, 0, 0, 0, 0, 0, 0},
397*09537850SAkhilesh Sanikop /*point_u_value=*/{0, 13, 40, 54, 67, 228, 255, 0, 0, 0},
398*09537850SAkhilesh Sanikop /*point_u_scaling=*/{39, 39, 51, 51, 52, 54, 54, 0, 0, 0},
399*09537850SAkhilesh Sanikop /*point_v_value=*/{0, 13, 27, 40, 54, 67, 121, 201, 255, 0},
400*09537850SAkhilesh Sanikop /*point_v_scaling=*/{51, 51, 46, 35, 34, 35, 36, 35, 35, 0},
401*09537850SAkhilesh Sanikop /*chroma_scaling=*/11,
402*09537850SAkhilesh Sanikop /*auto_regression_coeff_lag=*/3,
403*09537850SAkhilesh Sanikop /*auto_regression_coeff_y=*/{1, -1, -2, 9, 3, -1, 1, -3,
404*09537850SAkhilesh Sanikop 2, 2, -28, -11, 2, 0, 1, 8,
405*09537850SAkhilesh Sanikop -16, 99, 27, 0, -1, 13, -52, 116},
406*09537850SAkhilesh Sanikop /*auto_regression_coeff_u=*/{-3, 1, -2, 3, -3, -1, 1, 4, -2,
407*09537850SAkhilesh Sanikop -16, 13, -3, -10, -2, 0, -30, 13, 71,
408*09537850SAkhilesh Sanikop 29, 8, -2, -10, 43, 72, -11},
409*09537850SAkhilesh Sanikop /*auto_regression_coeff_v=*/{0, -1, -5, 3, -6, -4, 2, 2, -8,
410*09537850SAkhilesh Sanikop -13, 23, 3, -10, -3, -4, -25, 28, 64,
411*09537850SAkhilesh Sanikop 32, 16, -1, -7, 53, 49, 2},
412*09537850SAkhilesh Sanikop /*auto_regression_shift=*/8,
413*09537850SAkhilesh Sanikop /*grain_seed=*/37820,
414*09537850SAkhilesh Sanikop /*reference_index=*/0,
415*09537850SAkhilesh Sanikop /*grain_scale_shift=*/0,
416*09537850SAkhilesh Sanikop /*u_multiplier=*/0,
417*09537850SAkhilesh Sanikop /*u_luma_multiplier=*/64,
418*09537850SAkhilesh Sanikop /*u_offset=*/0,
419*09537850SAkhilesh Sanikop /*v_multiplier=*/0,
420*09537850SAkhilesh Sanikop /*v_luma_multiplier=*/64,
421*09537850SAkhilesh Sanikop /*v_offset=*/0}};
422*09537850SAkhilesh Sanikop
GetTestDigestLuma(int bitdepth,int param_index)423*09537850SAkhilesh Sanikop const char* GetTestDigestLuma(int bitdepth, int param_index) {
424*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma8bpp[10] = {
425*09537850SAkhilesh Sanikop "80da8e849110a10c0a73f9dec0d9a2fb", "54352f02aeda541e17a4c2d208897e2b",
426*09537850SAkhilesh Sanikop "2ad9021124c82aca3e7c9517d00d1236", "f6c5f64513925b09ceba31e92511f8a1",
427*09537850SAkhilesh Sanikop "46c6006578c68c3c8619f7a389c7de45", "fcddbd27545254dc50f1c333c8b7e313",
428*09537850SAkhilesh Sanikop "c6d4dc181bf7f2f93ae099b836685151", "2949ef836748271195914fef9acf4e46",
429*09537850SAkhilesh Sanikop "524e79bb87ed550e123d00a61df94381", "182222470d7b7a80017521d0261e4474",
430*09537850SAkhilesh Sanikop };
431*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma10bpp[10] = {
432*09537850SAkhilesh Sanikop "27a49a2131fb6d4dd4b8c34da1b7642e", "4ea9134f6831dd398545c85b2a68e31f",
433*09537850SAkhilesh Sanikop "4e12232a18a2b06e958d7ab6b953faad", "0ede12864ddaced2d8062ffa4225ce24",
434*09537850SAkhilesh Sanikop "5fee492c4a430b2417a64aa4920b69e9", "39af842a3f9370d796e8ef047c0c42a8",
435*09537850SAkhilesh Sanikop "0efbad5f9dc07391ad243232b8df1787", "2bd41882cd82960019aa2b87d5fb1fbc",
436*09537850SAkhilesh Sanikop "1c66629c0c4e7b6f9b0a7a6944fbad50", "2c633a50ead62f8e844a409545f46244",
437*09537850SAkhilesh Sanikop };
438*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma12bpp[10] = {
439*09537850SAkhilesh Sanikop "1dc9b38a93454a85eb924f25346ae369", "5f9d311ee5384a5a902f8e2d1297319e",
440*09537850SAkhilesh Sanikop "cf1a35878720564c7a741f91eef66565", "47a0608fe0f6f7ccae42a5ca05783cbf",
441*09537850SAkhilesh Sanikop "dbc28da0178e3c18a036c3f2203c300f", "04911d2074e3252119ee2d80426b8c01",
442*09537850SAkhilesh Sanikop "df19ab8103c40b726c842ccf7772208b", "39276967eb16710d98f82068c3eeba41",
443*09537850SAkhilesh Sanikop "b83100f18abb2062d9c9969f07182b86", "b39a69515491329698cf66f6d4fa371f",
444*09537850SAkhilesh Sanikop };
445*09537850SAkhilesh Sanikop
446*09537850SAkhilesh Sanikop switch (bitdepth) {
447*09537850SAkhilesh Sanikop case 8:
448*09537850SAkhilesh Sanikop return kTestDigestsLuma8bpp[param_index];
449*09537850SAkhilesh Sanikop case 10:
450*09537850SAkhilesh Sanikop return kTestDigestsLuma10bpp[param_index];
451*09537850SAkhilesh Sanikop case 12:
452*09537850SAkhilesh Sanikop return kTestDigestsLuma12bpp[param_index];
453*09537850SAkhilesh Sanikop default:
454*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
455*09537850SAkhilesh Sanikop return nullptr;
456*09537850SAkhilesh Sanikop }
457*09537850SAkhilesh Sanikop }
458*09537850SAkhilesh Sanikop
GetTestDigestChromaU(int bitdepth,int param_index)459*09537850SAkhilesh Sanikop const char* GetTestDigestChromaU(int bitdepth, int param_index) {
460*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaU8bpp[10] = {
461*09537850SAkhilesh Sanikop "e56b7bbe9f39bf987770b18aeca59514", "d0b3fd3cf2901dae31b73f20c510d83e",
462*09537850SAkhilesh Sanikop "800c01d58d9fb72136d21ec2bb07899a", "4cd0badba679e8edbcd60a931fce49a1",
463*09537850SAkhilesh Sanikop "cabec236cc17f91f3f08d8cde867aa72", "380a2205cf2d40c6a27152585f61a3b0",
464*09537850SAkhilesh Sanikop "3813526234dc7f90f80f6684772c729a", "97a43a73066d88f9cbd915d56fc9c196",
465*09537850SAkhilesh Sanikop "5b70b27a43dd63b03e23aecd3a935071", "d5cc98685582ffd47a41a97d2e377ac8",
466*09537850SAkhilesh Sanikop };
467*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaU10bpp[10] = {
468*09537850SAkhilesh Sanikop "9a6d0369ba86317598e65913276dae6d", "2512bdc4c88f21f8185b040b7752d1db",
469*09537850SAkhilesh Sanikop "1e86b779ce6555fcf5bd0ade2af67e73", "5ad463a354ffce522c52b616fb122024",
470*09537850SAkhilesh Sanikop "290d53c22c2143b0882acb887da3fdf1", "54622407d865371d7e70bbf29fdda626",
471*09537850SAkhilesh Sanikop "be306c6a94c55dbd9ef514f0ad4a0011", "904602329b0dec352b3b177b0a2554d2",
472*09537850SAkhilesh Sanikop "58afc9497d968c67fdf2c0cf23b33aa3", "74fee7be6f62724bf901fdd04a733b46",
473*09537850SAkhilesh Sanikop };
474*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaU12bpp[10] = {
475*09537850SAkhilesh Sanikop "846d608050fe7c19d6cabe2d53cb7821", "2caf4665a26aad50f68497e4b1326417",
476*09537850SAkhilesh Sanikop "ce40f0f8f8c207c7c985464c812fea33", "820de51d07a21da5c00833bab546f1fa",
477*09537850SAkhilesh Sanikop "5e7bedd8933cd274af03babb4dbb94dd", "d137cf584eabea86387460a6d3f62bfe",
478*09537850SAkhilesh Sanikop "f206e0c6ed35b3ab35c6ff37e151e963", "55d87981b7044df225b3b5935185449b",
479*09537850SAkhilesh Sanikop "6a655c8bf4df6af0e80ae6d004a73a25", "6234ae36076cc77161af6e6e3c04449a",
480*09537850SAkhilesh Sanikop };
481*09537850SAkhilesh Sanikop
482*09537850SAkhilesh Sanikop switch (bitdepth) {
483*09537850SAkhilesh Sanikop case 8:
484*09537850SAkhilesh Sanikop return kTestDigestsChromaU8bpp[param_index];
485*09537850SAkhilesh Sanikop case 10:
486*09537850SAkhilesh Sanikop return kTestDigestsChromaU10bpp[param_index];
487*09537850SAkhilesh Sanikop case 12:
488*09537850SAkhilesh Sanikop return kTestDigestsChromaU12bpp[param_index];
489*09537850SAkhilesh Sanikop default:
490*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
491*09537850SAkhilesh Sanikop return nullptr;
492*09537850SAkhilesh Sanikop }
493*09537850SAkhilesh Sanikop }
494*09537850SAkhilesh Sanikop
GetTestDigestChromaV(int bitdepth,int param_index)495*09537850SAkhilesh Sanikop const char* GetTestDigestChromaV(int bitdepth, int param_index) {
496*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaV8bpp[10] = {
497*09537850SAkhilesh Sanikop "7205ed6c07ed27b7b52d871e0559b8fa", "fad033b1482dba0ed2d450b461fa310e",
498*09537850SAkhilesh Sanikop "6bb39798ec6a0f7bda0b0fcb0a555734", "08c19856e10123ae520ccfc63e2fbe7b",
499*09537850SAkhilesh Sanikop "a7695a6b69fba740a50310dfa6cf1c00", "ac2eac2d13fc5b21c4f2995d5abe14b9",
500*09537850SAkhilesh Sanikop "be35cb30062db628a9e1304fca8b75dc", "f5bfc7a910c76bcd5b32c40772170879",
501*09537850SAkhilesh Sanikop "aca07b37d63f978d76df5cd75d0cea5e", "107c7c56d4ec21f346a1a02206301b0d",
502*09537850SAkhilesh Sanikop };
503*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaV10bpp[10] = {
504*09537850SAkhilesh Sanikop "910724a77710996c90e272f1c1e9ff8e", "d293f861580770a89f1e266931a012ad",
505*09537850SAkhilesh Sanikop "9e4f0c85fb533e51238586f9c3e68b6e", "a5ff4478d9eeb2168262c2e955e17a4f",
506*09537850SAkhilesh Sanikop "fba6b1e8f28e4e90c836d41f28a0c154", "50b9a93f9a1f3845e6903bff9270a3e6",
507*09537850SAkhilesh Sanikop "7b1624c3543badf5fadaee4d1e602e6b", "3be074e4ca0eec5770748b15661aaadd",
508*09537850SAkhilesh Sanikop "639197401032f272d6c30666a2d08f43", "28075dd34246bf9d5e6197b1944f646a",
509*09537850SAkhilesh Sanikop };
510*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaV12bpp[10] = {
511*09537850SAkhilesh Sanikop "4957ec919c20707d594fa5c2138c2550", "3f07c65bfb42c81768b1f5ad9611d1ce",
512*09537850SAkhilesh Sanikop "665d9547171c99faba95ac81a35c9a0c", "1b5d032e0cefdb4041ad51796de8a45e",
513*09537850SAkhilesh Sanikop "18fa974579a4f1ff8cd7df664fc339d5", "2ffaa4f143495ff73c06a580a97b6321",
514*09537850SAkhilesh Sanikop "4fd1f562bc47a68dbfaf7c566c7c4da6", "4d37c80c9caf110c1d3d20bd1a1875b3",
515*09537850SAkhilesh Sanikop "8ea29759640962613166dc5154837d14", "5ca4c10f42d0906c72ebee90fae6ce7d",
516*09537850SAkhilesh Sanikop };
517*09537850SAkhilesh Sanikop
518*09537850SAkhilesh Sanikop switch (bitdepth) {
519*09537850SAkhilesh Sanikop case 8:
520*09537850SAkhilesh Sanikop return kTestDigestsChromaV8bpp[param_index];
521*09537850SAkhilesh Sanikop case 10:
522*09537850SAkhilesh Sanikop return kTestDigestsChromaV10bpp[param_index];
523*09537850SAkhilesh Sanikop case 12:
524*09537850SAkhilesh Sanikop return kTestDigestsChromaV12bpp[param_index];
525*09537850SAkhilesh Sanikop default:
526*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
527*09537850SAkhilesh Sanikop return nullptr;
528*09537850SAkhilesh Sanikop }
529*09537850SAkhilesh Sanikop }
530*09537850SAkhilesh Sanikop
GetARTestDigestLuma(int bitdepth,int coeff_lag,int param_index)531*09537850SAkhilesh Sanikop const char* GetARTestDigestLuma(int bitdepth, int coeff_lag, int param_index) {
532*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma8bpp[3][kNumFilmGrainTestParams] = {
533*09537850SAkhilesh Sanikop {"a835127918f93478b45f1ba4d20d81bd", "a835127918f93478b45f1ba4d20d81bd",
534*09537850SAkhilesh Sanikop "e5db4da626e214bb17bcc7ecffa76303", "a835127918f93478b45f1ba4d20d81bd",
535*09537850SAkhilesh Sanikop "a835127918f93478b45f1ba4d20d81bd", "e5db4da626e214bb17bcc7ecffa76303",
536*09537850SAkhilesh Sanikop "a835127918f93478b45f1ba4d20d81bd", "1da62b7233de502123a18546b6c97da2",
537*09537850SAkhilesh Sanikop "1da62b7233de502123a18546b6c97da2", "1da62b7233de502123a18546b6c97da2"},
538*09537850SAkhilesh Sanikop {"11464b880de3ecd6e6189c5c4e7f9b28", "dfe411762e283b5f49bece02ec200951",
539*09537850SAkhilesh Sanikop "5c534d92afdf0a5b53dbe4fe7271929c", "2e1a68a18aca96c31320ba7ceab59be9",
540*09537850SAkhilesh Sanikop "584c0323e6b276cb9acb1a294d462d58", "9571eb8f1cbaa96ea3bf64a820a8d9f0",
541*09537850SAkhilesh Sanikop "305285ff0df87aba3c59e3fc0818697d", "0066d35c8818cf20230114dcd3765a4d",
542*09537850SAkhilesh Sanikop "0066d35c8818cf20230114dcd3765a4d", "16d61b046084ef2636eedc5a737cb6f6"},
543*09537850SAkhilesh Sanikop {"0c9e2cf1b6c3cad0f7668026e8ea0516", "7d094855292d0eded9e0d1b5bab1990b",
544*09537850SAkhilesh Sanikop "fbf28860a5f1285dcc6725a45256a86a", "dccb906904160ccabbd2c9a7797a4bf9",
545*09537850SAkhilesh Sanikop "46f645e17f08a3260b1ae70284e5c5b8", "124fdc90bed11a7320a0cbdee8b94400",
546*09537850SAkhilesh Sanikop "8d2978651dddeaef6282191fa146f0a0", "28b4d5aa33f05b3fb7f9323a11936bdc",
547*09537850SAkhilesh Sanikop "6a8ea684f6736a069e3612d1af6391a8", "2781ea40a63704dbfeb3a1ac5db6f2fc"},
548*09537850SAkhilesh Sanikop };
549*09537850SAkhilesh Sanikop
550*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma10bpp[3][kNumFilmGrainTestParams] = {
551*09537850SAkhilesh Sanikop {"5e6bc8444ece2d38420f51d82238d812", "5e6bc8444ece2d38420f51d82238d812",
552*09537850SAkhilesh Sanikop "2bfaec768794af33d60a9771f971f68d", "5e6bc8444ece2d38420f51d82238d812",
553*09537850SAkhilesh Sanikop "5e6bc8444ece2d38420f51d82238d812", "c880807a368c4e82c23bea6f035ad23f",
554*09537850SAkhilesh Sanikop "5e6bc8444ece2d38420f51d82238d812", "c576667da5286183ec3aab9a76f53a2e",
555*09537850SAkhilesh Sanikop "c576667da5286183ec3aab9a76f53a2e", "c576667da5286183ec3aab9a76f53a2e"},
556*09537850SAkhilesh Sanikop {"095c2dd4d4d52aff9696df9bfdb70062", "983d14afa497060792d472a449a380c7",
557*09537850SAkhilesh Sanikop "c5fdc0f7c594b2b36132cec6f45a79bd", "acff232ac5597c1712213150552281d1",
558*09537850SAkhilesh Sanikop "4dd7341923b1d260092853553b6b6246", "0ca8afd71a4f564ea1ce69c4af14e9ab",
559*09537850SAkhilesh Sanikop "9bc7565e5359d09194fcee28e4bf7b94", "6fea7805458b9d149f238a30e2dc3f13",
560*09537850SAkhilesh Sanikop "6fea7805458b9d149f238a30e2dc3f13", "681dff5fc7a7244ba4e4a582ca7ecb14"},
561*09537850SAkhilesh Sanikop {"cb99352c9c6300e7e825188bb4adaee0", "7e40674de0209bd72f8e9c6e39ee6f7c",
562*09537850SAkhilesh Sanikop "3e475572f6b4ecbb2730fd16751ad7ed", "e6e4c63abc9cb112d9d1f23886cd1415",
563*09537850SAkhilesh Sanikop "1a1c953b175c105c604902877e2bab18", "380a53072530223d4ee622e014ee4bdb",
564*09537850SAkhilesh Sanikop "6137394ea1172fb7ea0cbac237ff1703", "85ab0c813e46f97cb9f42542f44c01ad",
565*09537850SAkhilesh Sanikop "68c8ac462f0e28cb35402c538bee32f1", "0038502ffa4760c8feb6f9abd4de7250"},
566*09537850SAkhilesh Sanikop };
567*09537850SAkhilesh Sanikop
568*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma12bpp[3][kNumFilmGrainTestParams] = {
569*09537850SAkhilesh Sanikop {"d618bbb0e337969c91b1805f39561520", "d618bbb0e337969c91b1805f39561520",
570*09537850SAkhilesh Sanikop "678f6e911591daf9eca4e305dabdb2b3", "d618bbb0e337969c91b1805f39561520",
571*09537850SAkhilesh Sanikop "d618bbb0e337969c91b1805f39561520", "3b26f49612fd587c7360790d40adb5de",
572*09537850SAkhilesh Sanikop "d618bbb0e337969c91b1805f39561520", "33f77d3ff50cfc64c6bc9a896b567377",
573*09537850SAkhilesh Sanikop "33f77d3ff50cfc64c6bc9a896b567377", "33f77d3ff50cfc64c6bc9a896b567377"},
574*09537850SAkhilesh Sanikop {"362fd67050fb7abaf57c43a92d993423", "e014ae0eb9e697281015c38905cc46ef",
575*09537850SAkhilesh Sanikop "82b867e57151dc08afba31eccf5ccf69", "a94ba736cdce7bfa0b550285f59e47a9",
576*09537850SAkhilesh Sanikop "3f1b0b7dd3b10e322254d35e4e185b7c", "7929708e5f017d58c53513cb79b35fda",
577*09537850SAkhilesh Sanikop "6d26d31a091cbe642a7070933bd7de5a", "dc29ac40a994c0a760bfbad0bfc15b3a",
578*09537850SAkhilesh Sanikop "dc29ac40a994c0a760bfbad0bfc15b3a", "399b919db5190a5311ce8d166580827b"},
579*09537850SAkhilesh Sanikop {"6116d1f569f5b568eca4dc1fbf255086", "7e9cf31ea74e8ea99ffd12094ce6cd05",
580*09537850SAkhilesh Sanikop "bb982c4c39e82a333d744defd16f4388", "7c6e584b082dc6b97ed0d967def3993f",
581*09537850SAkhilesh Sanikop "fb234695353058f03c8e128f2f8de130", "9218c6ca67bf6a9237f98aa1ce7acdfd",
582*09537850SAkhilesh Sanikop "d1fb834bbb388ed066c5cbc1c79b5bdf", "d6f630daedc08216fcea12012e7408b5",
583*09537850SAkhilesh Sanikop "dd7fe49299e6f113a98debc7411c8db8", "8b89e45a5101a28c24209ae119eafeb8"},
584*09537850SAkhilesh Sanikop };
585*09537850SAkhilesh Sanikop
586*09537850SAkhilesh Sanikop switch (bitdepth) {
587*09537850SAkhilesh Sanikop case 8:
588*09537850SAkhilesh Sanikop return kTestDigestsLuma8bpp[coeff_lag - 1][param_index];
589*09537850SAkhilesh Sanikop case 10:
590*09537850SAkhilesh Sanikop return kTestDigestsLuma10bpp[coeff_lag - 1][param_index];
591*09537850SAkhilesh Sanikop case 12:
592*09537850SAkhilesh Sanikop return kTestDigestsLuma12bpp[coeff_lag - 1][param_index];
593*09537850SAkhilesh Sanikop default:
594*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
595*09537850SAkhilesh Sanikop return nullptr;
596*09537850SAkhilesh Sanikop }
597*09537850SAkhilesh Sanikop }
598*09537850SAkhilesh Sanikop
GetARTestDigestChromaU(int bitdepth,int coeff_lag,int subsampling_x,int subsampling_y)599*09537850SAkhilesh Sanikop const char* GetARTestDigestChromaU(int bitdepth, int coeff_lag,
600*09537850SAkhilesh Sanikop int subsampling_x, int subsampling_y) {
601*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaU8bpp[12] = {
602*09537850SAkhilesh Sanikop "11ced66de0eaf55c1ff9bad18d7b8ed7", "0c3b77345dd4ab0915ef53693ab93ce4",
603*09537850SAkhilesh Sanikop "b0645044ba080b3ceb8f299e269377d6", "50590ad5d895f0b4bc6694d878e9cd32",
604*09537850SAkhilesh Sanikop "85e1bf3741100135062f5b4abfe7639b", "76955b70dde61ca5c7d079c501b90906",
605*09537850SAkhilesh Sanikop "3f0995e1397fd9efd9fc46b67f7796b3", "0a0d6c3e4e1649eb101395bc97943a07",
606*09537850SAkhilesh Sanikop "1878855ed8db600ccae1d39abac52ec6", "13ab2b28320ed3ac2b820f08fdfd424d",
607*09537850SAkhilesh Sanikop "f3e95544a86ead5387e3dc4e043fd0f0", "ff8f5d2d97a6689e16a7e4f482f69f0b",
608*09537850SAkhilesh Sanikop };
609*09537850SAkhilesh Sanikop
610*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaU10bpp[12] = {
611*09537850SAkhilesh Sanikop "707f2aa5aa7e77bc6e83ab08287d748d", "0bcf40c7fead9ac3a5d71b4cc1e21549",
612*09537850SAkhilesh Sanikop "0c1df27053e5da7cf1276a122a8f4e8b", "782962f7425eb38923a4f87e7ab319d9",
613*09537850SAkhilesh Sanikop "b4a709ae5967afef55530b9ea8ef0062", "70a971a0b9bf06212d510b396f0f9095",
614*09537850SAkhilesh Sanikop "d033b89d6e31f8b13c83d94c840b7d54", "40bbe804bf3f90cee667d3b275e3c964",
615*09537850SAkhilesh Sanikop "90bb2b9d518b945adcfd1b1807f7d170", "4bc34aa157fe5ad4270c611afa75e878",
616*09537850SAkhilesh Sanikop "e2688d7286cd43fe0a3ea734d2ad0f77", "853193c4981bd882912171061327bdf2",
617*09537850SAkhilesh Sanikop };
618*09537850SAkhilesh Sanikop
619*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaU12bpp[12] = {
620*09537850SAkhilesh Sanikop "04c23b01d01c0e3f3247f3741581b383", "9f8ea1d66e44f6fe93d765ce56b2b0f3",
621*09537850SAkhilesh Sanikop "5dda44b128d6c244963f1e8e17cc1d22", "9dd0a79dd2f772310a95762d445bface",
622*09537850SAkhilesh Sanikop "0dbd40d930e4873d72ea72b9e3d62440", "d7d83c207c6b435a164206d5f457931f",
623*09537850SAkhilesh Sanikop "e8d04f6e63ed63838adff965275a1ff1", "fc09a903e941fcff8bad67a84f705775",
624*09537850SAkhilesh Sanikop "9cd706606a2aa40d0957547756f7abd9", "258b37e7b8f48db77dac7ea24073fe69",
625*09537850SAkhilesh Sanikop "80149b8bb05308da09c1383d8b79d3da", "e993f3bffae53204a1942feb1af42074",
626*09537850SAkhilesh Sanikop };
627*09537850SAkhilesh Sanikop
628*09537850SAkhilesh Sanikop assert(!(subsampling_x == 0 && subsampling_y == 1));
629*09537850SAkhilesh Sanikop const int base_index = 3 * coeff_lag + subsampling_x + subsampling_y;
630*09537850SAkhilesh Sanikop switch (bitdepth) {
631*09537850SAkhilesh Sanikop case 8:
632*09537850SAkhilesh Sanikop return kTestDigestsChromaU8bpp[base_index];
633*09537850SAkhilesh Sanikop case 10:
634*09537850SAkhilesh Sanikop return kTestDigestsChromaU10bpp[base_index];
635*09537850SAkhilesh Sanikop case 12:
636*09537850SAkhilesh Sanikop return kTestDigestsChromaU12bpp[base_index];
637*09537850SAkhilesh Sanikop default:
638*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
639*09537850SAkhilesh Sanikop return nullptr;
640*09537850SAkhilesh Sanikop }
641*09537850SAkhilesh Sanikop }
642*09537850SAkhilesh Sanikop
GetARTestDigestChromaV(int bitdepth,int coeff_lag,int subsampling_x,int subsampling_y)643*09537850SAkhilesh Sanikop const char* GetARTestDigestChromaV(int bitdepth, int coeff_lag,
644*09537850SAkhilesh Sanikop int subsampling_x, int subsampling_y) {
645*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaV8bpp[12] = {
646*09537850SAkhilesh Sanikop "5c2179f3d93be0a0da75d2bb90347c2f", "79b883847d7eaa7890e1d633b8e34353",
647*09537850SAkhilesh Sanikop "90ade818e55808e8cf58c11debb5ddd1", "1d0f2a14bc4df2b2a1abaf8137029f92",
648*09537850SAkhilesh Sanikop "ac753a57ade140dccb50c14f941ae1fc", "d24ab497558f6896f08dc17bcc3c50c1",
649*09537850SAkhilesh Sanikop "3d74436c63920022a95c85b234db4e33", "061c2d53ed84c830f454e395c362cb16",
650*09537850SAkhilesh Sanikop "05d24869d7fb952e332457a114c8b9b7", "fcee31b87a2ada8028c2a975e094856a",
651*09537850SAkhilesh Sanikop "c019e2c475737abcf9c2b2a52845c646", "9cd994baa7021f8bdf1d1c468c1c8e9c",
652*09537850SAkhilesh Sanikop };
653*09537850SAkhilesh Sanikop
654*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaV10bpp[12] = {
655*09537850SAkhilesh Sanikop "bc9e44454a05cac8571c15af5b720e79", "f0374436698d94e879c03331b1f30df4",
656*09537850SAkhilesh Sanikop "4580dd009abd6eeed59485057c55f63e", "7d1f7aecd45302bb461f4467f2770f72",
657*09537850SAkhilesh Sanikop "1f0d003fce6c5fedc147c6112813f43b", "4771a45c2c1a04c375400619d5536035",
658*09537850SAkhilesh Sanikop "df9cf619a78907c0f6e58bc13d7d5546", "dd3715ce65d905f30070a36977c818e0",
659*09537850SAkhilesh Sanikop "32de5800f76e34c128a1d89146b4010b", "db9d7c70c3f69feb68fae04398efc773",
660*09537850SAkhilesh Sanikop "d3d0912e3fdb956fef416a010bd7b4c2", "a2fca8abd9fd38d2eef3c4495d9eff78",
661*09537850SAkhilesh Sanikop };
662*09537850SAkhilesh Sanikop
663*09537850SAkhilesh Sanikop static const char* const kTestDigestsChromaV12bpp[12] = {
664*09537850SAkhilesh Sanikop "0d1890335f4464167de22353678ca9c6", "9e6830aba73139407196f1c811f910bc",
665*09537850SAkhilesh Sanikop "6018f2fb76bd648bef0262471cfeba5c", "78e1ae1b790d709cdb8997621cf0fde3",
666*09537850SAkhilesh Sanikop "5b44ae281d7f9db2f17aa3c24b4741dd", "f931d16991669cb16721de87da9b8067",
667*09537850SAkhilesh Sanikop "5580f2aed349d9cabdafb9fc25a57b1c", "86918cd78bf95e6d4405dd050f5890b8",
668*09537850SAkhilesh Sanikop "13c8b314eeebe35fa60b703d94e1b2c1", "13c6fb75cab3f42e0d4ca31e4d068b0e",
669*09537850SAkhilesh Sanikop "bb9ca0bd6f8cd67e44c8ac2803abf5a5", "0da4ea711ffe557bb66577392b6f148b",
670*09537850SAkhilesh Sanikop };
671*09537850SAkhilesh Sanikop
672*09537850SAkhilesh Sanikop assert(!(subsampling_x == 0 && subsampling_y == 1));
673*09537850SAkhilesh Sanikop const int base_index = 3 * coeff_lag + subsampling_x + subsampling_y;
674*09537850SAkhilesh Sanikop switch (bitdepth) {
675*09537850SAkhilesh Sanikop case 8:
676*09537850SAkhilesh Sanikop return kTestDigestsChromaV8bpp[base_index];
677*09537850SAkhilesh Sanikop case 10:
678*09537850SAkhilesh Sanikop return kTestDigestsChromaV10bpp[base_index];
679*09537850SAkhilesh Sanikop case 12:
680*09537850SAkhilesh Sanikop return kTestDigestsChromaV12bpp[base_index];
681*09537850SAkhilesh Sanikop default:
682*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
683*09537850SAkhilesh Sanikop return nullptr;
684*09537850SAkhilesh Sanikop }
685*09537850SAkhilesh Sanikop }
686*09537850SAkhilesh Sanikop
GetGrainGenerationTestDigestLuma(int bitdepth,int param_index)687*09537850SAkhilesh Sanikop const char* GetGrainGenerationTestDigestLuma(int bitdepth, int param_index) {
688*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma8bpp[kNumFilmGrainTestParams] = {
689*09537850SAkhilesh Sanikop "c48babd99e5cfcbaa13d8b6e0c12e644", "da4b971d2de19b709e2bc98d2e50caf3",
690*09537850SAkhilesh Sanikop "96c72faac19a79c138afeea8b8ae8c7a", "90a2b9c8304a44d14e83ca51bfd2fe8a",
691*09537850SAkhilesh Sanikop "72bd3aa85c17850acb430afb4183bf1a", "a0acf76349b9efbc9181fc31153d9ef6",
692*09537850SAkhilesh Sanikop "6da74dd631a4ec8b9372c0bbec22e246", "6e11fa230f0e5fbb13084255c22cabf9",
693*09537850SAkhilesh Sanikop "be1d257b762f9880d81680e9325932a2", "37e302075af8130b371de4430e8a22cf",
694*09537850SAkhilesh Sanikop };
695*09537850SAkhilesh Sanikop
696*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma10bpp[kNumFilmGrainTestParams] = {
697*09537850SAkhilesh Sanikop "0a40fd2f261095a6154584a531328142", "9d0c8173a94a0514c769e94b6f254030",
698*09537850SAkhilesh Sanikop "7894e959fdd5545895412e1512c9352d", "6802cad2748cf6db7f66f53807ee46ab",
699*09537850SAkhilesh Sanikop "ea24e962b98351c3d929a8ae41e320e2", "b333dc944274a3a094073889ca6e11d6",
700*09537850SAkhilesh Sanikop "7211d7ac0ff7d11b5ef1538c0d98f43d", "ef9f9cbc101a07da7bfa62637130e331",
701*09537850SAkhilesh Sanikop "85a122e32648fde84b883a1f98947c60", "dee656e3791138285bc5b71e3491a177",
702*09537850SAkhilesh Sanikop };
703*09537850SAkhilesh Sanikop
704*09537850SAkhilesh Sanikop static const char* const kTestDigestsLuma12bpp[kNumFilmGrainTestParams] = {
705*09537850SAkhilesh Sanikop "ae359794b5340d073d597117046886ac", "4d4ad3908b4fb0f248a0086537dd6b1e",
706*09537850SAkhilesh Sanikop "672a97e15180cbeeaf76d763992c9f23", "739124d10d16e00a158e833ea92107bc",
707*09537850SAkhilesh Sanikop "4c38c738ff7ffc50adaa4474584d3aae", "ca05ba7e51000a7d10e5cbb2101bbd86",
708*09537850SAkhilesh Sanikop "e207022b916bf03a76ac8742af29853d", "7454bf1859149237ff74f1161156c857",
709*09537850SAkhilesh Sanikop "10fc2a16e663bbc305255b0883cfcd45", "4228abff6899bb33839b579288ab29fe",
710*09537850SAkhilesh Sanikop };
711*09537850SAkhilesh Sanikop
712*09537850SAkhilesh Sanikop switch (bitdepth) {
713*09537850SAkhilesh Sanikop case 8:
714*09537850SAkhilesh Sanikop return kTestDigestsLuma8bpp[param_index];
715*09537850SAkhilesh Sanikop case 10:
716*09537850SAkhilesh Sanikop return kTestDigestsLuma10bpp[param_index];
717*09537850SAkhilesh Sanikop case 12:
718*09537850SAkhilesh Sanikop return kTestDigestsLuma12bpp[param_index];
719*09537850SAkhilesh Sanikop default:
720*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
721*09537850SAkhilesh Sanikop return nullptr;
722*09537850SAkhilesh Sanikop }
723*09537850SAkhilesh Sanikop }
724*09537850SAkhilesh Sanikop
GetConstructStripesTestDigest(int bitdepth,int overlap_flag,int subsampling_x,int subsampling_y)725*09537850SAkhilesh Sanikop const char* GetConstructStripesTestDigest(int bitdepth, int overlap_flag,
726*09537850SAkhilesh Sanikop int subsampling_x,
727*09537850SAkhilesh Sanikop int subsampling_y) {
728*09537850SAkhilesh Sanikop static const char* const kTestDigests8bpp[6] = {
729*09537850SAkhilesh Sanikop "cd14aaa6fc1728290fa75772730a2155", "13ad4551feadccc3a3a9bd5e25878d2a",
730*09537850SAkhilesh Sanikop "ed6ad9532c96ef0d79ff3228c89a429f", "82f307a7f5fc3308c3ebe268b5169e70",
731*09537850SAkhilesh Sanikop "aed793d525b85349a8c2eb6d40e93969", "311c3deb727621a7d4f18e8defb65de7",
732*09537850SAkhilesh Sanikop };
733*09537850SAkhilesh Sanikop
734*09537850SAkhilesh Sanikop static const char* const kTestDigests10bpp[6] = {
735*09537850SAkhilesh Sanikop "4fe2fa1e428737de3595be3a097d0203", "80568c3c3b53bdbbd03b820179092dcd",
736*09537850SAkhilesh Sanikop "bc7b73099961a0739c36e027d6d09ea1", "e5331364e5146a6327fd94e1467f59a3",
737*09537850SAkhilesh Sanikop "125bf18b7787e8f0792ea12f9210de0d", "21cf98cbce17eca77dc150cc9be0e0a0",
738*09537850SAkhilesh Sanikop };
739*09537850SAkhilesh Sanikop
740*09537850SAkhilesh Sanikop static const char* const kTestDigests12bpp[6] = {
741*09537850SAkhilesh Sanikop "57f8e17078b6e8935252e918a2562636", "556a7b294a99bf1163b7166b4f68357e",
742*09537850SAkhilesh Sanikop "249bee5572cd7d1cc07182c97adc4ba7", "9bf43ae1998c2a5b2e5f4d8236b58747",
743*09537850SAkhilesh Sanikop "477c08fa26499936e5bb03bde097633e", "fe64b7166ff87ea0711ae4f519cadd59",
744*09537850SAkhilesh Sanikop };
745*09537850SAkhilesh Sanikop
746*09537850SAkhilesh Sanikop const int base_index = 3 * overlap_flag + subsampling_x + subsampling_y;
747*09537850SAkhilesh Sanikop switch (bitdepth) {
748*09537850SAkhilesh Sanikop case 8:
749*09537850SAkhilesh Sanikop return kTestDigests8bpp[base_index];
750*09537850SAkhilesh Sanikop case 10:
751*09537850SAkhilesh Sanikop return kTestDigests10bpp[base_index];
752*09537850SAkhilesh Sanikop case 12:
753*09537850SAkhilesh Sanikop return kTestDigests12bpp[base_index];
754*09537850SAkhilesh Sanikop default:
755*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
756*09537850SAkhilesh Sanikop return nullptr;
757*09537850SAkhilesh Sanikop }
758*09537850SAkhilesh Sanikop }
759*09537850SAkhilesh Sanikop
GetConstructImageTestDigest(int bitdepth,int overlap_flag,int subsampling_x,int subsampling_y)760*09537850SAkhilesh Sanikop const char* GetConstructImageTestDigest(int bitdepth, int overlap_flag,
761*09537850SAkhilesh Sanikop int subsampling_x, int subsampling_y) {
762*09537850SAkhilesh Sanikop static const char* const kTestDigests8bpp[6] = {
763*09537850SAkhilesh Sanikop "17030fc692e685557a3717f9334af7e8", "d16ea46147183cd7bc36bcfc2f936a5b",
764*09537850SAkhilesh Sanikop "68152958540dbec885f71e3bcd7aa088", "bb43b420f05a122eb4780aca06055ab1",
765*09537850SAkhilesh Sanikop "87567b04fbdf64f391258c0742de266b", "ce87d556048b3de32570faf6729f4010",
766*09537850SAkhilesh Sanikop };
767*09537850SAkhilesh Sanikop
768*09537850SAkhilesh Sanikop static const char* const kTestDigests10bpp[6] = {
769*09537850SAkhilesh Sanikop "5b31b29a5e22126a9bf8cd6a01645777", "2bb94a25164117f2ab18dae18e2c6577",
770*09537850SAkhilesh Sanikop "27e57a4ed6f0c9fe0a763a03f44805e8", "481642ab0b07437b76b169aa4eb82123",
771*09537850SAkhilesh Sanikop "656a9ef056b04565bec9ca7e0873c408", "a70fff81ab28d02d99dd4f142699ba39",
772*09537850SAkhilesh Sanikop };
773*09537850SAkhilesh Sanikop
774*09537850SAkhilesh Sanikop static const char* const kTestDigests12bpp[6] = {
775*09537850SAkhilesh Sanikop "146f7ceadaf77e7a3c41e191a58c1d3c", "de18526db39630936733e687cdca189e",
776*09537850SAkhilesh Sanikop "165c96ff63bf3136505ab1d239f7ceae", "a102636662547f84e5f6fb6c3e4ef959",
777*09537850SAkhilesh Sanikop "4cb073fcc783c158a95c0b1ce0d27e9f", "3a734c71d4325a7da53e2a6e00f81647",
778*09537850SAkhilesh Sanikop };
779*09537850SAkhilesh Sanikop
780*09537850SAkhilesh Sanikop const int base_index = 3 * overlap_flag + subsampling_x + subsampling_y;
781*09537850SAkhilesh Sanikop switch (bitdepth) {
782*09537850SAkhilesh Sanikop case 8:
783*09537850SAkhilesh Sanikop return kTestDigests8bpp[base_index];
784*09537850SAkhilesh Sanikop case 10:
785*09537850SAkhilesh Sanikop return kTestDigests10bpp[base_index];
786*09537850SAkhilesh Sanikop case 12:
787*09537850SAkhilesh Sanikop return kTestDigests12bpp[base_index];
788*09537850SAkhilesh Sanikop default:
789*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
790*09537850SAkhilesh Sanikop return nullptr;
791*09537850SAkhilesh Sanikop }
792*09537850SAkhilesh Sanikop }
793*09537850SAkhilesh Sanikop
GetScalingInitTestDigest(int param_index,int bitdepth)794*09537850SAkhilesh Sanikop const char* GetScalingInitTestDigest(int param_index, int bitdepth) {
795*09537850SAkhilesh Sanikop static const char* const kTestDigests8bpp[kNumFilmGrainTestParams] = {
796*09537850SAkhilesh Sanikop "315202ca3bf9c46eac8605e89baffd2a", "640f6408702b07ab7e832e7326cce56f",
797*09537850SAkhilesh Sanikop "f75ee83e3912a3f25949e852d67326cf", "211223f5d6a4b42a8e3c662f921b71c0",
798*09537850SAkhilesh Sanikop "f75ee83e3912a3f25949e852d67326cf", "e7a1de8c5a2cac2145c586ecf1f9051c",
799*09537850SAkhilesh Sanikop "e7a1de8c5a2cac2145c586ecf1f9051c", "276fe5e3b30b2db2a9ff798eb6cb8e00",
800*09537850SAkhilesh Sanikop "ac67f1c3aff2f50ed4b1975bde67ffe3", "8db6145a60d506cc94f07cef8b27c681",
801*09537850SAkhilesh Sanikop };
802*09537850SAkhilesh Sanikop
803*09537850SAkhilesh Sanikop static const char* const kTestDigests10bpp[kNumFilmGrainTestParams] = {
804*09537850SAkhilesh Sanikop "c50be59c62b634ff45ddfbe5b978adfc", "7626286109a2a1eaf0a26f6b2bbab9aa",
805*09537850SAkhilesh Sanikop "f2302988140c47a0724fc55ff523b6ec", "5318e33d8a59a526347ffa6a72ba6ebd",
806*09537850SAkhilesh Sanikop "f2302988140c47a0724fc55ff523b6ec", "f435b5fe98e9d8b6c61fa6f457601c2c",
807*09537850SAkhilesh Sanikop "f435b5fe98e9d8b6c61fa6f457601c2c", "ff07a2944dbe094d01e199098764941c",
808*09537850SAkhilesh Sanikop "11b3e256c74cee2b5679f7457793869a", "89fab5c1db09e242d0494d1c696a774a",
809*09537850SAkhilesh Sanikop };
810*09537850SAkhilesh Sanikop
811*09537850SAkhilesh Sanikop static const char* const kTestDigests12bpp[kNumFilmGrainTestParams] = {
812*09537850SAkhilesh Sanikop "1554df49a863a851d146213e09d311a4", "84808c3ed3b5495a62c9d2dd9a08cb26",
813*09537850SAkhilesh Sanikop "bb31f083a3bd9ef26587478b8752f280", "34fdfe61d6871e4882e38062a0725c5c",
814*09537850SAkhilesh Sanikop "bb31f083a3bd9ef26587478b8752f280", "e7b8c3e4508ceabe89b78f10a9e160b8",
815*09537850SAkhilesh Sanikop "e7b8c3e4508ceabe89b78f10a9e160b8", "a0ccc9e3d0f0c9d1f08f1249264d92f5",
816*09537850SAkhilesh Sanikop "7992a96883c8a9a35d6ca8961bc4515b", "de906ce2c0fceed6f168215447b21b16",
817*09537850SAkhilesh Sanikop };
818*09537850SAkhilesh Sanikop
819*09537850SAkhilesh Sanikop switch (bitdepth) {
820*09537850SAkhilesh Sanikop case 8:
821*09537850SAkhilesh Sanikop return kTestDigests8bpp[param_index];
822*09537850SAkhilesh Sanikop case 10:
823*09537850SAkhilesh Sanikop return kTestDigests10bpp[param_index];
824*09537850SAkhilesh Sanikop case 12:
825*09537850SAkhilesh Sanikop return kTestDigests12bpp[param_index];
826*09537850SAkhilesh Sanikop default:
827*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
828*09537850SAkhilesh Sanikop return nullptr;
829*09537850SAkhilesh Sanikop }
830*09537850SAkhilesh Sanikop }
831*09537850SAkhilesh Sanikop
GetBlendLumaTestDigest(int bitdepth)832*09537850SAkhilesh Sanikop const char* GetBlendLumaTestDigest(int bitdepth) {
833*09537850SAkhilesh Sanikop static const char* const kTestDigests[] = {
834*09537850SAkhilesh Sanikop "de35b16c702690b1d311cdd0973835d7",
835*09537850SAkhilesh Sanikop "60e9f24dcaaa0207a8db5ab5f3c66608",
836*09537850SAkhilesh Sanikop "8e7d44b620bb7768459074be6bfbca7b",
837*09537850SAkhilesh Sanikop };
838*09537850SAkhilesh Sanikop
839*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
840*09537850SAkhilesh Sanikop return kTestDigests[(bitdepth - 8) / 2];
841*09537850SAkhilesh Sanikop }
842*09537850SAkhilesh Sanikop
GetBlendChromaUTestDigest(int bitdepth,int chroma_scaling_from_luma,int subsampling_x,int subsampling_y)843*09537850SAkhilesh Sanikop const char* GetBlendChromaUTestDigest(int bitdepth,
844*09537850SAkhilesh Sanikop int chroma_scaling_from_luma,
845*09537850SAkhilesh Sanikop int subsampling_x, int subsampling_y) {
846*09537850SAkhilesh Sanikop static const char* const kTestDigests8bpp[6] = {
847*09537850SAkhilesh Sanikop "36ca194734d45e75079baba1f3ec9e9e", "182b388061f59fd3e24ef4581c536e67",
848*09537850SAkhilesh Sanikop "2e7843b4c624f03316c3cbe1cc835859", "39e6d9606915da6a41168fbb006b55e4",
849*09537850SAkhilesh Sanikop "3f44a4e252d4823544ac66a900dc7983", "1860f0831841f262d66b23f6a6b5833b",
850*09537850SAkhilesh Sanikop };
851*09537850SAkhilesh Sanikop
852*09537850SAkhilesh Sanikop static const char* const kTestDigests10bpp[6] = {
853*09537850SAkhilesh Sanikop "2054665564f55750c9588b505eb01ac0", "4d8b0e248f8a6bfc72516aa164e76b0b",
854*09537850SAkhilesh Sanikop "7e549800a4f9fff6833bb7738e272baf", "8de6f30dcda99a37b359fd815e62d2f7",
855*09537850SAkhilesh Sanikop "9b7958a2278a16bce2b7bc31fdd811f5", "c5c3c8cccf6a2b4e40b4a412a5bf4f08",
856*09537850SAkhilesh Sanikop };
857*09537850SAkhilesh Sanikop
858*09537850SAkhilesh Sanikop static const char* const kTestDigests12bpp[6] = {
859*09537850SAkhilesh Sanikop "8fad0cc641da35e0d2d8f178c7ce8394", "793eb9d2e6b4ea2e3bb08e7068236155",
860*09537850SAkhilesh Sanikop "9156bd85ab9493d8867a174f920bb1e6", "6834319b4c88e3e0c96b6f8d7efd08dd",
861*09537850SAkhilesh Sanikop "c40e492790d3803a734efbc6feca46e2", "d884c3b1e2c21d98844ca7639e0599a5",
862*09537850SAkhilesh Sanikop };
863*09537850SAkhilesh Sanikop
864*09537850SAkhilesh Sanikop const int base_index =
865*09537850SAkhilesh Sanikop 3 * chroma_scaling_from_luma + subsampling_x + subsampling_y;
866*09537850SAkhilesh Sanikop switch (bitdepth) {
867*09537850SAkhilesh Sanikop case 8:
868*09537850SAkhilesh Sanikop return kTestDigests8bpp[base_index];
869*09537850SAkhilesh Sanikop case 10:
870*09537850SAkhilesh Sanikop return kTestDigests10bpp[base_index];
871*09537850SAkhilesh Sanikop case 12:
872*09537850SAkhilesh Sanikop return kTestDigests12bpp[base_index];
873*09537850SAkhilesh Sanikop default:
874*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
875*09537850SAkhilesh Sanikop return nullptr;
876*09537850SAkhilesh Sanikop }
877*09537850SAkhilesh Sanikop }
878*09537850SAkhilesh Sanikop
GetBlendChromaVTestDigest(int bitdepth,int chroma_scaling_from_luma,int subsampling_x,int subsampling_y)879*09537850SAkhilesh Sanikop const char* GetBlendChromaVTestDigest(int bitdepth,
880*09537850SAkhilesh Sanikop int chroma_scaling_from_luma,
881*09537850SAkhilesh Sanikop int subsampling_x, int subsampling_y) {
882*09537850SAkhilesh Sanikop static const char* const kTestDigests8bpp[6] = {
883*09537850SAkhilesh Sanikop "9a353e4f86d7ebaa980f7f6cfc0995ad", "17589b4039ed49ba16f32db9fae724b7",
884*09537850SAkhilesh Sanikop "76ae8bed48a173b548993b6e1824ff67", "c1458ac9bdfbf0b4d6a175343b17b27b",
885*09537850SAkhilesh Sanikop "fa76d1c8e48957537f26af6a5b54ec14", "313fe3c34568b7f9c5ecb09d419d4ba4",
886*09537850SAkhilesh Sanikop };
887*09537850SAkhilesh Sanikop
888*09537850SAkhilesh Sanikop static const char* const kTestDigests10bpp[6] = {
889*09537850SAkhilesh Sanikop "8ab5a8e03f07547260033d6a0b689e3c", "275ede58d311e2f5fd76f222f45a64fc",
890*09537850SAkhilesh Sanikop "ce13916e0f7b02087fd0356534d32770", "165bfc8cda0266936a67fa4ec9b215cb",
891*09537850SAkhilesh Sanikop "ed4382caa936acf1158ff8049d18ffac", "942bdd1344c9182dd7572099fb9372db",
892*09537850SAkhilesh Sanikop };
893*09537850SAkhilesh Sanikop
894*09537850SAkhilesh Sanikop static const char* const kTestDigests12bpp[6] = {
895*09537850SAkhilesh Sanikop "70704a1e171a3a70d40b7d0037a75fbc", "62549e2afbf36a1ed405a6574d39c542",
896*09537850SAkhilesh Sanikop "e93889927ab77c6e0767ff071d980c02", "a0c1f6ed78874137710fee7418d80959",
897*09537850SAkhilesh Sanikop "f6283e36a25cb867e30bdf0bfdb2124b", "741c2d48898835b9d9e3bd0b6ac6269a",
898*09537850SAkhilesh Sanikop };
899*09537850SAkhilesh Sanikop
900*09537850SAkhilesh Sanikop const int base_index =
901*09537850SAkhilesh Sanikop 3 * chroma_scaling_from_luma + subsampling_x + subsampling_y;
902*09537850SAkhilesh Sanikop switch (bitdepth) {
903*09537850SAkhilesh Sanikop case 8:
904*09537850SAkhilesh Sanikop return kTestDigests8bpp[base_index];
905*09537850SAkhilesh Sanikop case 10:
906*09537850SAkhilesh Sanikop return kTestDigests10bpp[base_index];
907*09537850SAkhilesh Sanikop case 12:
908*09537850SAkhilesh Sanikop return kTestDigests12bpp[base_index];
909*09537850SAkhilesh Sanikop default:
910*09537850SAkhilesh Sanikop assert(bitdepth == 8 || bitdepth == 10 || bitdepth == 12);
911*09537850SAkhilesh Sanikop return nullptr;
912*09537850SAkhilesh Sanikop }
913*09537850SAkhilesh Sanikop }
914*09537850SAkhilesh Sanikop
915*09537850SAkhilesh Sanikop // GetFilmGrainRandomNumber() is only invoked with |bits| equal to 11 or 8. Test
916*09537850SAkhilesh Sanikop // both values of |bits|.
TEST(FilmGrainTest,GetFilmGrainRandomNumber)917*09537850SAkhilesh Sanikop TEST(FilmGrainTest, GetFilmGrainRandomNumber) {
918*09537850SAkhilesh Sanikop uint16_t seed = 51968;
919*09537850SAkhilesh Sanikop const struct {
920*09537850SAkhilesh Sanikop int rand;
921*09537850SAkhilesh Sanikop uint16_t seed;
922*09537850SAkhilesh Sanikop } kExpected11[5] = {
923*09537850SAkhilesh Sanikop {812, 25984}, {406, 12992}, {1227, 39264}, {1637, 52400}, {818, 26200},
924*09537850SAkhilesh Sanikop };
925*09537850SAkhilesh Sanikop for (int i = 0; i < 5; ++i) {
926*09537850SAkhilesh Sanikop int rand = GetFilmGrainRandomNumber(11, &seed);
927*09537850SAkhilesh Sanikop EXPECT_EQ(rand, kExpected11[i].rand) << "i = " << i;
928*09537850SAkhilesh Sanikop EXPECT_EQ(seed, kExpected11[i].seed) << "i = " << i;
929*09537850SAkhilesh Sanikop }
930*09537850SAkhilesh Sanikop const struct {
931*09537850SAkhilesh Sanikop int rand;
932*09537850SAkhilesh Sanikop uint16_t seed;
933*09537850SAkhilesh Sanikop } kExpected8[5] = {
934*09537850SAkhilesh Sanikop {179, 45868}, {89, 22934}, {44, 11467}, {150, 38501}, {75, 19250},
935*09537850SAkhilesh Sanikop };
936*09537850SAkhilesh Sanikop for (int i = 0; i < 5; ++i) {
937*09537850SAkhilesh Sanikop int rand = GetFilmGrainRandomNumber(8, &seed);
938*09537850SAkhilesh Sanikop EXPECT_EQ(rand, kExpected8[i].rand) << "i = " << i;
939*09537850SAkhilesh Sanikop EXPECT_EQ(seed, kExpected8[i].seed) << "i = " << i;
940*09537850SAkhilesh Sanikop }
941*09537850SAkhilesh Sanikop }
942*09537850SAkhilesh Sanikop
943*09537850SAkhilesh Sanikop // In FilmGrainParams, if num_u_points and num_v_points are both 0 and
944*09537850SAkhilesh Sanikop // chroma_scaling_from_luma is false, GenerateChromaGrains() should set both
945*09537850SAkhilesh Sanikop // the u_grain and v_grain arrays to all zeros.
TEST(FilmGrainTest,GenerateZeroChromaGrains)946*09537850SAkhilesh Sanikop TEST(FilmGrainTest, GenerateZeroChromaGrains) {
947*09537850SAkhilesh Sanikop FilmGrainParams film_grain_params = {};
948*09537850SAkhilesh Sanikop film_grain_params.apply_grain = true;
949*09537850SAkhilesh Sanikop film_grain_params.update_grain = true;
950*09537850SAkhilesh Sanikop film_grain_params.chroma_scaling = 8;
951*09537850SAkhilesh Sanikop film_grain_params.auto_regression_shift = 6;
952*09537850SAkhilesh Sanikop film_grain_params.grain_seed = 51968;
953*09537850SAkhilesh Sanikop
954*09537850SAkhilesh Sanikop int8_t u_grain[73 * 82];
955*09537850SAkhilesh Sanikop int8_t v_grain[73 * 82];
956*09537850SAkhilesh Sanikop const int chroma_width = 44;
957*09537850SAkhilesh Sanikop const int chroma_height = 38;
958*09537850SAkhilesh Sanikop
959*09537850SAkhilesh Sanikop // Initialize u_grain and v_grain with arbitrary nonzero values.
960*09537850SAkhilesh Sanikop memset(u_grain, 1, sizeof(u_grain));
961*09537850SAkhilesh Sanikop memset(v_grain, 2, sizeof(v_grain));
962*09537850SAkhilesh Sanikop for (int y = 0; y < chroma_height; ++y) {
963*09537850SAkhilesh Sanikop for (int x = 0; x < chroma_width; ++x) {
964*09537850SAkhilesh Sanikop EXPECT_NE(u_grain[y * chroma_width + x], 0);
965*09537850SAkhilesh Sanikop EXPECT_NE(v_grain[y * chroma_width + x], 0);
966*09537850SAkhilesh Sanikop }
967*09537850SAkhilesh Sanikop }
968*09537850SAkhilesh Sanikop
969*09537850SAkhilesh Sanikop FilmGrain<8>::GenerateChromaGrains(film_grain_params, chroma_width,
970*09537850SAkhilesh Sanikop chroma_height, u_grain, v_grain);
971*09537850SAkhilesh Sanikop
972*09537850SAkhilesh Sanikop for (int y = 0; y < chroma_height; ++y) {
973*09537850SAkhilesh Sanikop for (int x = 0; x < chroma_width; ++x) {
974*09537850SAkhilesh Sanikop EXPECT_EQ(u_grain[y * chroma_width + x], 0);
975*09537850SAkhilesh Sanikop EXPECT_EQ(v_grain[y * chroma_width + x], 0);
976*09537850SAkhilesh Sanikop }
977*09537850SAkhilesh Sanikop }
978*09537850SAkhilesh Sanikop }
979*09537850SAkhilesh Sanikop
980*09537850SAkhilesh Sanikop // First parameter is coefficient lag. Second parameter is the index into
981*09537850SAkhilesh Sanikop // |kFilmGrainParams|.
982*09537850SAkhilesh Sanikop template <int bitdepth>
983*09537850SAkhilesh Sanikop class AutoRegressionTestLuma
984*09537850SAkhilesh Sanikop : public testing::TestWithParam<std::tuple<int, int>> {
985*09537850SAkhilesh Sanikop public:
986*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
987*09537850SAkhilesh Sanikop using GrainType =
988*09537850SAkhilesh Sanikop typename std::conditional<bitdepth == 8, int8_t, int16_t>::type;
989*09537850SAkhilesh Sanikop
AutoRegressionTestLuma()990*09537850SAkhilesh Sanikop AutoRegressionTestLuma() {
991*09537850SAkhilesh Sanikop FilmGrainInit_C();
992*09537850SAkhilesh Sanikop const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
993*09537850SAkhilesh Sanikop const int index = std::get<0>(GetParam()) - 1;
994*09537850SAkhilesh Sanikop base_luma_auto_regression_func_ =
995*09537850SAkhilesh Sanikop dsp->film_grain.luma_auto_regression[index];
996*09537850SAkhilesh Sanikop
997*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
998*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
999*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
1000*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "C/")) {
1001*09537850SAkhilesh Sanikop base_luma_auto_regression_func_ = nullptr;
1002*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "NEON/")) {
1003*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1004*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
1005*09537850SAkhilesh Sanikop #endif
1006*09537850SAkhilesh Sanikop }
1007*09537850SAkhilesh Sanikop luma_auto_regression_func_ = dsp->film_grain.luma_auto_regression[index];
1008*09537850SAkhilesh Sanikop }
1009*09537850SAkhilesh Sanikop
1010*09537850SAkhilesh Sanikop protected:
1011*09537850SAkhilesh Sanikop // |compare| determines whether to compare the output blocks from the SIMD
1012*09537850SAkhilesh Sanikop // implementation, if used, and the C implementation.
1013*09537850SAkhilesh Sanikop // |saturate| determines whether to set the inputs to maximum values. This is
1014*09537850SAkhilesh Sanikop // intended primarily as a way to simplify differences in output when
1015*09537850SAkhilesh Sanikop // debugging.
1016*09537850SAkhilesh Sanikop void TestAutoRegressiveFilterLuma(int coeff_lag, int param_index,
1017*09537850SAkhilesh Sanikop int num_runs, bool saturate, bool compare);
1018*09537850SAkhilesh Sanikop LumaAutoRegressionFunc luma_auto_regression_func_;
1019*09537850SAkhilesh Sanikop LumaAutoRegressionFunc base_luma_auto_regression_func_;
1020*09537850SAkhilesh Sanikop GrainType luma_block_buffer_[kLumaBlockSize];
1021*09537850SAkhilesh Sanikop GrainType base_luma_block_buffer_[kLumaBlockSize];
1022*09537850SAkhilesh Sanikop };
1023*09537850SAkhilesh Sanikop
1024*09537850SAkhilesh Sanikop // First parameter is coefficient lag. Second parameter is the index into
1025*09537850SAkhilesh Sanikop // |kFilmGrainParams|.
1026*09537850SAkhilesh Sanikop template <int bitdepth>
TestAutoRegressiveFilterLuma(int coeff_lag,int param_index,int num_runs,bool saturate,bool compare)1027*09537850SAkhilesh Sanikop void AutoRegressionTestLuma<bitdepth>::TestAutoRegressiveFilterLuma(
1028*09537850SAkhilesh Sanikop int coeff_lag, int param_index, int num_runs, bool saturate, bool compare) {
1029*09537850SAkhilesh Sanikop if (luma_auto_regression_func_ == nullptr) return;
1030*09537850SAkhilesh Sanikop // Compare is only needed for NEON tests to compare with C output.
1031*09537850SAkhilesh Sanikop if (base_luma_auto_regression_func_ == nullptr && compare) return;
1032*09537850SAkhilesh Sanikop FilmGrainParams params = kFilmGrainParams[param_index];
1033*09537850SAkhilesh Sanikop params.auto_regression_coeff_lag = coeff_lag;
1034*09537850SAkhilesh Sanikop const int grain_max = GetGrainMax<bitdepth>();
1035*09537850SAkhilesh Sanikop for (int y = 0; y < kLumaHeight; ++y) {
1036*09537850SAkhilesh Sanikop for (int x = 0; x < kLumaWidth; ++x) {
1037*09537850SAkhilesh Sanikop if (saturate) {
1038*09537850SAkhilesh Sanikop luma_block_buffer_[y * kLumaWidth + x] = grain_max;
1039*09537850SAkhilesh Sanikop } else {
1040*09537850SAkhilesh Sanikop luma_block_buffer_[y * kLumaWidth + x] =
1041*09537850SAkhilesh Sanikop std::min(x - (kLumaWidth >> 1), y - (kLumaHeight >> 1)) *
1042*09537850SAkhilesh Sanikop (1 << (bitdepth - 8));
1043*09537850SAkhilesh Sanikop }
1044*09537850SAkhilesh Sanikop }
1045*09537850SAkhilesh Sanikop }
1046*09537850SAkhilesh Sanikop
1047*09537850SAkhilesh Sanikop if (saturate) {
1048*09537850SAkhilesh Sanikop memset(params.auto_regression_coeff_y, 127,
1049*09537850SAkhilesh Sanikop sizeof(params.auto_regression_coeff_y));
1050*09537850SAkhilesh Sanikop }
1051*09537850SAkhilesh Sanikop if (compare) {
1052*09537850SAkhilesh Sanikop memcpy(base_luma_block_buffer_, luma_block_buffer_,
1053*09537850SAkhilesh Sanikop sizeof(luma_block_buffer_));
1054*09537850SAkhilesh Sanikop }
1055*09537850SAkhilesh Sanikop
1056*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
1057*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
1058*09537850SAkhilesh Sanikop luma_auto_regression_func_(params, luma_block_buffer_);
1059*09537850SAkhilesh Sanikop }
1060*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
1061*09537850SAkhilesh Sanikop if (num_runs > 1) {
1062*09537850SAkhilesh Sanikop printf("AutoRegressionLuma lag=%d, param_index=%d: %d us\n", coeff_lag,
1063*09537850SAkhilesh Sanikop param_index,
1064*09537850SAkhilesh Sanikop static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1065*09537850SAkhilesh Sanikop return;
1066*09537850SAkhilesh Sanikop }
1067*09537850SAkhilesh Sanikop if (compare) {
1068*09537850SAkhilesh Sanikop base_luma_auto_regression_func_(params, base_luma_block_buffer_);
1069*09537850SAkhilesh Sanikop EXPECT_TRUE(test_utils::CompareBlocks(
1070*09537850SAkhilesh Sanikop luma_block_buffer_, base_luma_block_buffer_, kLumaWidth, kLumaHeight,
1071*09537850SAkhilesh Sanikop kLumaWidth, kLumaWidth, false));
1072*09537850SAkhilesh Sanikop } else {
1073*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
1074*09537850SAkhilesh Sanikop "FilmGrain",
1075*09537850SAkhilesh Sanikop absl::StrFormat("AutoRegressionLuma lag=%d, param_index=%d", coeff_lag,
1076*09537850SAkhilesh Sanikop param_index)
1077*09537850SAkhilesh Sanikop .c_str(),
1078*09537850SAkhilesh Sanikop GetARTestDigestLuma(bitdepth, coeff_lag, param_index),
1079*09537850SAkhilesh Sanikop luma_block_buffer_, sizeof(luma_block_buffer_), elapsed_time);
1080*09537850SAkhilesh Sanikop }
1081*09537850SAkhilesh Sanikop }
1082*09537850SAkhilesh Sanikop
1083*09537850SAkhilesh Sanikop using AutoRegressionTestLuma8bpp = AutoRegressionTestLuma<8>;
1084*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma8bpp,AutoRegressiveFilterLuma)1085*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma8bpp, AutoRegressiveFilterLuma) {
1086*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1087*09537850SAkhilesh Sanikop 1, /*saturate=*/false,
1088*09537850SAkhilesh Sanikop /*compare=*/false);
1089*09537850SAkhilesh Sanikop }
1090*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma8bpp,AutoRegressiveFilterLumaSaturated)1091*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma8bpp, AutoRegressiveFilterLumaSaturated) {
1092*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1093*09537850SAkhilesh Sanikop 1, /*saturate=*/true,
1094*09537850SAkhilesh Sanikop /*compare=*/true);
1095*09537850SAkhilesh Sanikop }
1096*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma8bpp,DISABLED_Speed)1097*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma8bpp, DISABLED_Speed) {
1098*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1099*09537850SAkhilesh Sanikop 1e5,
1100*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1101*09537850SAkhilesh Sanikop }
1102*09537850SAkhilesh Sanikop
1103*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1104*09537850SAkhilesh Sanikop using AutoRegressionTestLuma10bpp = AutoRegressionTestLuma<10>;
1105*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma10bpp,AutoRegressiveFilterLuma)1106*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma10bpp, AutoRegressiveFilterLuma) {
1107*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1108*09537850SAkhilesh Sanikop 1, /*saturate=*/false,
1109*09537850SAkhilesh Sanikop /*compare=*/false);
1110*09537850SAkhilesh Sanikop }
1111*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma10bpp,AutoRegressiveFilterLumaSaturated)1112*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma10bpp, AutoRegressiveFilterLumaSaturated) {
1113*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1114*09537850SAkhilesh Sanikop 1, /*saturate=*/true,
1115*09537850SAkhilesh Sanikop /*compare=*/true);
1116*09537850SAkhilesh Sanikop }
1117*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma10bpp,DISABLED_Speed)1118*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma10bpp, DISABLED_Speed) {
1119*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1120*09537850SAkhilesh Sanikop 1e5,
1121*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1122*09537850SAkhilesh Sanikop }
1123*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1124*09537850SAkhilesh Sanikop
1125*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1126*09537850SAkhilesh Sanikop using AutoRegressionTestLuma12bpp = AutoRegressionTestLuma<12>;
1127*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma12bpp,AutoRegressiveFilterLuma)1128*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma12bpp, AutoRegressiveFilterLuma) {
1129*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1130*09537850SAkhilesh Sanikop 1, /*saturate=*/false,
1131*09537850SAkhilesh Sanikop /*compare=*/false);
1132*09537850SAkhilesh Sanikop }
1133*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma12bpp,AutoRegressiveFilterLumaSaturated)1134*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma12bpp, AutoRegressiveFilterLumaSaturated) {
1135*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1136*09537850SAkhilesh Sanikop 1, /*saturate=*/true,
1137*09537850SAkhilesh Sanikop /*compare=*/true);
1138*09537850SAkhilesh Sanikop }
1139*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestLuma12bpp,DISABLED_Speed)1140*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestLuma12bpp, DISABLED_Speed) {
1141*09537850SAkhilesh Sanikop TestAutoRegressiveFilterLuma(std::get<0>(GetParam()), std::get<1>(GetParam()),
1142*09537850SAkhilesh Sanikop 1e5,
1143*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1144*09537850SAkhilesh Sanikop }
1145*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1146*09537850SAkhilesh Sanikop
1147*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
1148*09537850SAkhilesh Sanikop C, AutoRegressionTestLuma8bpp,
1149*09537850SAkhilesh Sanikop testing::Combine(testing::Range(1, 4) /* coeff_lag */,
1150*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */));
1151*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1152*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
1153*09537850SAkhilesh Sanikop NEON, AutoRegressionTestLuma8bpp,
1154*09537850SAkhilesh Sanikop testing::Combine(testing::Range(1, 4) /* coeff_lag */,
1155*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */));
1156*09537850SAkhilesh Sanikop #endif
1157*09537850SAkhilesh Sanikop
1158*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1159*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
1160*09537850SAkhilesh Sanikop C, AutoRegressionTestLuma10bpp,
1161*09537850SAkhilesh Sanikop testing::Combine(testing::Range(1, 4) /* coeff_lag */,
1162*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */));
1163*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1164*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
1165*09537850SAkhilesh Sanikop NEON, AutoRegressionTestLuma10bpp,
1166*09537850SAkhilesh Sanikop testing::Combine(testing::Range(1, 4) /* coeff_lag */,
1167*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */));
1168*09537850SAkhilesh Sanikop #endif
1169*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1170*09537850SAkhilesh Sanikop
1171*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1172*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
1173*09537850SAkhilesh Sanikop C, AutoRegressionTestLuma12bpp,
1174*09537850SAkhilesh Sanikop testing::Combine(testing::Range(1, 4) /* coeff_lag */,
1175*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */));
1176*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1177*09537850SAkhilesh Sanikop
1178*09537850SAkhilesh Sanikop struct AutoRegressionChromaTestParam {
AutoRegressionChromaTestParamlibgav1::dsp::film_grain::__anoncc33db1e0111::AutoRegressionChromaTestParam1179*09537850SAkhilesh Sanikop explicit AutoRegressionChromaTestParam(const std::tuple<int, int>& in)
1180*09537850SAkhilesh Sanikop : coeff_lag(std::get<0>(in)) {
1181*09537850SAkhilesh Sanikop switch (std::get<1>(in)) {
1182*09537850SAkhilesh Sanikop case 0:
1183*09537850SAkhilesh Sanikop subsampling_x = 0;
1184*09537850SAkhilesh Sanikop subsampling_y = 0;
1185*09537850SAkhilesh Sanikop break;
1186*09537850SAkhilesh Sanikop case 1:
1187*09537850SAkhilesh Sanikop subsampling_x = 1;
1188*09537850SAkhilesh Sanikop subsampling_y = 0;
1189*09537850SAkhilesh Sanikop break;
1190*09537850SAkhilesh Sanikop default:
1191*09537850SAkhilesh Sanikop assert(std::get<1>(in) == 2);
1192*09537850SAkhilesh Sanikop subsampling_x = 1;
1193*09537850SAkhilesh Sanikop subsampling_y = 1;
1194*09537850SAkhilesh Sanikop }
1195*09537850SAkhilesh Sanikop }
1196*09537850SAkhilesh Sanikop const int coeff_lag;
1197*09537850SAkhilesh Sanikop int subsampling_x;
1198*09537850SAkhilesh Sanikop int subsampling_y;
1199*09537850SAkhilesh Sanikop };
1200*09537850SAkhilesh Sanikop
1201*09537850SAkhilesh Sanikop template <int bitdepth>
1202*09537850SAkhilesh Sanikop class AutoRegressionTestChroma
1203*09537850SAkhilesh Sanikop : public testing::TestWithParam<std::tuple<int, int>> {
1204*09537850SAkhilesh Sanikop public:
1205*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
1206*09537850SAkhilesh Sanikop using GrainType =
1207*09537850SAkhilesh Sanikop typename std::conditional<bitdepth == 8, int8_t, int16_t>::type;
1208*09537850SAkhilesh Sanikop
AutoRegressionTestChroma()1209*09537850SAkhilesh Sanikop AutoRegressionTestChroma() {
1210*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1211*09537850SAkhilesh Sanikop FilmGrainInit_C();
1212*09537850SAkhilesh Sanikop const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
1213*09537850SAkhilesh Sanikop // This test suite does not cover num_y_points == 0. This should be covered
1214*09537850SAkhilesh Sanikop // in the test of the full synthesis process.
1215*09537850SAkhilesh Sanikop base_chroma_auto_regression_func_ =
1216*09537850SAkhilesh Sanikop dsp->film_grain.chroma_auto_regression[1][test_param.coeff_lag];
1217*09537850SAkhilesh Sanikop
1218*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
1219*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
1220*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
1221*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "C/")) {
1222*09537850SAkhilesh Sanikop base_chroma_auto_regression_func_ = nullptr;
1223*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "NEON/")) {
1224*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1225*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
1226*09537850SAkhilesh Sanikop #endif
1227*09537850SAkhilesh Sanikop }
1228*09537850SAkhilesh Sanikop chroma_auto_regression_func_ =
1229*09537850SAkhilesh Sanikop dsp->film_grain.chroma_auto_regression[1][test_param.coeff_lag];
1230*09537850SAkhilesh Sanikop }
1231*09537850SAkhilesh Sanikop
1232*09537850SAkhilesh Sanikop ~AutoRegressionTestChroma() override = default;
1233*09537850SAkhilesh Sanikop
1234*09537850SAkhilesh Sanikop protected:
1235*09537850SAkhilesh Sanikop // |compare| determines whether to compare the output blocks from the SIMD
1236*09537850SAkhilesh Sanikop // implementation, if used, and the C implementation.
1237*09537850SAkhilesh Sanikop // |saturate| determines whether to set the inputs to maximum values. This is
1238*09537850SAkhilesh Sanikop // intended primarily as a way to simplify differences in output when
1239*09537850SAkhilesh Sanikop // debugging.
1240*09537850SAkhilesh Sanikop void TestAutoRegressiveFilterChroma(int coeff_lag, int subsampling_x,
1241*09537850SAkhilesh Sanikop int subsampling_y, int num_runs,
1242*09537850SAkhilesh Sanikop bool saturate, bool compare);
1243*09537850SAkhilesh Sanikop ChromaAutoRegressionFunc chroma_auto_regression_func_;
1244*09537850SAkhilesh Sanikop ChromaAutoRegressionFunc base_chroma_auto_regression_func_;
1245*09537850SAkhilesh Sanikop GrainType luma_block_buffer_[kLumaBlockSize];
1246*09537850SAkhilesh Sanikop GrainType u_block_buffer_[kChromaBlockSize];
1247*09537850SAkhilesh Sanikop GrainType v_block_buffer_[kChromaBlockSize];
1248*09537850SAkhilesh Sanikop GrainType base_u_block_buffer_[kChromaBlockSize];
1249*09537850SAkhilesh Sanikop GrainType base_v_block_buffer_[kChromaBlockSize];
1250*09537850SAkhilesh Sanikop };
1251*09537850SAkhilesh Sanikop
1252*09537850SAkhilesh Sanikop template <int bitdepth>
TestAutoRegressiveFilterChroma(int coeff_lag,int subsampling_x,int subsampling_y,int num_runs,bool saturate,bool compare)1253*09537850SAkhilesh Sanikop void AutoRegressionTestChroma<bitdepth>::TestAutoRegressiveFilterChroma(
1254*09537850SAkhilesh Sanikop int coeff_lag, int subsampling_x, int subsampling_y, int num_runs,
1255*09537850SAkhilesh Sanikop bool saturate, bool compare) {
1256*09537850SAkhilesh Sanikop if (chroma_auto_regression_func_ == nullptr) return;
1257*09537850SAkhilesh Sanikop // Compare is only needed for NEON tests to compare with C output.
1258*09537850SAkhilesh Sanikop if (base_chroma_auto_regression_func_ == nullptr && compare) return;
1259*09537850SAkhilesh Sanikop
1260*09537850SAkhilesh Sanikop // This function relies on the first set of sampled params for basics. The
1261*09537850SAkhilesh Sanikop // test param generators are used for coverage.
1262*09537850SAkhilesh Sanikop FilmGrainParams params = kFilmGrainParams[0];
1263*09537850SAkhilesh Sanikop params.auto_regression_coeff_lag = coeff_lag;
1264*09537850SAkhilesh Sanikop const int grain_max = GetGrainMax<bitdepth>();
1265*09537850SAkhilesh Sanikop const int grain_min = GetGrainMin<bitdepth>();
1266*09537850SAkhilesh Sanikop const int chroma_width =
1267*09537850SAkhilesh Sanikop (subsampling_x != 0) ? kMinChromaWidth : kMaxChromaWidth;
1268*09537850SAkhilesh Sanikop const int chroma_height =
1269*09537850SAkhilesh Sanikop (subsampling_y != 0) ? kMinChromaHeight : kMaxChromaHeight;
1270*09537850SAkhilesh Sanikop if (saturate) {
1271*09537850SAkhilesh Sanikop memset(params.auto_regression_coeff_u, 127,
1272*09537850SAkhilesh Sanikop sizeof(params.auto_regression_coeff_u));
1273*09537850SAkhilesh Sanikop memset(params.auto_regression_coeff_v, 127,
1274*09537850SAkhilesh Sanikop sizeof(params.auto_regression_coeff_v));
1275*09537850SAkhilesh Sanikop for (int y = 0; y < kLumaHeight; ++y) {
1276*09537850SAkhilesh Sanikop for (int x = 0; x < kLumaWidth; ++x) {
1277*09537850SAkhilesh Sanikop // This loop relies on the fact that kMaxChromaWidth == kLumaWidth.
1278*09537850SAkhilesh Sanikop luma_block_buffer_[y * kLumaWidth + x] = grain_max;
1279*09537850SAkhilesh Sanikop u_block_buffer_[y * kLumaWidth + x] = grain_max;
1280*09537850SAkhilesh Sanikop v_block_buffer_[y * kLumaWidth + x] = grain_max;
1281*09537850SAkhilesh Sanikop }
1282*09537850SAkhilesh Sanikop }
1283*09537850SAkhilesh Sanikop } else {
1284*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
1285*09537850SAkhilesh Sanikop // Allow any valid grain values.
1286*09537850SAkhilesh Sanikop const int random_range = grain_max - grain_min + 1;
1287*09537850SAkhilesh Sanikop for (int y = 0; y < kLumaHeight; ++y) {
1288*09537850SAkhilesh Sanikop for (int x = 0; x < kLumaWidth; ++x) {
1289*09537850SAkhilesh Sanikop // This loop relies on the fact that kMaxChromaWidth == kLumaWidth.
1290*09537850SAkhilesh Sanikop const int random_y = rnd(random_range);
1291*09537850SAkhilesh Sanikop luma_block_buffer_[y * kLumaWidth + x] = random_y + grain_min;
1292*09537850SAkhilesh Sanikop const int random_u = rnd(random_range);
1293*09537850SAkhilesh Sanikop u_block_buffer_[y * kLumaWidth + x] = random_u + grain_min;
1294*09537850SAkhilesh Sanikop const int random_v = rnd(random_range);
1295*09537850SAkhilesh Sanikop v_block_buffer_[y * kLumaWidth + x] = random_v + grain_min;
1296*09537850SAkhilesh Sanikop }
1297*09537850SAkhilesh Sanikop }
1298*09537850SAkhilesh Sanikop }
1299*09537850SAkhilesh Sanikop if (compare) {
1300*09537850SAkhilesh Sanikop memcpy(base_u_block_buffer_, u_block_buffer_, sizeof(u_block_buffer_));
1301*09537850SAkhilesh Sanikop memcpy(base_v_block_buffer_, v_block_buffer_, sizeof(v_block_buffer_));
1302*09537850SAkhilesh Sanikop }
1303*09537850SAkhilesh Sanikop
1304*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
1305*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
1306*09537850SAkhilesh Sanikop chroma_auto_regression_func_(params, luma_block_buffer_, subsampling_x,
1307*09537850SAkhilesh Sanikop subsampling_y, u_block_buffer_,
1308*09537850SAkhilesh Sanikop v_block_buffer_);
1309*09537850SAkhilesh Sanikop }
1310*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
1311*09537850SAkhilesh Sanikop if (num_runs > 1) {
1312*09537850SAkhilesh Sanikop printf("AutoRegressionChroma lag=%d, sub_x=%d, sub_y=%d: %d us\n",
1313*09537850SAkhilesh Sanikop coeff_lag, subsampling_x, subsampling_y,
1314*09537850SAkhilesh Sanikop static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1315*09537850SAkhilesh Sanikop return;
1316*09537850SAkhilesh Sanikop }
1317*09537850SAkhilesh Sanikop if (compare) {
1318*09537850SAkhilesh Sanikop base_chroma_auto_regression_func_(params, luma_block_buffer_, subsampling_x,
1319*09537850SAkhilesh Sanikop subsampling_y, base_u_block_buffer_,
1320*09537850SAkhilesh Sanikop base_v_block_buffer_);
1321*09537850SAkhilesh Sanikop EXPECT_TRUE(test_utils::CompareBlocks(u_block_buffer_, base_u_block_buffer_,
1322*09537850SAkhilesh Sanikop chroma_width, chroma_height,
1323*09537850SAkhilesh Sanikop chroma_width, chroma_width, false));
1324*09537850SAkhilesh Sanikop EXPECT_TRUE(test_utils::CompareBlocks(v_block_buffer_, base_v_block_buffer_,
1325*09537850SAkhilesh Sanikop chroma_width, chroma_height,
1326*09537850SAkhilesh Sanikop chroma_width, chroma_width, false));
1327*09537850SAkhilesh Sanikop } else {
1328*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
1329*09537850SAkhilesh Sanikop "FilmGrain",
1330*09537850SAkhilesh Sanikop absl::StrFormat("AutoRegressionChromaU lag=%d, sub_x=%d, sub_y=%d",
1331*09537850SAkhilesh Sanikop coeff_lag, subsampling_x, subsampling_y)
1332*09537850SAkhilesh Sanikop .c_str(),
1333*09537850SAkhilesh Sanikop GetARTestDigestChromaU(bitdepth, coeff_lag, subsampling_x,
1334*09537850SAkhilesh Sanikop subsampling_y),
1335*09537850SAkhilesh Sanikop u_block_buffer_, sizeof(u_block_buffer_), elapsed_time);
1336*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
1337*09537850SAkhilesh Sanikop "FilmGrain",
1338*09537850SAkhilesh Sanikop absl::StrFormat("AutoRegressionChromaV lag=%d, sub_x=%d, sub_y=%d",
1339*09537850SAkhilesh Sanikop coeff_lag, subsampling_x, subsampling_y)
1340*09537850SAkhilesh Sanikop .c_str(),
1341*09537850SAkhilesh Sanikop GetARTestDigestChromaV(bitdepth, coeff_lag, subsampling_x,
1342*09537850SAkhilesh Sanikop subsampling_y),
1343*09537850SAkhilesh Sanikop v_block_buffer_, sizeof(v_block_buffer_), elapsed_time);
1344*09537850SAkhilesh Sanikop }
1345*09537850SAkhilesh Sanikop }
1346*09537850SAkhilesh Sanikop
1347*09537850SAkhilesh Sanikop using AutoRegressionTestChroma8bpp = AutoRegressionTestChroma<8>;
1348*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma8bpp,AutoRegressiveFilterChroma)1349*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma8bpp, AutoRegressiveFilterChroma) {
1350*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1351*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(test_param.coeff_lag, test_param.subsampling_x,
1352*09537850SAkhilesh Sanikop test_param.subsampling_y, 1,
1353*09537850SAkhilesh Sanikop /*saturate=*/false,
1354*09537850SAkhilesh Sanikop /*compare=*/false);
1355*09537850SAkhilesh Sanikop }
1356*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma8bpp,AutoRegressiveFilterChromaSaturated)1357*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma8bpp, AutoRegressiveFilterChromaSaturated) {
1358*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1359*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(test_param.coeff_lag, test_param.subsampling_x,
1360*09537850SAkhilesh Sanikop test_param.subsampling_y, 1, /*saturate=*/true,
1361*09537850SAkhilesh Sanikop /*compare=*/true);
1362*09537850SAkhilesh Sanikop }
1363*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma8bpp,DISABLED_Speed)1364*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma8bpp, DISABLED_Speed) {
1365*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1366*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(
1367*09537850SAkhilesh Sanikop test_param.coeff_lag, test_param.subsampling_x, test_param.subsampling_y,
1368*09537850SAkhilesh Sanikop // Subsampling cuts each dimension of the chroma blocks in half, so run
1369*09537850SAkhilesh Sanikop // twice as many times to compensate.
1370*09537850SAkhilesh Sanikop 1e5 * (1 << (test_param.subsampling_y + test_param.subsampling_x)),
1371*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1372*09537850SAkhilesh Sanikop }
1373*09537850SAkhilesh Sanikop
1374*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1375*09537850SAkhilesh Sanikop using AutoRegressionTestChroma10bpp = AutoRegressionTestChroma<10>;
1376*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma10bpp,AutoRegressiveFilterChroma)1377*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma10bpp, AutoRegressiveFilterChroma) {
1378*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1379*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(test_param.coeff_lag, test_param.subsampling_x,
1380*09537850SAkhilesh Sanikop test_param.subsampling_y, 1,
1381*09537850SAkhilesh Sanikop /*saturate=*/false,
1382*09537850SAkhilesh Sanikop /*compare=*/false);
1383*09537850SAkhilesh Sanikop }
1384*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma10bpp,AutoRegressiveFilterChromaSaturated)1385*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma10bpp, AutoRegressiveFilterChromaSaturated) {
1386*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1387*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(test_param.coeff_lag, test_param.subsampling_x,
1388*09537850SAkhilesh Sanikop test_param.subsampling_y, 1, /*saturate=*/true,
1389*09537850SAkhilesh Sanikop /*compare=*/true);
1390*09537850SAkhilesh Sanikop }
1391*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma10bpp,DISABLED_Speed)1392*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma10bpp, DISABLED_Speed) {
1393*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1394*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(
1395*09537850SAkhilesh Sanikop test_param.coeff_lag, test_param.subsampling_x, test_param.subsampling_y,
1396*09537850SAkhilesh Sanikop // Subsampling cuts each dimension of the chroma blocks in half, so run
1397*09537850SAkhilesh Sanikop // twice as many times to compensate.
1398*09537850SAkhilesh Sanikop 1e5 * (1 << (test_param.subsampling_y + test_param.subsampling_x)),
1399*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1400*09537850SAkhilesh Sanikop }
1401*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1402*09537850SAkhilesh Sanikop
1403*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1404*09537850SAkhilesh Sanikop using AutoRegressionTestChroma12bpp = AutoRegressionTestChroma<12>;
1405*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma12bpp,AutoRegressiveFilterChroma)1406*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma12bpp, AutoRegressiveFilterChroma) {
1407*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1408*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(test_param.coeff_lag, test_param.subsampling_x,
1409*09537850SAkhilesh Sanikop test_param.subsampling_y, 1,
1410*09537850SAkhilesh Sanikop /*saturate=*/false,
1411*09537850SAkhilesh Sanikop /*compare=*/false);
1412*09537850SAkhilesh Sanikop }
1413*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma12bpp,AutoRegressiveFilterChromaSaturated)1414*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma12bpp, AutoRegressiveFilterChromaSaturated) {
1415*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1416*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(test_param.coeff_lag, test_param.subsampling_x,
1417*09537850SAkhilesh Sanikop test_param.subsampling_y, 1, /*saturate=*/true,
1418*09537850SAkhilesh Sanikop /*compare=*/true);
1419*09537850SAkhilesh Sanikop }
1420*09537850SAkhilesh Sanikop
TEST_P(AutoRegressionTestChroma12bpp,DISABLED_Speed)1421*09537850SAkhilesh Sanikop TEST_P(AutoRegressionTestChroma12bpp, DISABLED_Speed) {
1422*09537850SAkhilesh Sanikop AutoRegressionChromaTestParam test_param(GetParam());
1423*09537850SAkhilesh Sanikop TestAutoRegressiveFilterChroma(
1424*09537850SAkhilesh Sanikop test_param.coeff_lag, test_param.subsampling_x, test_param.subsampling_y,
1425*09537850SAkhilesh Sanikop // Subsampling cuts each dimension of the chroma blocks in half, so run
1426*09537850SAkhilesh Sanikop // twice as many times to compensate.
1427*09537850SAkhilesh Sanikop 1e5 * (1 << (test_param.subsampling_y + test_param.subsampling_x)),
1428*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1429*09537850SAkhilesh Sanikop }
1430*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1431*09537850SAkhilesh Sanikop
1432*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, AutoRegressionTestChroma8bpp,
1433*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 4) /* coeff_lag */,
1434*09537850SAkhilesh Sanikop testing::Range(0,
1435*09537850SAkhilesh Sanikop 3) /* subsampling */));
1436*09537850SAkhilesh Sanikop
1437*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1438*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, AutoRegressionTestChroma10bpp,
1439*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 4) /* coeff_lag */,
1440*09537850SAkhilesh Sanikop testing::Range(0,
1441*09537850SAkhilesh Sanikop 3) /* subsampling */));
1442*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1443*09537850SAkhilesh Sanikop
1444*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1445*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, AutoRegressionTestChroma12bpp,
1446*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 4) /* coeff_lag */,
1447*09537850SAkhilesh Sanikop testing::Range(0,
1448*09537850SAkhilesh Sanikop 3) /* subsampling */));
1449*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1450*09537850SAkhilesh Sanikop
1451*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1452*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, AutoRegressionTestChroma8bpp,
1453*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 4) /* coeff_lag */,
1454*09537850SAkhilesh Sanikop testing::Range(0,
1455*09537850SAkhilesh Sanikop 3) /* subsampling */));
1456*09537850SAkhilesh Sanikop
1457*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1458*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, AutoRegressionTestChroma10bpp,
1459*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 4) /* coeff_lag */,
1460*09537850SAkhilesh Sanikop testing::Range(0,
1461*09537850SAkhilesh Sanikop 3) /* subsampling */));
1462*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1463*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_NEON
1464*09537850SAkhilesh Sanikop
1465*09537850SAkhilesh Sanikop template <int bitdepth>
1466*09537850SAkhilesh Sanikop class GrainGenerationTest : public testing::TestWithParam<int> {
1467*09537850SAkhilesh Sanikop protected:
1468*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
1469*09537850SAkhilesh Sanikop using GrainType =
1470*09537850SAkhilesh Sanikop typename std::conditional<bitdepth == 8, int8_t, int16_t>::type;
1471*09537850SAkhilesh Sanikop
1472*09537850SAkhilesh Sanikop void TestGenerateGrainLuma(int param_index, int num_runs);
1473*09537850SAkhilesh Sanikop
1474*09537850SAkhilesh Sanikop GrainType luma_block_buffer_[kLumaBlockSize];
1475*09537850SAkhilesh Sanikop };
1476*09537850SAkhilesh Sanikop
1477*09537850SAkhilesh Sanikop template <int bitdepth>
TestGenerateGrainLuma(int param_index,int num_runs)1478*09537850SAkhilesh Sanikop void GrainGenerationTest<bitdepth>::TestGenerateGrainLuma(int param_index,
1479*09537850SAkhilesh Sanikop int num_runs) {
1480*09537850SAkhilesh Sanikop FilmGrainParams params = kFilmGrainParams[param_index];
1481*09537850SAkhilesh Sanikop
1482*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
1483*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
1484*09537850SAkhilesh Sanikop FilmGrain<bitdepth>::GenerateLumaGrain(params, luma_block_buffer_);
1485*09537850SAkhilesh Sanikop }
1486*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
1487*09537850SAkhilesh Sanikop if (num_runs == 1) {
1488*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
1489*09537850SAkhilesh Sanikop "FilmGrain",
1490*09537850SAkhilesh Sanikop absl::StrFormat("GenerateGrainLuma param_index=%d", param_index)
1491*09537850SAkhilesh Sanikop .c_str(),
1492*09537850SAkhilesh Sanikop GetGrainGenerationTestDigestLuma(bitdepth, param_index),
1493*09537850SAkhilesh Sanikop luma_block_buffer_, sizeof(luma_block_buffer_), elapsed_time);
1494*09537850SAkhilesh Sanikop } else {
1495*09537850SAkhilesh Sanikop printf("GenerateGrainLuma param_index=%d: %d us\n", param_index,
1496*09537850SAkhilesh Sanikop static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1497*09537850SAkhilesh Sanikop }
1498*09537850SAkhilesh Sanikop }
1499*09537850SAkhilesh Sanikop
1500*09537850SAkhilesh Sanikop using GrainGenerationTest8bpp = GrainGenerationTest<8>;
1501*09537850SAkhilesh Sanikop
TEST_P(GrainGenerationTest8bpp,GenerateGrainLuma)1502*09537850SAkhilesh Sanikop TEST_P(GrainGenerationTest8bpp, GenerateGrainLuma) {
1503*09537850SAkhilesh Sanikop TestGenerateGrainLuma(GetParam(), 1);
1504*09537850SAkhilesh Sanikop }
1505*09537850SAkhilesh Sanikop
TEST_P(GrainGenerationTest8bpp,DISABLED_LumaSpeed)1506*09537850SAkhilesh Sanikop TEST_P(GrainGenerationTest8bpp, DISABLED_LumaSpeed) {
1507*09537850SAkhilesh Sanikop TestGenerateGrainLuma(GetParam(), 1e5);
1508*09537850SAkhilesh Sanikop }
1509*09537850SAkhilesh Sanikop
1510*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1511*09537850SAkhilesh Sanikop using GrainGenerationTest10bpp = GrainGenerationTest<10>;
1512*09537850SAkhilesh Sanikop
TEST_P(GrainGenerationTest10bpp,GenerateGrainLuma)1513*09537850SAkhilesh Sanikop TEST_P(GrainGenerationTest10bpp, GenerateGrainLuma) {
1514*09537850SAkhilesh Sanikop TestGenerateGrainLuma(GetParam(), 1);
1515*09537850SAkhilesh Sanikop }
1516*09537850SAkhilesh Sanikop
TEST_P(GrainGenerationTest10bpp,DISABLED_LumaSpeed)1517*09537850SAkhilesh Sanikop TEST_P(GrainGenerationTest10bpp, DISABLED_LumaSpeed) {
1518*09537850SAkhilesh Sanikop TestGenerateGrainLuma(GetParam(), 1e5);
1519*09537850SAkhilesh Sanikop }
1520*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1521*09537850SAkhilesh Sanikop
1522*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1523*09537850SAkhilesh Sanikop using GrainGenerationTest12bpp = GrainGenerationTest<12>;
1524*09537850SAkhilesh Sanikop
TEST_P(GrainGenerationTest12bpp,GenerateGrainLuma)1525*09537850SAkhilesh Sanikop TEST_P(GrainGenerationTest12bpp, GenerateGrainLuma) {
1526*09537850SAkhilesh Sanikop TestGenerateGrainLuma(GetParam(), 1);
1527*09537850SAkhilesh Sanikop }
1528*09537850SAkhilesh Sanikop
TEST_P(GrainGenerationTest12bpp,DISABLED_LumaSpeed)1529*09537850SAkhilesh Sanikop TEST_P(GrainGenerationTest12bpp, DISABLED_LumaSpeed) {
1530*09537850SAkhilesh Sanikop TestGenerateGrainLuma(GetParam(), 1e5);
1531*09537850SAkhilesh Sanikop }
1532*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1533*09537850SAkhilesh Sanikop
1534*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, GrainGenerationTest8bpp,
1535*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */);
1536*09537850SAkhilesh Sanikop
1537*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1538*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, GrainGenerationTest10bpp,
1539*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */);
1540*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1541*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1542*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, GrainGenerationTest12bpp,
1543*09537850SAkhilesh Sanikop testing::Range(0, 10) /* param_index */);
1544*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1545*09537850SAkhilesh Sanikop
1546*09537850SAkhilesh Sanikop // This param type is used for both ConstructStripesTest and
1547*09537850SAkhilesh Sanikop // ConstructImageTest.
1548*09537850SAkhilesh Sanikop struct ConstructNoiseTestParam {
ConstructNoiseTestParamlibgav1::dsp::film_grain::__anoncc33db1e0111::ConstructNoiseTestParam1549*09537850SAkhilesh Sanikop explicit ConstructNoiseTestParam(const std::tuple<int, int>& in)
1550*09537850SAkhilesh Sanikop : overlap_flag(std::get<0>(in)) {
1551*09537850SAkhilesh Sanikop switch (std::get<1>(in)) {
1552*09537850SAkhilesh Sanikop case 0:
1553*09537850SAkhilesh Sanikop subsampling_x = 0;
1554*09537850SAkhilesh Sanikop subsampling_y = 0;
1555*09537850SAkhilesh Sanikop break;
1556*09537850SAkhilesh Sanikop case 1:
1557*09537850SAkhilesh Sanikop subsampling_x = 1;
1558*09537850SAkhilesh Sanikop subsampling_y = 0;
1559*09537850SAkhilesh Sanikop break;
1560*09537850SAkhilesh Sanikop default:
1561*09537850SAkhilesh Sanikop assert(std::get<1>(in) == 2);
1562*09537850SAkhilesh Sanikop subsampling_x = 1;
1563*09537850SAkhilesh Sanikop subsampling_y = 1;
1564*09537850SAkhilesh Sanikop }
1565*09537850SAkhilesh Sanikop }
1566*09537850SAkhilesh Sanikop const int overlap_flag;
1567*09537850SAkhilesh Sanikop int subsampling_x;
1568*09537850SAkhilesh Sanikop int subsampling_y;
1569*09537850SAkhilesh Sanikop };
1570*09537850SAkhilesh Sanikop
1571*09537850SAkhilesh Sanikop template <int bitdepth>
1572*09537850SAkhilesh Sanikop class ConstructStripesTest
1573*09537850SAkhilesh Sanikop : public testing::TestWithParam<std::tuple<int, int>> {
1574*09537850SAkhilesh Sanikop public:
1575*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
1576*09537850SAkhilesh Sanikop using GrainType =
1577*09537850SAkhilesh Sanikop typename std::conditional<bitdepth == 8, int8_t, int16_t>::type;
1578*09537850SAkhilesh Sanikop
ConstructStripesTest()1579*09537850SAkhilesh Sanikop ConstructStripesTest() {
1580*09537850SAkhilesh Sanikop FilmGrainInit_C();
1581*09537850SAkhilesh Sanikop const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
1582*09537850SAkhilesh Sanikop base_construct_noise_stripes_func_ =
1583*09537850SAkhilesh Sanikop dsp->film_grain.construct_noise_stripes[std::get<0>(GetParam())];
1584*09537850SAkhilesh Sanikop
1585*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
1586*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
1587*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
1588*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "C/")) {
1589*09537850SAkhilesh Sanikop base_construct_noise_stripes_func_ = nullptr;
1590*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "NEON/")) {
1591*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1592*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
1593*09537850SAkhilesh Sanikop #endif
1594*09537850SAkhilesh Sanikop }
1595*09537850SAkhilesh Sanikop construct_noise_stripes_func_ =
1596*09537850SAkhilesh Sanikop dsp->film_grain.construct_noise_stripes[std::get<0>(GetParam())];
1597*09537850SAkhilesh Sanikop }
1598*09537850SAkhilesh Sanikop
1599*09537850SAkhilesh Sanikop ~ConstructStripesTest() override = default;
1600*09537850SAkhilesh Sanikop
1601*09537850SAkhilesh Sanikop protected:
1602*09537850SAkhilesh Sanikop // |compare| determines whether to compare the output blocks from the SIMD
1603*09537850SAkhilesh Sanikop // implementation, if used, and the C implementation.
1604*09537850SAkhilesh Sanikop // |saturate| determines whether to set the inputs to maximum values. This is
1605*09537850SAkhilesh Sanikop // intended primarily as a way to simplify differences in output when
1606*09537850SAkhilesh Sanikop // debugging.
1607*09537850SAkhilesh Sanikop void TestConstructNoiseStripes(int overlap_flag, int subsampling_x,
1608*09537850SAkhilesh Sanikop int subsampling_y, int num_runs, bool saturate,
1609*09537850SAkhilesh Sanikop bool compare);
1610*09537850SAkhilesh Sanikop ConstructNoiseStripesFunc construct_noise_stripes_func_;
1611*09537850SAkhilesh Sanikop ConstructNoiseStripesFunc base_construct_noise_stripes_func_;
1612*09537850SAkhilesh Sanikop GrainType grain_buffer_[kLumaBlockSize];
1613*09537850SAkhilesh Sanikop Array2DView<GrainType> noise_stripes_;
1614*09537850SAkhilesh Sanikop // Owns the memory that noise_stripes_ points to.
1615*09537850SAkhilesh Sanikop std::unique_ptr<GrainType[]> stripe_buffer_;
1616*09537850SAkhilesh Sanikop Array2DView<GrainType> base_noise_stripes_;
1617*09537850SAkhilesh Sanikop // Owns the memory that base_stripe_buffer_ points to.
1618*09537850SAkhilesh Sanikop std::unique_ptr<GrainType[]> base_stripe_buffer_;
1619*09537850SAkhilesh Sanikop };
1620*09537850SAkhilesh Sanikop
1621*09537850SAkhilesh Sanikop template <int bitdepth>
TestConstructNoiseStripes(int overlap_flag,int subsampling_x,int subsampling_y,int num_runs,bool saturate,bool compare)1622*09537850SAkhilesh Sanikop void ConstructStripesTest<bitdepth>::TestConstructNoiseStripes(
1623*09537850SAkhilesh Sanikop int overlap_flag, int subsampling_x, int subsampling_y, int num_runs,
1624*09537850SAkhilesh Sanikop bool saturate, bool compare) {
1625*09537850SAkhilesh Sanikop if (construct_noise_stripes_func_ == nullptr) return;
1626*09537850SAkhilesh Sanikop // Compare is only needed for NEON tests to compare with C output.
1627*09537850SAkhilesh Sanikop if (base_construct_noise_stripes_func_ == nullptr && compare) return;
1628*09537850SAkhilesh Sanikop
1629*09537850SAkhilesh Sanikop const int stripe_width = ((kFrameWidth + subsampling_x) >> subsampling_x);
1630*09537850SAkhilesh Sanikop const int stripe_height = kNoiseStripeHeight;
1631*09537850SAkhilesh Sanikop const int stripe_size = stripe_height * stripe_width;
1632*09537850SAkhilesh Sanikop const int stripe_buffer_size = stripe_size * kNumTestStripes;
1633*09537850SAkhilesh Sanikop if (compare) {
1634*09537850SAkhilesh Sanikop base_stripe_buffer_.reset(new (
1635*09537850SAkhilesh Sanikop std::nothrow) GrainType[stripe_buffer_size + kNoiseStripePadding]());
1636*09537850SAkhilesh Sanikop ASSERT_NE(base_stripe_buffer_, nullptr);
1637*09537850SAkhilesh Sanikop base_noise_stripes_.Reset(kNumTestStripes, stripe_size,
1638*09537850SAkhilesh Sanikop base_stripe_buffer_.get());
1639*09537850SAkhilesh Sanikop }
1640*09537850SAkhilesh Sanikop stripe_buffer_.reset(
1641*09537850SAkhilesh Sanikop new (std::nothrow) GrainType[stripe_buffer_size + kNoiseStripePadding]());
1642*09537850SAkhilesh Sanikop ASSERT_NE(stripe_buffer_, nullptr);
1643*09537850SAkhilesh Sanikop noise_stripes_.Reset(kNumTestStripes, stripe_size, stripe_buffer_.get());
1644*09537850SAkhilesh Sanikop
1645*09537850SAkhilesh Sanikop const int grain_max = GetGrainMax<bitdepth>();
1646*09537850SAkhilesh Sanikop const int grain_min = GetGrainMin<bitdepth>();
1647*09537850SAkhilesh Sanikop if (saturate) {
1648*09537850SAkhilesh Sanikop for (int y = 0; y < kLumaHeight; ++y) {
1649*09537850SAkhilesh Sanikop for (int x = 0; x < kLumaWidth; ++x) {
1650*09537850SAkhilesh Sanikop grain_buffer_[y * kLumaWidth + x] = grain_max;
1651*09537850SAkhilesh Sanikop }
1652*09537850SAkhilesh Sanikop }
1653*09537850SAkhilesh Sanikop } else {
1654*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
1655*09537850SAkhilesh Sanikop // Allow any valid grain values.
1656*09537850SAkhilesh Sanikop const int random_range = grain_max - grain_min + 1;
1657*09537850SAkhilesh Sanikop for (int y = 0; y < kLumaHeight; ++y) {
1658*09537850SAkhilesh Sanikop for (int x = 0; x < kLumaWidth; ++x) {
1659*09537850SAkhilesh Sanikop grain_buffer_[y * kLumaWidth + x] = grain_min + rnd(random_range);
1660*09537850SAkhilesh Sanikop }
1661*09537850SAkhilesh Sanikop }
1662*09537850SAkhilesh Sanikop }
1663*09537850SAkhilesh Sanikop
1664*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
1665*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
1666*09537850SAkhilesh Sanikop construct_noise_stripes_func_(grain_buffer_, 68, kFrameWidth, kFrameHeight,
1667*09537850SAkhilesh Sanikop subsampling_x, subsampling_y,
1668*09537850SAkhilesh Sanikop &noise_stripes_);
1669*09537850SAkhilesh Sanikop }
1670*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
1671*09537850SAkhilesh Sanikop if (num_runs > 1) {
1672*09537850SAkhilesh Sanikop printf(
1673*09537850SAkhilesh Sanikop "ConstructNoiseStripes Speed Test for overlap=%d, sub_x=%d, "
1674*09537850SAkhilesh Sanikop "sub_y=%d: %d us\n",
1675*09537850SAkhilesh Sanikop overlap_flag, subsampling_x, subsampling_y,
1676*09537850SAkhilesh Sanikop static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1677*09537850SAkhilesh Sanikop return;
1678*09537850SAkhilesh Sanikop }
1679*09537850SAkhilesh Sanikop if (compare) {
1680*09537850SAkhilesh Sanikop base_construct_noise_stripes_func_(grain_buffer_, 68, kFrameWidth,
1681*09537850SAkhilesh Sanikop kFrameHeight, subsampling_x,
1682*09537850SAkhilesh Sanikop subsampling_y, &base_noise_stripes_);
1683*09537850SAkhilesh Sanikop
1684*09537850SAkhilesh Sanikop constexpr int kCompareWidth = 64;
1685*09537850SAkhilesh Sanikop for (int stripe = 0; stripe < kNumTestStripes;) {
1686*09537850SAkhilesh Sanikop EXPECT_TRUE(test_utils::CompareBlocks(
1687*09537850SAkhilesh Sanikop noise_stripes_[stripe], base_noise_stripes_[stripe], kCompareWidth,
1688*09537850SAkhilesh Sanikop stripe_height, stripe_width, stripe_width, /*check_padding=*/false,
1689*09537850SAkhilesh Sanikop /*print_diff=*/false));
1690*09537850SAkhilesh Sanikop }
1691*09537850SAkhilesh Sanikop } else {
1692*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
1693*09537850SAkhilesh Sanikop "FilmGrain",
1694*09537850SAkhilesh Sanikop absl::StrFormat("ConstructNoiseStripes overlap=%d, sub_x=%d, sub_y=%d",
1695*09537850SAkhilesh Sanikop overlap_flag, subsampling_x, subsampling_y)
1696*09537850SAkhilesh Sanikop .c_str(),
1697*09537850SAkhilesh Sanikop GetConstructStripesTestDigest(bitdepth, overlap_flag, subsampling_x,
1698*09537850SAkhilesh Sanikop subsampling_y),
1699*09537850SAkhilesh Sanikop noise_stripes_[0], stripe_buffer_size, elapsed_time);
1700*09537850SAkhilesh Sanikop }
1701*09537850SAkhilesh Sanikop }
1702*09537850SAkhilesh Sanikop
1703*09537850SAkhilesh Sanikop using ConstructStripesTest8bpp = ConstructStripesTest<8>;
1704*09537850SAkhilesh Sanikop
TEST_P(ConstructStripesTest8bpp,RandomValues)1705*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest8bpp, RandomValues) {
1706*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1707*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1708*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1709*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1710*09537850SAkhilesh Sanikop }
1711*09537850SAkhilesh Sanikop
TEST_P(ConstructStripesTest8bpp,SaturatedValues)1712*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest8bpp, SaturatedValues) {
1713*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1714*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1715*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1716*09537850SAkhilesh Sanikop /*saturate=*/true, /*compare=*/true);
1717*09537850SAkhilesh Sanikop }
TEST_P(ConstructStripesTest8bpp,DISABLED_Speed)1718*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest8bpp, DISABLED_Speed) {
1719*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1720*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1721*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/500,
1722*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1723*09537850SAkhilesh Sanikop }
1724*09537850SAkhilesh Sanikop
1725*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1726*09537850SAkhilesh Sanikop using ConstructStripesTest10bpp = ConstructStripesTest<10>;
1727*09537850SAkhilesh Sanikop
TEST_P(ConstructStripesTest10bpp,RandomValues)1728*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest10bpp, RandomValues) {
1729*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1730*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1731*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1732*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1733*09537850SAkhilesh Sanikop }
TEST_P(ConstructStripesTest10bpp,SaturatedValues)1734*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest10bpp, SaturatedValues) {
1735*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1736*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1737*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1738*09537850SAkhilesh Sanikop /*saturate=*/true, /*compare=*/true);
1739*09537850SAkhilesh Sanikop }
1740*09537850SAkhilesh Sanikop
TEST_P(ConstructStripesTest10bpp,DISABLED_Speed)1741*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest10bpp, DISABLED_Speed) {
1742*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1743*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1744*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/500,
1745*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1746*09537850SAkhilesh Sanikop }
1747*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1748*09537850SAkhilesh Sanikop
1749*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1750*09537850SAkhilesh Sanikop using ConstructStripesTest12bpp = ConstructStripesTest<12>;
1751*09537850SAkhilesh Sanikop
TEST_P(ConstructStripesTest12bpp,RandomValues)1752*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest12bpp, RandomValues) {
1753*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1754*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1755*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1756*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1757*09537850SAkhilesh Sanikop }
TEST_P(ConstructStripesTest12bpp,SaturatedValues)1758*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest12bpp, SaturatedValues) {
1759*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1760*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1761*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1762*09537850SAkhilesh Sanikop /*saturate=*/true, /*compare=*/true);
1763*09537850SAkhilesh Sanikop }
1764*09537850SAkhilesh Sanikop
TEST_P(ConstructStripesTest12bpp,DISABLED_Speed)1765*09537850SAkhilesh Sanikop TEST_P(ConstructStripesTest12bpp, DISABLED_Speed) {
1766*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1767*09537850SAkhilesh Sanikop TestConstructNoiseStripes(test_params.overlap_flag, test_params.subsampling_x,
1768*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/500,
1769*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1770*09537850SAkhilesh Sanikop }
1771*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1772*09537850SAkhilesh Sanikop
1773*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ConstructStripesTest8bpp,
1774*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
1775*09537850SAkhilesh Sanikop testing::Range(0, 3)));
1776*09537850SAkhilesh Sanikop
1777*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1778*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ConstructStripesTest10bpp,
1779*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
1780*09537850SAkhilesh Sanikop testing::Range(0, 3)));
1781*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1782*09537850SAkhilesh Sanikop
1783*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1784*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ConstructStripesTest12bpp,
1785*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
1786*09537850SAkhilesh Sanikop testing::Range(0, 3)));
1787*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
1788*09537850SAkhilesh Sanikop
1789*09537850SAkhilesh Sanikop template <int bitdepth>
1790*09537850SAkhilesh Sanikop class ConstructImageTest : public testing::TestWithParam<std::tuple<int, int>> {
1791*09537850SAkhilesh Sanikop public:
1792*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
1793*09537850SAkhilesh Sanikop using GrainType =
1794*09537850SAkhilesh Sanikop typename std::conditional<bitdepth == 8, int8_t, int16_t>::type;
1795*09537850SAkhilesh Sanikop
ConstructImageTest()1796*09537850SAkhilesh Sanikop ConstructImageTest() {
1797*09537850SAkhilesh Sanikop FilmGrainInit_C();
1798*09537850SAkhilesh Sanikop const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
1799*09537850SAkhilesh Sanikop base_construct_noise_image_overlap_func_ =
1800*09537850SAkhilesh Sanikop dsp->film_grain.construct_noise_image_overlap;
1801*09537850SAkhilesh Sanikop
1802*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
1803*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
1804*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
1805*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "C/")) {
1806*09537850SAkhilesh Sanikop base_construct_noise_image_overlap_func_ = nullptr;
1807*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "NEON/")) {
1808*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
1809*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
1810*09537850SAkhilesh Sanikop #endif
1811*09537850SAkhilesh Sanikop }
1812*09537850SAkhilesh Sanikop construct_noise_image_overlap_func_ =
1813*09537850SAkhilesh Sanikop dsp->film_grain.construct_noise_image_overlap;
1814*09537850SAkhilesh Sanikop }
1815*09537850SAkhilesh Sanikop
1816*09537850SAkhilesh Sanikop ~ConstructImageTest() override = default;
1817*09537850SAkhilesh Sanikop
1818*09537850SAkhilesh Sanikop protected:
1819*09537850SAkhilesh Sanikop // |compare| determines whether to compare the output blocks from the SIMD
1820*09537850SAkhilesh Sanikop // implementation, if used, and the C implementation.
1821*09537850SAkhilesh Sanikop // |saturate| determines whether to set the inputs to maximum values. This is
1822*09537850SAkhilesh Sanikop // intended primarily as a way to simplify differences in output when
1823*09537850SAkhilesh Sanikop // debugging.
1824*09537850SAkhilesh Sanikop void TestConstructNoiseImage(int overlap_flag, int subsampling_x,
1825*09537850SAkhilesh Sanikop int subsampling_y, int num_runs, bool saturate,
1826*09537850SAkhilesh Sanikop bool compare);
1827*09537850SAkhilesh Sanikop ConstructNoiseImageOverlapFunc construct_noise_image_overlap_func_;
1828*09537850SAkhilesh Sanikop ConstructNoiseImageOverlapFunc base_construct_noise_image_overlap_func_;
1829*09537850SAkhilesh Sanikop Array2DView<GrainType> noise_stripes_;
1830*09537850SAkhilesh Sanikop // Owns the memory that noise_stripes_ points to.
1831*09537850SAkhilesh Sanikop std::unique_ptr<GrainType[]> stripe_buffer_;
1832*09537850SAkhilesh Sanikop Array2D<GrainType> noise_image_;
1833*09537850SAkhilesh Sanikop Array2D<GrainType> base_noise_image_;
1834*09537850SAkhilesh Sanikop };
1835*09537850SAkhilesh Sanikop
1836*09537850SAkhilesh Sanikop template <int bitdepth>
TestConstructNoiseImage(int overlap_flag,int subsampling_x,int subsampling_y,int num_runs,bool saturate,bool compare)1837*09537850SAkhilesh Sanikop void ConstructImageTest<bitdepth>::TestConstructNoiseImage(
1838*09537850SAkhilesh Sanikop int overlap_flag, int subsampling_x, int subsampling_y, int num_runs,
1839*09537850SAkhilesh Sanikop bool saturate, bool compare) {
1840*09537850SAkhilesh Sanikop if (construct_noise_image_overlap_func_ == nullptr) return;
1841*09537850SAkhilesh Sanikop // Compare is only needed for NEON tests to compare with C output.
1842*09537850SAkhilesh Sanikop if (base_construct_noise_image_overlap_func_ == nullptr && compare) return;
1843*09537850SAkhilesh Sanikop
1844*09537850SAkhilesh Sanikop const int image_width = ((kFrameWidth + subsampling_x) >> subsampling_x);
1845*09537850SAkhilesh Sanikop const int image_height = ((kFrameHeight + subsampling_y) >> subsampling_y);
1846*09537850SAkhilesh Sanikop const int stripe_height =
1847*09537850SAkhilesh Sanikop ((kNoiseStripeHeight + subsampling_y) >> subsampling_y);
1848*09537850SAkhilesh Sanikop const int image_stride = image_width + kNoiseImagePadding;
1849*09537850SAkhilesh Sanikop const int stripe_size = stripe_height * image_width;
1850*09537850SAkhilesh Sanikop if (compare) {
1851*09537850SAkhilesh Sanikop ASSERT_TRUE(base_noise_image_.Reset(image_height, image_stride,
1852*09537850SAkhilesh Sanikop /*zero_initialize=*/false));
1853*09537850SAkhilesh Sanikop }
1854*09537850SAkhilesh Sanikop ASSERT_TRUE(noise_image_.Reset(image_height, image_stride,
1855*09537850SAkhilesh Sanikop /*zero_initialize=*/false));
1856*09537850SAkhilesh Sanikop // Stride between stripe rows is |image_width|. Padding is only at the
1857*09537850SAkhilesh Sanikop // end of the final row of the final stripe to protect from overreads.
1858*09537850SAkhilesh Sanikop stripe_buffer_.reset(
1859*09537850SAkhilesh Sanikop new (std::nothrow)
1860*09537850SAkhilesh Sanikop GrainType[kNumTestStripes * stripe_size + kNoiseStripePadding]);
1861*09537850SAkhilesh Sanikop ASSERT_NE(stripe_buffer_, nullptr);
1862*09537850SAkhilesh Sanikop noise_stripes_.Reset(kNumTestStripes, stripe_size, stripe_buffer_.get());
1863*09537850SAkhilesh Sanikop
1864*09537850SAkhilesh Sanikop const int grain_max = GetGrainMax<bitdepth>();
1865*09537850SAkhilesh Sanikop const int grain_min = GetGrainMin<bitdepth>();
1866*09537850SAkhilesh Sanikop if (saturate) {
1867*09537850SAkhilesh Sanikop for (int i = 0; i < stripe_size; ++i) {
1868*09537850SAkhilesh Sanikop noise_stripes_[0][i] = grain_max;
1869*09537850SAkhilesh Sanikop }
1870*09537850SAkhilesh Sanikop for (int stripe = 1; stripe < kNumTestStripes; ++stripe) {
1871*09537850SAkhilesh Sanikop memcpy(noise_stripes_[stripe], noise_stripes_[0],
1872*09537850SAkhilesh Sanikop stripe_size * sizeof(noise_stripes_[0][0]));
1873*09537850SAkhilesh Sanikop }
1874*09537850SAkhilesh Sanikop } else {
1875*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
1876*09537850SAkhilesh Sanikop // Allow any valid grain values.
1877*09537850SAkhilesh Sanikop const int random_range = grain_max - grain_min + 1;
1878*09537850SAkhilesh Sanikop for (int stripe = 0; stripe < kNumTestStripes; ++stripe) {
1879*09537850SAkhilesh Sanikop // Assign all allocated memory for this stripe.
1880*09537850SAkhilesh Sanikop for (int i = 0; i < stripe_height; ++i) {
1881*09537850SAkhilesh Sanikop for (int x = 0; x < image_width; ++x) {
1882*09537850SAkhilesh Sanikop noise_stripes_[stripe][i * image_width + x] =
1883*09537850SAkhilesh Sanikop grain_min + rnd(random_range);
1884*09537850SAkhilesh Sanikop }
1885*09537850SAkhilesh Sanikop }
1886*09537850SAkhilesh Sanikop }
1887*09537850SAkhilesh Sanikop }
1888*09537850SAkhilesh Sanikop
1889*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
1890*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
1891*09537850SAkhilesh Sanikop FilmGrain<bitdepth>::ConstructNoiseImage(
1892*09537850SAkhilesh Sanikop &noise_stripes_, kFrameWidth, kFrameHeight, subsampling_x,
1893*09537850SAkhilesh Sanikop subsampling_y, overlap_flag << (1 - subsampling_y), &noise_image_);
1894*09537850SAkhilesh Sanikop if (overlap_flag == 1) {
1895*09537850SAkhilesh Sanikop construct_noise_image_overlap_func_(&noise_stripes_, kFrameWidth,
1896*09537850SAkhilesh Sanikop kFrameHeight, subsampling_x,
1897*09537850SAkhilesh Sanikop subsampling_y, &noise_image_);
1898*09537850SAkhilesh Sanikop }
1899*09537850SAkhilesh Sanikop }
1900*09537850SAkhilesh Sanikop
1901*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
1902*09537850SAkhilesh Sanikop if (num_runs > 1) {
1903*09537850SAkhilesh Sanikop printf(
1904*09537850SAkhilesh Sanikop "ConstructNoiseImage Speed Test for overlap=%d, sub_x=%d, "
1905*09537850SAkhilesh Sanikop "sub_y=%d: %d us\n",
1906*09537850SAkhilesh Sanikop overlap_flag, subsampling_x, subsampling_y,
1907*09537850SAkhilesh Sanikop static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1908*09537850SAkhilesh Sanikop return;
1909*09537850SAkhilesh Sanikop }
1910*09537850SAkhilesh Sanikop if (compare) {
1911*09537850SAkhilesh Sanikop FilmGrain<bitdepth>::ConstructNoiseImage(
1912*09537850SAkhilesh Sanikop &noise_stripes_, kFrameWidth, kFrameHeight, subsampling_x,
1913*09537850SAkhilesh Sanikop subsampling_y, overlap_flag << (1 - subsampling_y), &base_noise_image_);
1914*09537850SAkhilesh Sanikop if (overlap_flag == 1) {
1915*09537850SAkhilesh Sanikop base_construct_noise_image_overlap_func_(
1916*09537850SAkhilesh Sanikop &noise_stripes_, kFrameWidth, kFrameHeight, subsampling_x,
1917*09537850SAkhilesh Sanikop subsampling_y, &base_noise_image_);
1918*09537850SAkhilesh Sanikop }
1919*09537850SAkhilesh Sanikop constexpr int kCompareWidth = 72;
1920*09537850SAkhilesh Sanikop constexpr int kCompareHeight = 72;
1921*09537850SAkhilesh Sanikop EXPECT_TRUE(test_utils::CompareBlocks(
1922*09537850SAkhilesh Sanikop noise_image_[0], base_noise_image_[0], kCompareWidth, kCompareHeight,
1923*09537850SAkhilesh Sanikop image_stride, image_stride, /*check_padding=*/false,
1924*09537850SAkhilesh Sanikop /*print_diff=*/false));
1925*09537850SAkhilesh Sanikop } else {
1926*09537850SAkhilesh Sanikop printf("BD%d \"%s\",\n", bitdepth,
1927*09537850SAkhilesh Sanikop test_utils::GetMd5Sum(noise_image_[0], image_width, image_height,
1928*09537850SAkhilesh Sanikop image_stride)
1929*09537850SAkhilesh Sanikop .c_str());
1930*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
1931*09537850SAkhilesh Sanikop "FilmGrain",
1932*09537850SAkhilesh Sanikop absl::StrFormat("ConstructNoiseImage overlap=%d, sub_x=%d, sub_y=%d",
1933*09537850SAkhilesh Sanikop overlap_flag, subsampling_x, subsampling_y)
1934*09537850SAkhilesh Sanikop .c_str(),
1935*09537850SAkhilesh Sanikop GetConstructImageTestDigest(bitdepth, overlap_flag, subsampling_x,
1936*09537850SAkhilesh Sanikop subsampling_y),
1937*09537850SAkhilesh Sanikop noise_image_[0], image_width, image_height, image_stride, elapsed_time);
1938*09537850SAkhilesh Sanikop }
1939*09537850SAkhilesh Sanikop }
1940*09537850SAkhilesh Sanikop
1941*09537850SAkhilesh Sanikop using ConstructImageTest8bpp = ConstructImageTest<8>;
1942*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest8bpp,RandomValues)1943*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest8bpp, RandomValues) {
1944*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1945*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1946*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1947*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1948*09537850SAkhilesh Sanikop }
1949*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest8bpp,SaturatedValues)1950*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest8bpp, SaturatedValues) {
1951*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1952*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1953*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1954*09537850SAkhilesh Sanikop /*saturate=*/true, /*compare=*/true);
1955*09537850SAkhilesh Sanikop }
1956*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest8bpp,DISABLED_Speed)1957*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest8bpp, DISABLED_Speed) {
1958*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1959*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1960*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/500,
1961*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1962*09537850SAkhilesh Sanikop }
1963*09537850SAkhilesh Sanikop
1964*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
1965*09537850SAkhilesh Sanikop using ConstructImageTest10bpp = ConstructImageTest<10>;
1966*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest10bpp,RandomValues)1967*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest10bpp, RandomValues) {
1968*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1969*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1970*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1971*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1972*09537850SAkhilesh Sanikop }
1973*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest10bpp,SaturatedValues)1974*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest10bpp, SaturatedValues) {
1975*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1976*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1977*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1978*09537850SAkhilesh Sanikop /*saturate=*/true, /*compare=*/true);
1979*09537850SAkhilesh Sanikop }
1980*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest10bpp,DISABLED_Speed)1981*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest10bpp, DISABLED_Speed) {
1982*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1983*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1984*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/500,
1985*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1986*09537850SAkhilesh Sanikop }
1987*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
1988*09537850SAkhilesh Sanikop
1989*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
1990*09537850SAkhilesh Sanikop using ConstructImageTest12bpp = ConstructImageTest<12>;
1991*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest12bpp,RandomValues)1992*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest12bpp, RandomValues) {
1993*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
1994*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
1995*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
1996*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
1997*09537850SAkhilesh Sanikop }
1998*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest12bpp,SaturatedValues)1999*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest12bpp, SaturatedValues) {
2000*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
2001*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
2002*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/1,
2003*09537850SAkhilesh Sanikop /*saturate=*/true, /*compare=*/true);
2004*09537850SAkhilesh Sanikop }
2005*09537850SAkhilesh Sanikop
TEST_P(ConstructImageTest12bpp,DISABLED_Speed)2006*09537850SAkhilesh Sanikop TEST_P(ConstructImageTest12bpp, DISABLED_Speed) {
2007*09537850SAkhilesh Sanikop ConstructNoiseTestParam test_params(GetParam());
2008*09537850SAkhilesh Sanikop TestConstructNoiseImage(test_params.overlap_flag, test_params.subsampling_x,
2009*09537850SAkhilesh Sanikop test_params.subsampling_y, /*num_runs=*/500,
2010*09537850SAkhilesh Sanikop /*saturate=*/false, /*compare=*/false);
2011*09537850SAkhilesh Sanikop }
2012*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
2013*09537850SAkhilesh Sanikop
2014*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ConstructImageTest8bpp,
2015*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2016*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2017*09537850SAkhilesh Sanikop
2018*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2019*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, ConstructImageTest8bpp,
2020*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2021*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2022*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_NEON
2023*09537850SAkhilesh Sanikop
2024*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
2025*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ConstructImageTest10bpp,
2026*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2027*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2028*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
2029*09537850SAkhilesh Sanikop
2030*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
2031*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ConstructImageTest12bpp,
2032*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2033*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2034*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
2035*09537850SAkhilesh Sanikop
2036*09537850SAkhilesh Sanikop template <int bitdepth>
2037*09537850SAkhilesh Sanikop class ScalingLookupTableTest : public testing::TestWithParam<int> {
2038*09537850SAkhilesh Sanikop public:
2039*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
ScalingLookupTableTest()2040*09537850SAkhilesh Sanikop ScalingLookupTableTest() {
2041*09537850SAkhilesh Sanikop test_utils::ResetDspTable(bitdepth);
2042*09537850SAkhilesh Sanikop FilmGrainInit_C();
2043*09537850SAkhilesh Sanikop const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
2044*09537850SAkhilesh Sanikop
2045*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
2046*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
2047*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
2048*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "NEON/")) {
2049*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2050*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
2051*09537850SAkhilesh Sanikop #endif
2052*09537850SAkhilesh Sanikop }
2053*09537850SAkhilesh Sanikop initialize_func_ = dsp->film_grain.initialize_scaling_lut;
2054*09537850SAkhilesh Sanikop }
2055*09537850SAkhilesh Sanikop ~ScalingLookupTableTest() override = default;
2056*09537850SAkhilesh Sanikop
2057*09537850SAkhilesh Sanikop protected:
2058*09537850SAkhilesh Sanikop void TestSpeed(int num_runs);
2059*09537850SAkhilesh Sanikop void ZeroPoints();
2060*09537850SAkhilesh Sanikop
2061*09537850SAkhilesh Sanikop private:
2062*09537850SAkhilesh Sanikop static constexpr int kScalingLutBufferLength =
2063*09537850SAkhilesh Sanikop (kScalingLookupTableSize + kScalingLookupTablePadding) << (bitdepth - 8);
2064*09537850SAkhilesh Sanikop dsp::InitializeScalingLutFunc initialize_func_;
2065*09537850SAkhilesh Sanikop int16_t scaling_lut_[kScalingLutBufferLength];
2066*09537850SAkhilesh Sanikop };
2067*09537850SAkhilesh Sanikop
2068*09537850SAkhilesh Sanikop template <int bitdepth>
TestSpeed(int num_runs)2069*09537850SAkhilesh Sanikop void ScalingLookupTableTest<bitdepth>::TestSpeed(int num_runs) {
2070*09537850SAkhilesh Sanikop if (initialize_func_ == nullptr) return;
2071*09537850SAkhilesh Sanikop const int param_index = GetParam();
2072*09537850SAkhilesh Sanikop const FilmGrainParams& params = kFilmGrainParams[param_index];
2073*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
2074*09537850SAkhilesh Sanikop Memset(scaling_lut_, 0, kScalingLutBufferLength);
2075*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
2076*09537850SAkhilesh Sanikop initialize_func_(params.num_y_points, params.point_y_value,
2077*09537850SAkhilesh Sanikop params.point_y_scaling, scaling_lut_,
2078*09537850SAkhilesh Sanikop kScalingLutBufferLength);
2079*09537850SAkhilesh Sanikop }
2080*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
2081*09537850SAkhilesh Sanikop if (num_runs > 1) {
2082*09537850SAkhilesh Sanikop printf("InitializeScalingLut: %d us\n",
2083*09537850SAkhilesh Sanikop static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
2084*09537850SAkhilesh Sanikop return;
2085*09537850SAkhilesh Sanikop }
2086*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2087*09537850SAkhilesh Sanikop "FilmGrain",
2088*09537850SAkhilesh Sanikop absl::StrFormat("InitializeScalingLut for param set: %d", param_index)
2089*09537850SAkhilesh Sanikop .c_str(),
2090*09537850SAkhilesh Sanikop GetScalingInitTestDigest(param_index, bitdepth), scaling_lut_,
2091*09537850SAkhilesh Sanikop (sizeof(scaling_lut_[0]) * kScalingLookupTableSize) << (bitdepth - 8),
2092*09537850SAkhilesh Sanikop elapsed_time);
2093*09537850SAkhilesh Sanikop }
2094*09537850SAkhilesh Sanikop
2095*09537850SAkhilesh Sanikop template <int bitdepth>
ZeroPoints()2096*09537850SAkhilesh Sanikop void ScalingLookupTableTest<bitdepth>::ZeroPoints() {
2097*09537850SAkhilesh Sanikop if (initialize_func_ == nullptr) return;
2098*09537850SAkhilesh Sanikop const int param_index = GetParam();
2099*09537850SAkhilesh Sanikop const FilmGrainParams& params = kFilmGrainParams[param_index];
2100*09537850SAkhilesh Sanikop initialize_func_(0, params.point_y_value, params.point_y_scaling,
2101*09537850SAkhilesh Sanikop scaling_lut_, kScalingLookupTableSize);
2102*09537850SAkhilesh Sanikop for (int i = 0; i < kScalingLookupTableSize; ++i) {
2103*09537850SAkhilesh Sanikop ASSERT_EQ(scaling_lut_[i], 0);
2104*09537850SAkhilesh Sanikop }
2105*09537850SAkhilesh Sanikop }
2106*09537850SAkhilesh Sanikop
2107*09537850SAkhilesh Sanikop using ScalingLookupTableTest8bpp = ScalingLookupTableTest<8>;
2108*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest8bpp,ZeroPoints)2109*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest8bpp, ZeroPoints) { ZeroPoints(); }
2110*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest8bpp,Correctness)2111*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest8bpp, Correctness) { TestSpeed(/*num_runs=*/1); }
2112*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest8bpp,DISABLED_Speed)2113*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest8bpp, DISABLED_Speed) {
2114*09537850SAkhilesh Sanikop TestSpeed(/*num_runs=*/1e5);
2115*09537850SAkhilesh Sanikop }
2116*09537850SAkhilesh Sanikop
2117*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
2118*09537850SAkhilesh Sanikop using ScalingLookupTableTest10bpp = ScalingLookupTableTest<10>;
2119*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest10bpp,ZeroPoints)2120*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest10bpp, ZeroPoints) { ZeroPoints(); }
2121*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest10bpp,Correctness)2122*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest10bpp, Correctness) { TestSpeed(/*num_runs=*/1); }
2123*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest10bpp,DISABLED_Speed)2124*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest10bpp, DISABLED_Speed) {
2125*09537850SAkhilesh Sanikop TestSpeed(/*num_runs=*/1e5);
2126*09537850SAkhilesh Sanikop }
2127*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
2128*09537850SAkhilesh Sanikop
2129*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
2130*09537850SAkhilesh Sanikop using ScalingLookupTableTest12bpp = ScalingLookupTableTest<12>;
2131*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest12bpp,ZeroPoints)2132*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest12bpp, ZeroPoints) { ZeroPoints(); }
2133*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest12bpp,Correctness)2134*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest12bpp, Correctness) { TestSpeed(/*num_runs=*/1); }
2135*09537850SAkhilesh Sanikop
TEST_P(ScalingLookupTableTest12bpp,DISABLED_Speed)2136*09537850SAkhilesh Sanikop TEST_P(ScalingLookupTableTest12bpp, DISABLED_Speed) {
2137*09537850SAkhilesh Sanikop TestSpeed(/*num_runs=*/1e5);
2138*09537850SAkhilesh Sanikop }
2139*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
2140*09537850SAkhilesh Sanikop
2141*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ScalingLookupTableTest8bpp,
2142*09537850SAkhilesh Sanikop testing::Range(0, kNumFilmGrainTestParams));
2143*09537850SAkhilesh Sanikop
2144*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2145*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, ScalingLookupTableTest8bpp,
2146*09537850SAkhilesh Sanikop testing::Range(0, kNumFilmGrainTestParams));
2147*09537850SAkhilesh Sanikop #endif
2148*09537850SAkhilesh Sanikop
2149*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
2150*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ScalingLookupTableTest10bpp,
2151*09537850SAkhilesh Sanikop testing::Range(0, kNumFilmGrainTestParams));
2152*09537850SAkhilesh Sanikop
2153*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2154*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, ScalingLookupTableTest10bpp,
2155*09537850SAkhilesh Sanikop testing::Range(0, kNumFilmGrainTestParams));
2156*09537850SAkhilesh Sanikop #endif
2157*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
2158*09537850SAkhilesh Sanikop
2159*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
2160*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ScalingLookupTableTest12bpp,
2161*09537850SAkhilesh Sanikop testing::Range(0, kNumFilmGrainTestParams));
2162*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
2163*09537850SAkhilesh Sanikop
2164*09537850SAkhilesh Sanikop struct BlendNoiseTestParam {
BlendNoiseTestParamlibgav1::dsp::film_grain::__anoncc33db1e0111::BlendNoiseTestParam2165*09537850SAkhilesh Sanikop explicit BlendNoiseTestParam(const std::tuple<int, int>& in)
2166*09537850SAkhilesh Sanikop : chroma_scaling_from_luma(std::get<0>(in)) {
2167*09537850SAkhilesh Sanikop switch (std::get<1>(in)) {
2168*09537850SAkhilesh Sanikop case 0:
2169*09537850SAkhilesh Sanikop subsampling_x = 0;
2170*09537850SAkhilesh Sanikop subsampling_y = 0;
2171*09537850SAkhilesh Sanikop break;
2172*09537850SAkhilesh Sanikop case 1:
2173*09537850SAkhilesh Sanikop subsampling_x = 1;
2174*09537850SAkhilesh Sanikop subsampling_y = 0;
2175*09537850SAkhilesh Sanikop break;
2176*09537850SAkhilesh Sanikop default:
2177*09537850SAkhilesh Sanikop assert(std::get<1>(in) == 2);
2178*09537850SAkhilesh Sanikop subsampling_x = 1;
2179*09537850SAkhilesh Sanikop subsampling_y = 1;
2180*09537850SAkhilesh Sanikop }
2181*09537850SAkhilesh Sanikop }
2182*09537850SAkhilesh Sanikop const int chroma_scaling_from_luma;
2183*09537850SAkhilesh Sanikop int subsampling_x;
2184*09537850SAkhilesh Sanikop int subsampling_y;
2185*09537850SAkhilesh Sanikop };
2186*09537850SAkhilesh Sanikop
2187*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
2188*09537850SAkhilesh Sanikop class BlendNoiseTest : public testing::TestWithParam<std::tuple<int, int>> {
2189*09537850SAkhilesh Sanikop public:
2190*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
2191*09537850SAkhilesh Sanikop using GrainType =
2192*09537850SAkhilesh Sanikop typename std::conditional<bitdepth == 8, int8_t, int16_t>::type;
2193*09537850SAkhilesh Sanikop ~BlendNoiseTest() override = default;
2194*09537850SAkhilesh Sanikop
2195*09537850SAkhilesh Sanikop protected:
SetUp()2196*09537850SAkhilesh Sanikop void SetUp() override {
2197*09537850SAkhilesh Sanikop test_utils::ResetDspTable(bitdepth);
2198*09537850SAkhilesh Sanikop FilmGrainInit_C();
2199*09537850SAkhilesh Sanikop const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
2200*09537850SAkhilesh Sanikop
2201*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
2202*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
2203*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
2204*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "NEON/")) {
2205*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2206*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
2207*09537850SAkhilesh Sanikop #endif
2208*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "SSE41/")) {
2209*09537850SAkhilesh Sanikop if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
2210*09537850SAkhilesh Sanikop FilmGrainInit_SSE4_1();
2211*09537850SAkhilesh Sanikop }
2212*09537850SAkhilesh Sanikop const BlendNoiseTestParam test_param(GetParam());
2213*09537850SAkhilesh Sanikop chroma_scaling_from_luma_ = test_param.chroma_scaling_from_luma;
2214*09537850SAkhilesh Sanikop blend_luma_func_ = dsp->film_grain.blend_noise_luma;
2215*09537850SAkhilesh Sanikop blend_chroma_func_ =
2216*09537850SAkhilesh Sanikop dsp->film_grain.blend_noise_chroma[chroma_scaling_from_luma_];
2217*09537850SAkhilesh Sanikop subsampling_x_ = test_param.subsampling_x;
2218*09537850SAkhilesh Sanikop subsampling_y_ = test_param.subsampling_y;
2219*09537850SAkhilesh Sanikop
2220*09537850SAkhilesh Sanikop uv_width_ = (width_ + subsampling_x_) >> subsampling_x_;
2221*09537850SAkhilesh Sanikop uv_height_ = (height_ + subsampling_y_) >> subsampling_y_;
2222*09537850SAkhilesh Sanikop uv_stride_ = uv_width_ * sizeof(Pixel);
2223*09537850SAkhilesh Sanikop y_stride_ = width_ * sizeof(Pixel);
2224*09537850SAkhilesh Sanikop const size_t buffer_size =
2225*09537850SAkhilesh Sanikop sizeof(Pixel) * (width_ * height_ + 2 * uv_width_ * uv_height_ +
2226*09537850SAkhilesh Sanikop 3 * kBorderPixelsFilmGrain);
2227*09537850SAkhilesh Sanikop source_buffer_.reset(new (std::nothrow) uint8_t[buffer_size]);
2228*09537850SAkhilesh Sanikop memset(source_buffer_.get(), 0, sizeof(source_buffer_[0]) * buffer_size);
2229*09537850SAkhilesh Sanikop dest_buffer_.reset(new (std::nothrow) uint8_t[buffer_size]);
2230*09537850SAkhilesh Sanikop memset(dest_buffer_.get(), 0, sizeof(dest_buffer_[0]) * buffer_size);
2231*09537850SAkhilesh Sanikop source_plane_y_ = source_buffer_.get();
2232*09537850SAkhilesh Sanikop source_plane_u_ =
2233*09537850SAkhilesh Sanikop source_plane_y_ + y_stride_ * height_ + kBorderPixelsFilmGrain;
2234*09537850SAkhilesh Sanikop source_plane_v_ =
2235*09537850SAkhilesh Sanikop source_plane_u_ + uv_stride_ * uv_height_ + kBorderPixelsFilmGrain;
2236*09537850SAkhilesh Sanikop dest_plane_y_ = dest_buffer_.get();
2237*09537850SAkhilesh Sanikop dest_plane_u_ =
2238*09537850SAkhilesh Sanikop dest_plane_y_ + y_stride_ * height_ + kBorderPixelsFilmGrain;
2239*09537850SAkhilesh Sanikop dest_plane_v_ =
2240*09537850SAkhilesh Sanikop dest_plane_u_ + uv_stride_ * uv_height_ + kBorderPixelsFilmGrain;
2241*09537850SAkhilesh Sanikop }
2242*09537850SAkhilesh Sanikop
2243*09537850SAkhilesh Sanikop void TestSpeed(int num_runs);
2244*09537850SAkhilesh Sanikop
2245*09537850SAkhilesh Sanikop private:
2246*09537850SAkhilesh Sanikop static constexpr int kScalingLutBufferLength =
2247*09537850SAkhilesh Sanikop (kScalingLookupTableSize + kScalingLookupTablePadding) << 2;
2248*09537850SAkhilesh Sanikop
2249*09537850SAkhilesh Sanikop void ConvertScalingLut10bpp(int16_t* scaling_lut_10bpp,
2250*09537850SAkhilesh Sanikop const int16_t* src_scaling_lut);
2251*09537850SAkhilesh Sanikop dsp::BlendNoiseWithImageLumaFunc blend_luma_func_;
2252*09537850SAkhilesh Sanikop dsp::BlendNoiseWithImageChromaFunc blend_chroma_func_;
2253*09537850SAkhilesh Sanikop
2254*09537850SAkhilesh Sanikop const int width_ = 1921;
2255*09537850SAkhilesh Sanikop const int height_ = 1081;
2256*09537850SAkhilesh Sanikop int chroma_scaling_from_luma_ = 0;
2257*09537850SAkhilesh Sanikop int subsampling_x_ = 0;
2258*09537850SAkhilesh Sanikop int subsampling_y_ = 0;
2259*09537850SAkhilesh Sanikop int uv_width_ = 0;
2260*09537850SAkhilesh Sanikop int uv_height_ = 0;
2261*09537850SAkhilesh Sanikop int uv_stride_ = 0;
2262*09537850SAkhilesh Sanikop int y_stride_ = 0;
2263*09537850SAkhilesh Sanikop // This holds the data that |source_plane_y_|, |source_plane_u_|, and
2264*09537850SAkhilesh Sanikop // |source_plane_v_| point to.
2265*09537850SAkhilesh Sanikop std::unique_ptr<uint8_t[]> source_buffer_;
2266*09537850SAkhilesh Sanikop // This holds the data that |dest_plane_y_|, |dest_plane_u_|, and
2267*09537850SAkhilesh Sanikop // |dest_plane_v_| point to.
2268*09537850SAkhilesh Sanikop std::unique_ptr<uint8_t[]> dest_buffer_;
2269*09537850SAkhilesh Sanikop uint8_t* source_plane_y_ = nullptr;
2270*09537850SAkhilesh Sanikop uint8_t* source_plane_u_ = nullptr;
2271*09537850SAkhilesh Sanikop uint8_t* source_plane_v_ = nullptr;
2272*09537850SAkhilesh Sanikop uint8_t* dest_plane_y_ = nullptr;
2273*09537850SAkhilesh Sanikop uint8_t* dest_plane_u_ = nullptr;
2274*09537850SAkhilesh Sanikop uint8_t* dest_plane_v_ = nullptr;
2275*09537850SAkhilesh Sanikop Array2D<GrainType> noise_image_[kMaxPlanes];
2276*09537850SAkhilesh Sanikop int16_t scaling_lut_10bpp_y_[kScalingLutBufferLength];
2277*09537850SAkhilesh Sanikop int16_t scaling_lut_10bpp_u_[kScalingLutBufferLength];
2278*09537850SAkhilesh Sanikop int16_t scaling_lut_10bpp_v_[kScalingLutBufferLength];
2279*09537850SAkhilesh Sanikop };
2280*09537850SAkhilesh Sanikop
2281*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
ConvertScalingLut10bpp(int16_t * scaling_lut_10bpp,const int16_t * src_scaling_lut)2282*09537850SAkhilesh Sanikop void BlendNoiseTest<bitdepth, Pixel>::ConvertScalingLut10bpp(
2283*09537850SAkhilesh Sanikop int16_t* scaling_lut_10bpp, const int16_t* src_scaling_lut) {
2284*09537850SAkhilesh Sanikop for (int i = 0; i < kScalingLookupTableSize - 1; ++i) {
2285*09537850SAkhilesh Sanikop const int x_base = i << 2;
2286*09537850SAkhilesh Sanikop const int start = src_scaling_lut[i];
2287*09537850SAkhilesh Sanikop const int end_index = std::min(i + 1, kScalingLookupTableSize - 1);
2288*09537850SAkhilesh Sanikop const int end = src_scaling_lut[end_index];
2289*09537850SAkhilesh Sanikop const int delta = end - start;
2290*09537850SAkhilesh Sanikop scaling_lut_10bpp[x_base] = start;
2291*09537850SAkhilesh Sanikop scaling_lut_10bpp[x_base + 1] = start + RightShiftWithRounding(delta, 2);
2292*09537850SAkhilesh Sanikop scaling_lut_10bpp[x_base + 2] =
2293*09537850SAkhilesh Sanikop start + RightShiftWithRounding(2 * delta, 2);
2294*09537850SAkhilesh Sanikop scaling_lut_10bpp[x_base + 3] =
2295*09537850SAkhilesh Sanikop start + RightShiftWithRounding(3 * delta, 2);
2296*09537850SAkhilesh Sanikop }
2297*09537850SAkhilesh Sanikop }
2298*09537850SAkhilesh Sanikop
2299*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
TestSpeed(const int num_runs)2300*09537850SAkhilesh Sanikop void BlendNoiseTest<bitdepth, Pixel>::TestSpeed(const int num_runs) {
2301*09537850SAkhilesh Sanikop if (blend_chroma_func_ == nullptr || blend_luma_func_ == nullptr) return;
2302*09537850SAkhilesh Sanikop // Allow optimized code to read into the border without generating MSan
2303*09537850SAkhilesh Sanikop // warnings. This matches the behavior in FilmGrain::AllocateNoiseImage().
2304*09537850SAkhilesh Sanikop constexpr bool zero_initialize = LIBGAV1_MSAN == 1;
2305*09537850SAkhilesh Sanikop ASSERT_TRUE(noise_image_[kPlaneY].Reset(height_, width_ + kNoiseImagePadding,
2306*09537850SAkhilesh Sanikop zero_initialize));
2307*09537850SAkhilesh Sanikop ASSERT_TRUE(noise_image_[kPlaneU].Reset(
2308*09537850SAkhilesh Sanikop uv_height_, uv_width_ + kNoiseImagePadding, zero_initialize));
2309*09537850SAkhilesh Sanikop ASSERT_TRUE(noise_image_[kPlaneV].Reset(
2310*09537850SAkhilesh Sanikop uv_height_, uv_width_ + kNoiseImagePadding, zero_initialize));
2311*09537850SAkhilesh Sanikop libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
2312*09537850SAkhilesh Sanikop // Allow any valid grain values.
2313*09537850SAkhilesh Sanikop const int grain_max = GetGrainMax<bitdepth>();
2314*09537850SAkhilesh Sanikop const int grain_min = GetGrainMin<bitdepth>();
2315*09537850SAkhilesh Sanikop const int random_range = grain_max - grain_min + 1;
2316*09537850SAkhilesh Sanikop auto* src_y = reinterpret_cast<Pixel*>(source_plane_y_);
2317*09537850SAkhilesh Sanikop auto* src_u = reinterpret_cast<Pixel*>(source_plane_u_);
2318*09537850SAkhilesh Sanikop auto* src_v = reinterpret_cast<Pixel*>(source_plane_v_);
2319*09537850SAkhilesh Sanikop for (int y = 0; y < height_; ++y) {
2320*09537850SAkhilesh Sanikop for (int x = 0; x < width_; ++x) {
2321*09537850SAkhilesh Sanikop const int random_source_y = rnd(random_range);
2322*09537850SAkhilesh Sanikop // Populating the luma source ensures the lookup table is tested. Chroma
2323*09537850SAkhilesh Sanikop // planes are given identical values. Giving them different values would
2324*09537850SAkhilesh Sanikop // artificially differentiate the outputs. It's important that the test
2325*09537850SAkhilesh Sanikop // expect that different outputs are caused by the different scaling
2326*09537850SAkhilesh Sanikop // lookup tables, rather than by different inputs.
2327*09537850SAkhilesh Sanikop const int uv_y_pos = y >> subsampling_y_;
2328*09537850SAkhilesh Sanikop const int uv_x_pos = x >> subsampling_x_;
2329*09537850SAkhilesh Sanikop src_y[y * width_ + x] = random_source_y;
2330*09537850SAkhilesh Sanikop src_u[uv_y_pos * uv_width_ + uv_x_pos] = random_source_y;
2331*09537850SAkhilesh Sanikop src_v[uv_y_pos * uv_width_ + uv_x_pos] = random_source_y;
2332*09537850SAkhilesh Sanikop const int random_y = rnd(random_range);
2333*09537850SAkhilesh Sanikop noise_image_[kPlaneY][y][x] = random_y + grain_min;
2334*09537850SAkhilesh Sanikop const int random_u = rnd(random_range);
2335*09537850SAkhilesh Sanikop noise_image_[kPlaneU][uv_y_pos][uv_x_pos] = random_u + grain_min;
2336*09537850SAkhilesh Sanikop const int random_v = rnd(random_range);
2337*09537850SAkhilesh Sanikop noise_image_[kPlaneV][uv_y_pos][uv_x_pos] = random_v + grain_min;
2338*09537850SAkhilesh Sanikop }
2339*09537850SAkhilesh Sanikop }
2340*09537850SAkhilesh Sanikop static constexpr int16_t kTestScalingLutY[kScalingLookupTableSize] = {
2341*09537850SAkhilesh Sanikop 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73,
2342*09537850SAkhilesh Sanikop 75, 76, 77, 79, 80, 81, 83, 84, 86, 87, 88, 90, 91, 92, 92,
2343*09537850SAkhilesh Sanikop 93, 93, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 99, 99, 98,
2344*09537850SAkhilesh Sanikop 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 97,
2345*09537850SAkhilesh Sanikop 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
2346*09537850SAkhilesh Sanikop 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100,
2347*09537850SAkhilesh Sanikop 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
2348*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2349*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2350*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2351*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2352*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2353*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2354*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2355*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2356*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2357*09537850SAkhilesh Sanikop 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
2358*09537850SAkhilesh Sanikop 102, 102,
2359*09537850SAkhilesh Sanikop };
2360*09537850SAkhilesh Sanikop static constexpr int16_t kTestScalingLutU[kScalingLookupTableSize] = {
2361*09537850SAkhilesh Sanikop 30, 42, 53, 65, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
2362*09537850SAkhilesh Sanikop 75, 76, 78, 79, 81, 82, 83, 85, 86, 88, 89, 91, 92, 93, 93,
2363*09537850SAkhilesh Sanikop 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 99, 99, 99,
2364*09537850SAkhilesh Sanikop 99, 99, 99, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
2365*09537850SAkhilesh Sanikop 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
2366*09537850SAkhilesh Sanikop 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99,
2367*09537850SAkhilesh Sanikop 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
2368*09537850SAkhilesh Sanikop 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
2369*09537850SAkhilesh Sanikop 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100,
2370*09537850SAkhilesh Sanikop 100, 100, 100, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
2371*09537850SAkhilesh Sanikop 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
2372*09537850SAkhilesh Sanikop 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97,
2373*09537850SAkhilesh Sanikop 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
2374*09537850SAkhilesh Sanikop 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 96, 96, 96, 96, 96,
2375*09537850SAkhilesh Sanikop 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
2376*09537850SAkhilesh Sanikop 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 95,
2377*09537850SAkhilesh Sanikop 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
2378*09537850SAkhilesh Sanikop 95, 95,
2379*09537850SAkhilesh Sanikop };
2380*09537850SAkhilesh Sanikop static constexpr int16_t kTestScalingLutV[kScalingLookupTableSize] = {
2381*09537850SAkhilesh Sanikop 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74,
2382*09537850SAkhilesh Sanikop 75, 75, 78, 79, 81, 82, 83, 85, 86, 88, 89, 91, 92, 93, 93,
2383*09537850SAkhilesh Sanikop 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 99, 99, 98,
2384*09537850SAkhilesh Sanikop 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 97,
2385*09537850SAkhilesh Sanikop 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
2386*09537850SAkhilesh Sanikop 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
2387*09537850SAkhilesh Sanikop 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100,
2388*09537850SAkhilesh Sanikop 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101,
2389*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2390*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2391*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2392*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2393*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2394*09537850SAkhilesh Sanikop 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
2395*09537850SAkhilesh Sanikop 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
2396*09537850SAkhilesh Sanikop 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
2397*09537850SAkhilesh Sanikop 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
2398*09537850SAkhilesh Sanikop 255, 255,
2399*09537850SAkhilesh Sanikop };
2400*09537850SAkhilesh Sanikop
2401*09537850SAkhilesh Sanikop if (bitdepth == 10) {
2402*09537850SAkhilesh Sanikop for (int i = 0; i < kScalingLutBufferLength; ++i) {
2403*09537850SAkhilesh Sanikop ConvertScalingLut10bpp(scaling_lut_10bpp_y_, kTestScalingLutY);
2404*09537850SAkhilesh Sanikop ConvertScalingLut10bpp(scaling_lut_10bpp_u_, kTestScalingLutU);
2405*09537850SAkhilesh Sanikop ConvertScalingLut10bpp(scaling_lut_10bpp_v_, kTestScalingLutV);
2406*09537850SAkhilesh Sanikop }
2407*09537850SAkhilesh Sanikop }
2408*09537850SAkhilesh Sanikop const FilmGrainParams& params = kFilmGrainParams[0];
2409*09537850SAkhilesh Sanikop const int min_value = 16 << (bitdepth - 8);
2410*09537850SAkhilesh Sanikop const int max_value = 235 << (bitdepth - 8);
2411*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
2412*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
2413*09537850SAkhilesh Sanikop if (chroma_scaling_from_luma_) {
2414*09537850SAkhilesh Sanikop blend_chroma_func_(
2415*09537850SAkhilesh Sanikop kPlaneU, params, noise_image_, min_value, max_value, width_, height_,
2416*09537850SAkhilesh Sanikop /*start_height=*/0, subsampling_x_, subsampling_y_,
2417*09537850SAkhilesh Sanikop (bitdepth == 10) ? scaling_lut_10bpp_y_ : kTestScalingLutY,
2418*09537850SAkhilesh Sanikop source_plane_y_, y_stride_, source_plane_u_, uv_stride_,
2419*09537850SAkhilesh Sanikop dest_plane_u_, uv_stride_);
2420*09537850SAkhilesh Sanikop blend_chroma_func_(
2421*09537850SAkhilesh Sanikop kPlaneV, params, noise_image_, min_value, max_value, width_, height_,
2422*09537850SAkhilesh Sanikop /*start_height=*/0, subsampling_x_, subsampling_y_,
2423*09537850SAkhilesh Sanikop (bitdepth == 10) ? scaling_lut_10bpp_y_ : kTestScalingLutY,
2424*09537850SAkhilesh Sanikop source_plane_y_, y_stride_, source_plane_v_, uv_stride_,
2425*09537850SAkhilesh Sanikop dest_plane_v_, uv_stride_);
2426*09537850SAkhilesh Sanikop } else {
2427*09537850SAkhilesh Sanikop blend_chroma_func_(
2428*09537850SAkhilesh Sanikop kPlaneU, params, noise_image_, min_value, max_value, width_, height_,
2429*09537850SAkhilesh Sanikop /*start_height=*/0, subsampling_x_, subsampling_y_,
2430*09537850SAkhilesh Sanikop (bitdepth == 10) ? scaling_lut_10bpp_u_ : kTestScalingLutU,
2431*09537850SAkhilesh Sanikop source_plane_y_, y_stride_, source_plane_u_, uv_stride_,
2432*09537850SAkhilesh Sanikop dest_plane_u_, uv_stride_);
2433*09537850SAkhilesh Sanikop blend_chroma_func_(
2434*09537850SAkhilesh Sanikop kPlaneV, params, noise_image_, min_value, max_value, width_, height_,
2435*09537850SAkhilesh Sanikop /*start_height=*/0, subsampling_x_, subsampling_y_,
2436*09537850SAkhilesh Sanikop (bitdepth == 10) ? scaling_lut_10bpp_v_ : kTestScalingLutV,
2437*09537850SAkhilesh Sanikop source_plane_y_, y_stride_, source_plane_v_, uv_stride_,
2438*09537850SAkhilesh Sanikop dest_plane_v_, uv_stride_);
2439*09537850SAkhilesh Sanikop }
2440*09537850SAkhilesh Sanikop blend_luma_func_(noise_image_, min_value, max_value, params.chroma_scaling,
2441*09537850SAkhilesh Sanikop width_, height_, /*start_height=*/0,
2442*09537850SAkhilesh Sanikop (bitdepth == 10) ? scaling_lut_10bpp_y_ : kTestScalingLutY,
2443*09537850SAkhilesh Sanikop source_plane_y_, y_stride_, dest_plane_y_, y_stride_);
2444*09537850SAkhilesh Sanikop }
2445*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
2446*09537850SAkhilesh Sanikop const char* digest_luma = GetBlendLumaTestDigest(bitdepth);
2447*09537850SAkhilesh Sanikop printf("YBD%d \"%s\",\n", bitdepth,
2448*09537850SAkhilesh Sanikop test_utils::GetMd5Sum(dest_plane_y_, y_stride_ * height_).c_str());
2449*09537850SAkhilesh Sanikop printf("UBD%d \"%s\",\n", bitdepth,
2450*09537850SAkhilesh Sanikop test_utils::GetMd5Sum(dest_plane_u_, uv_stride_ * uv_height_).c_str());
2451*09537850SAkhilesh Sanikop printf("VBD%d \"%s\",\n", bitdepth,
2452*09537850SAkhilesh Sanikop test_utils::GetMd5Sum(dest_plane_v_, uv_stride_ * uv_height_).c_str());
2453*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2454*09537850SAkhilesh Sanikop "BlendNoiseWithImage",
2455*09537850SAkhilesh Sanikop absl::StrFormat("Luma cfl=%d, sub_x=%d, sub_y=%d",
2456*09537850SAkhilesh Sanikop chroma_scaling_from_luma_, subsampling_x_, subsampling_y_)
2457*09537850SAkhilesh Sanikop .c_str(),
2458*09537850SAkhilesh Sanikop digest_luma, dest_plane_y_, y_stride_ * height_, elapsed_time);
2459*09537850SAkhilesh Sanikop const char* digest_chroma_u = GetBlendChromaUTestDigest(
2460*09537850SAkhilesh Sanikop bitdepth, chroma_scaling_from_luma_, subsampling_x_, subsampling_y_);
2461*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2462*09537850SAkhilesh Sanikop "BlendNoiseWithImage",
2463*09537850SAkhilesh Sanikop absl::StrFormat("ChromaU cfl=%d, sub_x=%d, sub_y=%d",
2464*09537850SAkhilesh Sanikop chroma_scaling_from_luma_, subsampling_x_, subsampling_y_)
2465*09537850SAkhilesh Sanikop .c_str(),
2466*09537850SAkhilesh Sanikop digest_chroma_u, dest_plane_u_, uv_stride_ * uv_height_, elapsed_time);
2467*09537850SAkhilesh Sanikop const char* digest_chroma_v = GetBlendChromaVTestDigest(
2468*09537850SAkhilesh Sanikop bitdepth, chroma_scaling_from_luma_, subsampling_x_, subsampling_y_);
2469*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2470*09537850SAkhilesh Sanikop "BlendNoiseWithImage",
2471*09537850SAkhilesh Sanikop absl::StrFormat("ChromaV cfl=%d, sub_x=%d, sub_y=%d",
2472*09537850SAkhilesh Sanikop chroma_scaling_from_luma_, subsampling_x_, subsampling_y_)
2473*09537850SAkhilesh Sanikop .c_str(),
2474*09537850SAkhilesh Sanikop digest_chroma_v, dest_plane_v_, uv_stride_ * uv_height_, elapsed_time);
2475*09537850SAkhilesh Sanikop }
2476*09537850SAkhilesh Sanikop
2477*09537850SAkhilesh Sanikop using BlendNoiseTest8bpp = BlendNoiseTest<8, uint8_t>;
2478*09537850SAkhilesh Sanikop
TEST_P(BlendNoiseTest8bpp,MatchesOriginalOutput)2479*09537850SAkhilesh Sanikop TEST_P(BlendNoiseTest8bpp, MatchesOriginalOutput) { TestSpeed(1); }
2480*09537850SAkhilesh Sanikop
TEST_P(BlendNoiseTest8bpp,DISABLED_Speed)2481*09537850SAkhilesh Sanikop TEST_P(BlendNoiseTest8bpp, DISABLED_Speed) { TestSpeed(kNumSpeedTests); }
2482*09537850SAkhilesh Sanikop
2483*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, BlendNoiseTest8bpp,
2484*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2485*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2486*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
2487*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, BlendNoiseTest8bpp,
2488*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2489*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2490*09537850SAkhilesh Sanikop #endif
2491*09537850SAkhilesh Sanikop
2492*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2493*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, BlendNoiseTest8bpp,
2494*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2495*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2496*09537850SAkhilesh Sanikop #endif
2497*09537850SAkhilesh Sanikop
2498*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
2499*09537850SAkhilesh Sanikop using BlendNoiseTest10bpp = BlendNoiseTest<10, uint16_t>;
2500*09537850SAkhilesh Sanikop
TEST_P(BlendNoiseTest10bpp,MatchesOriginalOutput)2501*09537850SAkhilesh Sanikop TEST_P(BlendNoiseTest10bpp, MatchesOriginalOutput) { TestSpeed(1); }
2502*09537850SAkhilesh Sanikop
TEST_P(BlendNoiseTest10bpp,DISABLED_Speed)2503*09537850SAkhilesh Sanikop TEST_P(BlendNoiseTest10bpp, DISABLED_Speed) { TestSpeed(kNumSpeedTests); }
2504*09537850SAkhilesh Sanikop
2505*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, BlendNoiseTest10bpp,
2506*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2507*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2508*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
2509*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, BlendNoiseTest10bpp,
2510*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2511*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2512*09537850SAkhilesh Sanikop #endif
2513*09537850SAkhilesh Sanikop
2514*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2515*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, BlendNoiseTest10bpp,
2516*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2517*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2518*09537850SAkhilesh Sanikop #endif
2519*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
2520*09537850SAkhilesh Sanikop
2521*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
2522*09537850SAkhilesh Sanikop using BlendNoiseTest12bpp = BlendNoiseTest<12, uint16_t>;
2523*09537850SAkhilesh Sanikop
TEST_P(BlendNoiseTest12bpp,MatchesOriginalOutput)2524*09537850SAkhilesh Sanikop TEST_P(BlendNoiseTest12bpp, MatchesOriginalOutput) { TestSpeed(1); }
2525*09537850SAkhilesh Sanikop
TEST_P(BlendNoiseTest12bpp,DISABLED_Speed)2526*09537850SAkhilesh Sanikop TEST_P(BlendNoiseTest12bpp, DISABLED_Speed) { TestSpeed(kNumSpeedTests); }
2527*09537850SAkhilesh Sanikop
2528*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, BlendNoiseTest12bpp,
2529*09537850SAkhilesh Sanikop testing::Combine(testing::Range(0, 2),
2530*09537850SAkhilesh Sanikop testing::Range(0, 3)));
2531*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
2532*09537850SAkhilesh Sanikop
2533*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
2534*09537850SAkhilesh Sanikop class FilmGrainSpeedTest : public testing::TestWithParam<int> {
2535*09537850SAkhilesh Sanikop public:
2536*09537850SAkhilesh Sanikop static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
2537*09537850SAkhilesh Sanikop ~FilmGrainSpeedTest() override = default;
2538*09537850SAkhilesh Sanikop
2539*09537850SAkhilesh Sanikop protected:
SetUp()2540*09537850SAkhilesh Sanikop void SetUp() override {
2541*09537850SAkhilesh Sanikop test_utils::ResetDspTable(bitdepth);
2542*09537850SAkhilesh Sanikop FilmGrainInit_C();
2543*09537850SAkhilesh Sanikop
2544*09537850SAkhilesh Sanikop const testing::TestInfo* const test_info =
2545*09537850SAkhilesh Sanikop testing::UnitTest::GetInstance()->current_test_info();
2546*09537850SAkhilesh Sanikop const char* const test_case = test_info->test_suite_name();
2547*09537850SAkhilesh Sanikop if (absl::StartsWith(test_case, "NEON/")) {
2548*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2549*09537850SAkhilesh Sanikop FilmGrainInit_NEON();
2550*09537850SAkhilesh Sanikop #endif
2551*09537850SAkhilesh Sanikop } else if (absl::StartsWith(test_case, "SSE41/")) {
2552*09537850SAkhilesh Sanikop if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
2553*09537850SAkhilesh Sanikop FilmGrainInit_SSE4_1();
2554*09537850SAkhilesh Sanikop }
2555*09537850SAkhilesh Sanikop uv_width_ = (width_ + subsampling_x_) >> subsampling_x_;
2556*09537850SAkhilesh Sanikop uv_height_ = (height_ + subsampling_y_) >> subsampling_y_;
2557*09537850SAkhilesh Sanikop uv_stride_ = uv_width_ * sizeof(Pixel);
2558*09537850SAkhilesh Sanikop y_stride_ = width_ * sizeof(Pixel);
2559*09537850SAkhilesh Sanikop const size_t buffer_size =
2560*09537850SAkhilesh Sanikop sizeof(Pixel) * (width_ * height_ + 2 * uv_width_ * uv_height_);
2561*09537850SAkhilesh Sanikop source_buffer_.reset(new (std::nothrow) uint8_t[buffer_size]);
2562*09537850SAkhilesh Sanikop memset(source_buffer_.get(), 0, sizeof(source_buffer_[0]) * buffer_size);
2563*09537850SAkhilesh Sanikop dest_buffer_.reset(new (std::nothrow) uint8_t[buffer_size]);
2564*09537850SAkhilesh Sanikop memset(dest_buffer_.get(), 0, sizeof(dest_buffer_[0]) * buffer_size);
2565*09537850SAkhilesh Sanikop source_plane_y_ = source_buffer_.get();
2566*09537850SAkhilesh Sanikop source_plane_u_ = source_plane_y_ + y_stride_ * height_;
2567*09537850SAkhilesh Sanikop source_plane_v_ = source_plane_u_ + uv_stride_ * uv_height_;
2568*09537850SAkhilesh Sanikop dest_plane_y_ = dest_buffer_.get();
2569*09537850SAkhilesh Sanikop dest_plane_u_ = dest_plane_y_ + y_stride_ * height_;
2570*09537850SAkhilesh Sanikop dest_plane_v_ = dest_plane_u_ + uv_stride_ * uv_height_;
2571*09537850SAkhilesh Sanikop const int num_threads = GetParam();
2572*09537850SAkhilesh Sanikop thread_pool_ = ThreadPool::Create(num_threads);
2573*09537850SAkhilesh Sanikop }
2574*09537850SAkhilesh Sanikop
2575*09537850SAkhilesh Sanikop void TestSpeed(int num_runs);
2576*09537850SAkhilesh Sanikop
2577*09537850SAkhilesh Sanikop private:
2578*09537850SAkhilesh Sanikop const int width_ = 1920;
2579*09537850SAkhilesh Sanikop const int height_ = 1080;
2580*09537850SAkhilesh Sanikop const int subsampling_x_ = 1;
2581*09537850SAkhilesh Sanikop const int subsampling_y_ = 1;
2582*09537850SAkhilesh Sanikop int uv_width_ = 0;
2583*09537850SAkhilesh Sanikop int uv_height_ = 0;
2584*09537850SAkhilesh Sanikop int uv_stride_ = 0;
2585*09537850SAkhilesh Sanikop int y_stride_ = 0;
2586*09537850SAkhilesh Sanikop std::unique_ptr<uint8_t[]> source_buffer_;
2587*09537850SAkhilesh Sanikop std::unique_ptr<uint8_t[]> dest_buffer_;
2588*09537850SAkhilesh Sanikop const uint8_t* source_plane_y_ = nullptr;
2589*09537850SAkhilesh Sanikop const uint8_t* source_plane_u_ = nullptr;
2590*09537850SAkhilesh Sanikop const uint8_t* source_plane_v_ = nullptr;
2591*09537850SAkhilesh Sanikop uint8_t* dest_plane_y_ = nullptr;
2592*09537850SAkhilesh Sanikop uint8_t* dest_plane_u_ = nullptr;
2593*09537850SAkhilesh Sanikop uint8_t* dest_plane_v_ = nullptr;
2594*09537850SAkhilesh Sanikop std::unique_ptr<ThreadPool> thread_pool_;
2595*09537850SAkhilesh Sanikop };
2596*09537850SAkhilesh Sanikop
2597*09537850SAkhilesh Sanikop // Each run of the speed test adds film grain noise to 10 dummy frames. The
2598*09537850SAkhilesh Sanikop // film grain parameters for the 10 frames were generated with aomenc.
2599*09537850SAkhilesh Sanikop template <int bitdepth, typename Pixel>
TestSpeed(const int num_runs)2600*09537850SAkhilesh Sanikop void FilmGrainSpeedTest<bitdepth, Pixel>::TestSpeed(const int num_runs) {
2601*09537850SAkhilesh Sanikop const dsp::Dsp* dsp = GetDspTable(bitdepth);
2602*09537850SAkhilesh Sanikop if (dsp->film_grain.blend_noise_chroma[0] == nullptr ||
2603*09537850SAkhilesh Sanikop dsp->film_grain.blend_noise_luma == nullptr) {
2604*09537850SAkhilesh Sanikop return;
2605*09537850SAkhilesh Sanikop }
2606*09537850SAkhilesh Sanikop for (int k = 0; k < kNumFilmGrainTestParams; ++k) {
2607*09537850SAkhilesh Sanikop const FilmGrainParams& params = kFilmGrainParams[k];
2608*09537850SAkhilesh Sanikop const absl::Time start = absl::Now();
2609*09537850SAkhilesh Sanikop for (int i = 0; i < num_runs; ++i) {
2610*09537850SAkhilesh Sanikop FilmGrain<bitdepth> film_grain(params, /*is_monochrome=*/false,
2611*09537850SAkhilesh Sanikop /*color_matrix_is_identity=*/false,
2612*09537850SAkhilesh Sanikop subsampling_x_, subsampling_y_, width_,
2613*09537850SAkhilesh Sanikop height_, thread_pool_.get());
2614*09537850SAkhilesh Sanikop EXPECT_TRUE(film_grain.AddNoise(
2615*09537850SAkhilesh Sanikop source_plane_y_, y_stride_, source_plane_u_, source_plane_v_,
2616*09537850SAkhilesh Sanikop uv_stride_, dest_plane_y_, y_stride_, dest_plane_u_, dest_plane_v_,
2617*09537850SAkhilesh Sanikop uv_stride_));
2618*09537850SAkhilesh Sanikop }
2619*09537850SAkhilesh Sanikop const absl::Duration elapsed_time = absl::Now() - start;
2620*09537850SAkhilesh Sanikop const char* digest_luma = GetTestDigestLuma(bitdepth, k);
2621*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2622*09537850SAkhilesh Sanikop "FilmGrainSynthesisLuma",
2623*09537850SAkhilesh Sanikop absl::StrFormat("kFilmGrainParams[%d]", k).c_str(), digest_luma,
2624*09537850SAkhilesh Sanikop dest_plane_y_, y_stride_ * height_, elapsed_time);
2625*09537850SAkhilesh Sanikop const char* digest_chroma_u = GetTestDigestChromaU(bitdepth, k);
2626*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2627*09537850SAkhilesh Sanikop "FilmGrainSynthesisChromaU",
2628*09537850SAkhilesh Sanikop absl::StrFormat("kFilmGrainParams[%d]", k).c_str(), digest_chroma_u,
2629*09537850SAkhilesh Sanikop dest_plane_u_, uv_stride_ * uv_height_, elapsed_time);
2630*09537850SAkhilesh Sanikop const char* digest_chroma_v = GetTestDigestChromaV(bitdepth, k);
2631*09537850SAkhilesh Sanikop test_utils::CheckMd5Digest(
2632*09537850SAkhilesh Sanikop "FilmGrainSynthesisChromaV",
2633*09537850SAkhilesh Sanikop absl::StrFormat("kFilmGrainParams[%d]", k).c_str(), digest_chroma_v,
2634*09537850SAkhilesh Sanikop dest_plane_v_, uv_stride_ * uv_height_, elapsed_time);
2635*09537850SAkhilesh Sanikop }
2636*09537850SAkhilesh Sanikop }
2637*09537850SAkhilesh Sanikop
2638*09537850SAkhilesh Sanikop using FilmGrainSpeedTest8bpp = FilmGrainSpeedTest<8, uint8_t>;
2639*09537850SAkhilesh Sanikop
TEST_P(FilmGrainSpeedTest8bpp,MatchesOriginalOutput)2640*09537850SAkhilesh Sanikop TEST_P(FilmGrainSpeedTest8bpp, MatchesOriginalOutput) { TestSpeed(1); }
2641*09537850SAkhilesh Sanikop
TEST_P(FilmGrainSpeedTest8bpp,DISABLED_Speed)2642*09537850SAkhilesh Sanikop TEST_P(FilmGrainSpeedTest8bpp, DISABLED_Speed) { TestSpeed(kNumSpeedTests); }
2643*09537850SAkhilesh Sanikop
2644*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, FilmGrainSpeedTest8bpp, testing::Values(0, 3, 8));
2645*09537850SAkhilesh Sanikop
2646*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
2647*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, FilmGrainSpeedTest8bpp,
2648*09537850SAkhilesh Sanikop testing::Values(0, 3, 8));
2649*09537850SAkhilesh Sanikop #endif
2650*09537850SAkhilesh Sanikop
2651*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2652*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, FilmGrainSpeedTest8bpp,
2653*09537850SAkhilesh Sanikop testing::Values(0, 3, 8));
2654*09537850SAkhilesh Sanikop #endif
2655*09537850SAkhilesh Sanikop
2656*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
2657*09537850SAkhilesh Sanikop using FilmGrainSpeedTest10bpp = FilmGrainSpeedTest<10, uint16_t>;
2658*09537850SAkhilesh Sanikop
TEST_P(FilmGrainSpeedTest10bpp,MatchesOriginalOutput)2659*09537850SAkhilesh Sanikop TEST_P(FilmGrainSpeedTest10bpp, MatchesOriginalOutput) { TestSpeed(1); }
2660*09537850SAkhilesh Sanikop
TEST_P(FilmGrainSpeedTest10bpp,DISABLED_Speed)2661*09537850SAkhilesh Sanikop TEST_P(FilmGrainSpeedTest10bpp, DISABLED_Speed) { TestSpeed(kNumSpeedTests); }
2662*09537850SAkhilesh Sanikop
2663*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, FilmGrainSpeedTest10bpp, testing::Values(0, 3, 8));
2664*09537850SAkhilesh Sanikop
2665*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
2666*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, FilmGrainSpeedTest10bpp,
2667*09537850SAkhilesh Sanikop testing::Values(0, 3, 8));
2668*09537850SAkhilesh Sanikop #endif
2669*09537850SAkhilesh Sanikop
2670*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
2671*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, FilmGrainSpeedTest10bpp,
2672*09537850SAkhilesh Sanikop testing::Values(0, 3, 8));
2673*09537850SAkhilesh Sanikop #endif
2674*09537850SAkhilesh Sanikop
2675*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10
2676*09537850SAkhilesh Sanikop
2677*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
2678*09537850SAkhilesh Sanikop using FilmGrainSpeedTest12bpp = FilmGrainSpeedTest<12, uint16_t>;
2679*09537850SAkhilesh Sanikop
TEST_P(FilmGrainSpeedTest12bpp,MatchesOriginalOutput)2680*09537850SAkhilesh Sanikop TEST_P(FilmGrainSpeedTest12bpp, MatchesOriginalOutput) { TestSpeed(1); }
2681*09537850SAkhilesh Sanikop
TEST_P(FilmGrainSpeedTest12bpp,DISABLED_Speed)2682*09537850SAkhilesh Sanikop TEST_P(FilmGrainSpeedTest12bpp, DISABLED_Speed) { TestSpeed(kNumSpeedTests); }
2683*09537850SAkhilesh Sanikop
2684*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, FilmGrainSpeedTest12bpp, testing::Values(0, 3, 8));
2685*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH == 12
2686*09537850SAkhilesh Sanikop
2687*09537850SAkhilesh Sanikop } // namespace
2688*09537850SAkhilesh Sanikop } // namespace film_grain
2689*09537850SAkhilesh Sanikop } // namespace dsp
2690*09537850SAkhilesh Sanikop } // namespace libgav1
2691