• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 The libgav1 Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/dsp/intrapred_cfl.h"
16 
17 #include <algorithm>
18 #include <cassert>
19 #include <cstddef>
20 #include <cstdint>
21 #include <cstdlib>
22 #include <cstring>
23 
24 #include "src/dsp/constants.h"
25 #include "src/dsp/dsp.h"
26 #include "src/utils/common.h"
27 #include "src/utils/constants.h"
28 
29 namespace libgav1 {
30 namespace dsp {
31 namespace {
32 
33 constexpr TransformSize kTransformSizesLargerThan32x32[] = {
34     kTransformSize16x64, kTransformSize32x64, kTransformSize64x16,
35     kTransformSize64x32, kTransformSize64x64};
36 
37 //------------------------------------------------------------------------------
38 // CflIntraPredictor_C
39 
40 // |luma| can be within +/-(((1 << bitdepth) - 1) << 3), inclusive.
41 // |alpha| can be -16 to 16 (inclusive).
42 template <int block_width, int block_height, int bitdepth, typename Pixel>
CflIntraPredictor_C(void * LIBGAV1_RESTRICT const dest,ptrdiff_t stride,const int16_t luma[kCflLumaBufferStride][kCflLumaBufferStride],const int alpha)43 void CflIntraPredictor_C(
44     void* LIBGAV1_RESTRICT const dest, ptrdiff_t stride,
45     const int16_t luma[kCflLumaBufferStride][kCflLumaBufferStride],
46     const int alpha) {
47   auto* dst = static_cast<Pixel*>(dest);
48   const int dc = dst[0];
49   stride /= sizeof(Pixel);
50   const int max_value = (1 << bitdepth) - 1;
51   for (int y = 0; y < block_height; ++y) {
52     for (int x = 0; x < block_width; ++x) {
53       assert(luma[y][x] >= -(((1 << bitdepth) - 1) << 3));
54       assert(luma[y][x] <= ((1 << bitdepth) - 1) << 3);
55       dst[x] = Clip3(dc + RightShiftWithRoundingSigned(alpha * luma[y][x], 6),
56                      0, max_value);
57     }
58     dst += stride;
59   }
60 }
61 
62 //------------------------------------------------------------------------------
63 // CflSubsampler_C
64 
65 template <int block_width, int block_height, int bitdepth, typename Pixel,
66           int subsampling_x, int subsampling_y>
CflSubsampler_C(int16_t luma[kCflLumaBufferStride][kCflLumaBufferStride],const int max_luma_width,const int max_luma_height,const void * LIBGAV1_RESTRICT const source,ptrdiff_t stride)67 void CflSubsampler_C(int16_t luma[kCflLumaBufferStride][kCflLumaBufferStride],
68                      const int max_luma_width, const int max_luma_height,
69                      const void* LIBGAV1_RESTRICT const source,
70                      ptrdiff_t stride) {
71   assert(max_luma_width >= 4);
72   assert(max_luma_height >= 4);
73   const auto* src = static_cast<const Pixel*>(source);
74   stride /= sizeof(Pixel);
75   int sum = 0;
76   for (int y = 0; y < block_height; ++y) {
77     for (int x = 0; x < block_width; ++x) {
78       const ptrdiff_t luma_x =
79           std::min(x << subsampling_x, max_luma_width - (1 << subsampling_x));
80       const ptrdiff_t luma_x_next = luma_x + stride;
81       luma[y][x] =
82           (src[luma_x] + ((subsampling_x != 0) ? src[luma_x + 1] : 0) +
83            ((subsampling_y != 0) ? (src[luma_x_next] + src[luma_x_next + 1])
84                                  : 0))
85           << (3 - subsampling_x - subsampling_y);
86       sum += luma[y][x];
87     }
88     if ((y << subsampling_y) < (max_luma_height - (1 << subsampling_y))) {
89       src += stride << subsampling_y;
90     }
91   }
92   const int average = RightShiftWithRounding(
93       sum, FloorLog2(block_width) + FloorLog2(block_height));
94   for (int y = 0; y < block_height; ++y) {
95     for (int x = 0; x < block_width; ++x) {
96       luma[y][x] -= average;
97     }
98   }
99 }
100 
101 //------------------------------------------------------------------------------
102 
103 // Initializes dsp entries for kTransformSize|W|x|H|.
104 #define INIT_CFL_INTRAPREDICTOR_WxH(W, H, BITDEPTH, PIXEL)             \
105   dsp->cfl_intra_predictors[kTransformSize##W##x##H] =                 \
106       CflIntraPredictor_C<W, H, BITDEPTH, PIXEL>;                      \
107   dsp->cfl_subsamplers[kTransformSize##W##x##H][kSubsamplingType444] = \
108       CflSubsampler_C<W, H, BITDEPTH, PIXEL, 0, 0>;                    \
109   dsp->cfl_subsamplers[kTransformSize##W##x##H][kSubsamplingType422] = \
110       CflSubsampler_C<W, H, BITDEPTH, PIXEL, 1, 0>;                    \
111   dsp->cfl_subsamplers[kTransformSize##W##x##H][kSubsamplingType420] = \
112       CflSubsampler_C<W, H, BITDEPTH, PIXEL, 1, 1>
113 
114 #define INIT_CFL_INTRAPREDICTORS(BITDEPTH, PIXEL)       \
115   INIT_CFL_INTRAPREDICTOR_WxH(4, 4, BITDEPTH, PIXEL);   \
116   INIT_CFL_INTRAPREDICTOR_WxH(4, 8, BITDEPTH, PIXEL);   \
117   INIT_CFL_INTRAPREDICTOR_WxH(4, 16, BITDEPTH, PIXEL);  \
118   INIT_CFL_INTRAPREDICTOR_WxH(8, 4, BITDEPTH, PIXEL);   \
119   INIT_CFL_INTRAPREDICTOR_WxH(8, 8, BITDEPTH, PIXEL);   \
120   INIT_CFL_INTRAPREDICTOR_WxH(8, 16, BITDEPTH, PIXEL);  \
121   INIT_CFL_INTRAPREDICTOR_WxH(8, 32, BITDEPTH, PIXEL);  \
122   INIT_CFL_INTRAPREDICTOR_WxH(16, 4, BITDEPTH, PIXEL);  \
123   INIT_CFL_INTRAPREDICTOR_WxH(16, 8, BITDEPTH, PIXEL);  \
124   INIT_CFL_INTRAPREDICTOR_WxH(16, 16, BITDEPTH, PIXEL); \
125   INIT_CFL_INTRAPREDICTOR_WxH(16, 32, BITDEPTH, PIXEL); \
126   INIT_CFL_INTRAPREDICTOR_WxH(32, 8, BITDEPTH, PIXEL);  \
127   INIT_CFL_INTRAPREDICTOR_WxH(32, 16, BITDEPTH, PIXEL); \
128   INIT_CFL_INTRAPREDICTOR_WxH(32, 32, BITDEPTH, PIXEL)
129 
Init8bpp()130 void Init8bpp() {
131   Dsp* const dsp = dsp_internal::GetWritableDspTable(8);
132   assert(dsp != nullptr);
133 #if LIBGAV1_ENABLE_ALL_DSP_FUNCTIONS
134   INIT_CFL_INTRAPREDICTORS(8, uint8_t);
135 #else  // !LIBGAV1_ENABLE_ALL_DSP_FUNCTIONS
136   static_cast<void>(dsp);
137 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x4_CflIntraPredictor
138   dsp->cfl_intra_predictors[kTransformSize4x4] =
139       CflIntraPredictor_C<4, 4, 8, uint8_t>;
140 #endif
141 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x4_CflSubsampler444
142   dsp->cfl_subsamplers[kTransformSize4x4][kSubsamplingType444] =
143       CflSubsampler_C<4, 4, 8, uint8_t, 0, 0>;
144 #endif
145 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x4_CflSubsampler422
146   dsp->cfl_subsamplers[kTransformSize4x4][kSubsamplingType422] =
147       CflSubsampler_C<4, 4, 8, uint8_t, 1, 0>;
148 #endif
149 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x4_CflSubsampler420
150   dsp->cfl_subsamplers[kTransformSize4x4][kSubsamplingType420] =
151       CflSubsampler_C<4, 4, 8, uint8_t, 1, 1>;
152 #endif
153 
154 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x8_CflIntraPredictor
155   dsp->cfl_intra_predictors[kTransformSize4x8] =
156       CflIntraPredictor_C<4, 8, 8, uint8_t>;
157 #endif
158 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x8_CflSubsampler444
159   dsp->cfl_subsamplers[kTransformSize4x8][kSubsamplingType444] =
160       CflSubsampler_C<4, 8, 8, uint8_t, 0, 0>;
161 #endif
162 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x8_CflSubsampler422
163   dsp->cfl_subsamplers[kTransformSize4x8][kSubsamplingType422] =
164       CflSubsampler_C<4, 8, 8, uint8_t, 1, 0>;
165 #endif
166 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x8_CflSubsampler420
167   dsp->cfl_subsamplers[kTransformSize4x8][kSubsamplingType420] =
168       CflSubsampler_C<4, 8, 8, uint8_t, 1, 1>;
169 #endif
170 
171 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x16_CflIntraPredictor
172   dsp->cfl_intra_predictors[kTransformSize4x16] =
173       CflIntraPredictor_C<4, 16, 8, uint8_t>;
174 #endif
175 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x16_CflSubsampler444
176   dsp->cfl_subsamplers[kTransformSize4x16][kSubsamplingType444] =
177       CflSubsampler_C<4, 16, 8, uint8_t, 0, 0>;
178 #endif
179 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x16_CflSubsampler422
180   dsp->cfl_subsamplers[kTransformSize4x16][kSubsamplingType422] =
181       CflSubsampler_C<4, 16, 8, uint8_t, 1, 0>;
182 #endif
183 #ifndef LIBGAV1_Dsp8bpp_TransformSize4x16_CflSubsampler420
184   dsp->cfl_subsamplers[kTransformSize4x16][kSubsamplingType420] =
185       CflSubsampler_C<4, 16, 8, uint8_t, 1, 1>;
186 #endif
187 
188 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x4_CflIntraPredictor
189   dsp->cfl_intra_predictors[kTransformSize8x4] =
190       CflIntraPredictor_C<8, 4, 8, uint8_t>;
191 #endif
192 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x4_CflSubsampler444
193   dsp->cfl_subsamplers[kTransformSize8x4][kSubsamplingType444] =
194       CflSubsampler_C<8, 4, 8, uint8_t, 0, 0>;
195 #endif
196 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x4_CflSubsampler422
197   dsp->cfl_subsamplers[kTransformSize8x4][kSubsamplingType422] =
198       CflSubsampler_C<8, 4, 8, uint8_t, 1, 0>;
199 #endif
200 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x4_CflSubsampler420
201   dsp->cfl_subsamplers[kTransformSize8x4][kSubsamplingType420] =
202       CflSubsampler_C<8, 4, 8, uint8_t, 1, 1>;
203 #endif
204 
205 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x8_CflIntraPredictor
206   dsp->cfl_intra_predictors[kTransformSize8x8] =
207       CflIntraPredictor_C<8, 8, 8, uint8_t>;
208 #endif
209 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x8_CflSubsampler444
210   dsp->cfl_subsamplers[kTransformSize8x8][kSubsamplingType444] =
211       CflSubsampler_C<8, 8, 8, uint8_t, 0, 0>;
212 #endif
213 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x8_CflSubsampler422
214   dsp->cfl_subsamplers[kTransformSize8x8][kSubsamplingType422] =
215       CflSubsampler_C<8, 8, 8, uint8_t, 1, 0>;
216 #endif
217 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x8_CflSubsampler420
218   dsp->cfl_subsamplers[kTransformSize8x8][kSubsamplingType420] =
219       CflSubsampler_C<8, 8, 8, uint8_t, 1, 1>;
220 #endif
221 
222 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x16_CflIntraPredictor
223   dsp->cfl_intra_predictors[kTransformSize8x16] =
224       CflIntraPredictor_C<8, 16, 8, uint8_t>;
225 #endif
226 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x16_CflSubsampler444
227   dsp->cfl_subsamplers[kTransformSize8x16][kSubsamplingType444] =
228       CflSubsampler_C<8, 16, 8, uint8_t, 0, 0>;
229 #endif
230 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x16_CflSubsampler422
231   dsp->cfl_subsamplers[kTransformSize8x16][kSubsamplingType422] =
232       CflSubsampler_C<8, 16, 8, uint8_t, 1, 0>;
233 #endif
234 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x16_CflSubsampler420
235   dsp->cfl_subsamplers[kTransformSize8x16][kSubsamplingType420] =
236       CflSubsampler_C<8, 16, 8, uint8_t, 1, 1>;
237 #endif
238 
239 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x32_CflIntraPredictor
240   dsp->cfl_intra_predictors[kTransformSize8x32] =
241       CflIntraPredictor_C<8, 32, 8, uint8_t>;
242 #endif
243 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x32_CflSubsampler444
244   dsp->cfl_subsamplers[kTransformSize8x32][kSubsamplingType444] =
245       CflSubsampler_C<8, 32, 8, uint8_t, 0, 0>;
246 #endif
247 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x32_CflSubsampler422
248   dsp->cfl_subsamplers[kTransformSize8x32][kSubsamplingType422] =
249       CflSubsampler_C<8, 32, 8, uint8_t, 1, 0>;
250 #endif
251 #ifndef LIBGAV1_Dsp8bpp_TransformSize8x32_CflSubsampler420
252   dsp->cfl_subsamplers[kTransformSize8x32][kSubsamplingType420] =
253       CflSubsampler_C<8, 32, 8, uint8_t, 1, 1>;
254 #endif
255 
256 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x4_CflIntraPredictor
257   dsp->cfl_intra_predictors[kTransformSize16x4] =
258       CflIntraPredictor_C<16, 4, 8, uint8_t>;
259 #endif
260 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x4_CflSubsampler444
261   dsp->cfl_subsamplers[kTransformSize16x4][kSubsamplingType444] =
262       CflSubsampler_C<16, 4, 8, uint8_t, 0, 0>;
263 #endif
264 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x4_CflSubsampler422
265   dsp->cfl_subsamplers[kTransformSize16x4][kSubsamplingType422] =
266       CflSubsampler_C<16, 4, 8, uint8_t, 1, 0>;
267 #endif
268 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x4_CflSubsampler420
269   dsp->cfl_subsamplers[kTransformSize16x4][kSubsamplingType420] =
270       CflSubsampler_C<16, 4, 8, uint8_t, 1, 1>;
271 #endif
272 
273 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x8_CflIntraPredictor
274   dsp->cfl_intra_predictors[kTransformSize16x8] =
275       CflIntraPredictor_C<16, 8, 8, uint8_t>;
276 #endif
277 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x8_CflSubsampler444
278   dsp->cfl_subsamplers[kTransformSize16x8][kSubsamplingType444] =
279       CflSubsampler_C<16, 8, 8, uint8_t, 0, 0>;
280 #endif
281 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x8_CflSubsampler422
282   dsp->cfl_subsamplers[kTransformSize16x8][kSubsamplingType422] =
283       CflSubsampler_C<16, 8, 8, uint8_t, 1, 0>;
284 #endif
285 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x8_CflSubsampler420
286   dsp->cfl_subsamplers[kTransformSize16x8][kSubsamplingType420] =
287       CflSubsampler_C<16, 8, 8, uint8_t, 1, 1>;
288 #endif
289 
290 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x16_CflIntraPredictor
291   dsp->cfl_intra_predictors[kTransformSize16x16] =
292       CflIntraPredictor_C<16, 16, 8, uint8_t>;
293 #endif
294 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x16_CflSubsampler444
295   dsp->cfl_subsamplers[kTransformSize16x16][kSubsamplingType444] =
296       CflSubsampler_C<16, 16, 8, uint8_t, 0, 0>;
297 #endif
298 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x16_CflSubsampler422
299   dsp->cfl_subsamplers[kTransformSize16x16][kSubsamplingType422] =
300       CflSubsampler_C<16, 16, 8, uint8_t, 1, 0>;
301 #endif
302 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x16_CflSubsampler420
303   dsp->cfl_subsamplers[kTransformSize16x16][kSubsamplingType420] =
304       CflSubsampler_C<16, 16, 8, uint8_t, 1, 1>;
305 #endif
306 
307 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x32_CflIntraPredictor
308   dsp->cfl_intra_predictors[kTransformSize16x32] =
309       CflIntraPredictor_C<16, 32, 8, uint8_t>;
310 #endif
311 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x32_CflSubsampler444
312   dsp->cfl_subsamplers[kTransformSize16x32][kSubsamplingType444] =
313       CflSubsampler_C<16, 32, 8, uint8_t, 0, 0>;
314 #endif
315 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x32_CflSubsampler422
316   dsp->cfl_subsamplers[kTransformSize16x32][kSubsamplingType422] =
317       CflSubsampler_C<16, 32, 8, uint8_t, 1, 0>;
318 #endif
319 #ifndef LIBGAV1_Dsp8bpp_TransformSize16x32_CflSubsampler420
320   dsp->cfl_subsamplers[kTransformSize16x32][kSubsamplingType420] =
321       CflSubsampler_C<16, 32, 8, uint8_t, 1, 1>;
322 #endif
323 
324 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x8_CflIntraPredictor
325   dsp->cfl_intra_predictors[kTransformSize32x8] =
326       CflIntraPredictor_C<32, 8, 8, uint8_t>;
327 #endif
328 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x8_CflSubsampler444
329   dsp->cfl_subsamplers[kTransformSize32x8][kSubsamplingType444] =
330       CflSubsampler_C<32, 8, 8, uint8_t, 0, 0>;
331 #endif
332 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x8_CflSubsampler422
333   dsp->cfl_subsamplers[kTransformSize32x8][kSubsamplingType422] =
334       CflSubsampler_C<32, 8, 8, uint8_t, 1, 0>;
335 #endif
336 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x8_CflSubsampler420
337   dsp->cfl_subsamplers[kTransformSize32x8][kSubsamplingType420] =
338       CflSubsampler_C<32, 8, 8, uint8_t, 1, 1>;
339 #endif
340 
341 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x16_CflIntraPredictor
342   dsp->cfl_intra_predictors[kTransformSize32x16] =
343       CflIntraPredictor_C<32, 16, 8, uint8_t>;
344 #endif
345 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x16_CflSubsampler444
346   dsp->cfl_subsamplers[kTransformSize32x16][kSubsamplingType444] =
347       CflSubsampler_C<32, 16, 8, uint8_t, 0, 0>;
348 #endif
349 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x16_CflSubsampler422
350   dsp->cfl_subsamplers[kTransformSize32x16][kSubsamplingType422] =
351       CflSubsampler_C<32, 16, 8, uint8_t, 1, 0>;
352 #endif
353 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x16_CflSubsampler420
354   dsp->cfl_subsamplers[kTransformSize32x16][kSubsamplingType420] =
355       CflSubsampler_C<32, 16, 8, uint8_t, 1, 1>;
356 #endif
357 
358 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x32_CflIntraPredictor
359   dsp->cfl_intra_predictors[kTransformSize32x32] =
360       CflIntraPredictor_C<32, 32, 8, uint8_t>;
361 #endif
362 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x32_CflSubsampler444
363   dsp->cfl_subsamplers[kTransformSize32x32][kSubsamplingType444] =
364       CflSubsampler_C<32, 32, 8, uint8_t, 0, 0>;
365 #endif
366 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x32_CflSubsampler422
367   dsp->cfl_subsamplers[kTransformSize32x32][kSubsamplingType422] =
368       CflSubsampler_C<32, 32, 8, uint8_t, 1, 0>;
369 #endif
370 #ifndef LIBGAV1_Dsp8bpp_TransformSize32x32_CflSubsampler420
371   dsp->cfl_subsamplers[kTransformSize32x32][kSubsamplingType420] =
372       CflSubsampler_C<32, 32, 8, uint8_t, 1, 1>;
373 #endif
374 #endif  // LIBGAV1_ENABLE_ALL_DSP_FUNCTIONS
375   // Cfl predictors are available only for transform sizes with max(width,
376   // height) <= 32. Set all others to nullptr.
377   for (const auto i : kTransformSizesLargerThan32x32) {
378     dsp->cfl_intra_predictors[i] = nullptr;
379     for (int j = 0; j < kNumSubsamplingTypes; ++j) {
380       dsp->cfl_subsamplers[i][j] = nullptr;
381     }
382   }
383 }  // NOLINT(readability/fn_size)
384 
385 #if LIBGAV1_MAX_BITDEPTH >= 10
Init10bpp()386 void Init10bpp() {
387   Dsp* const dsp = dsp_internal::GetWritableDspTable(10);
388   assert(dsp != nullptr);
389 #if LIBGAV1_ENABLE_ALL_DSP_FUNCTIONS
390   INIT_CFL_INTRAPREDICTORS(10, uint16_t);
391 #else  // !LIBGAV1_ENABLE_ALL_DSP_FUNCTIONS
392 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x4_CflIntraPredictor
393   dsp->cfl_intra_predictors[kTransformSize4x4] =
394       CflIntraPredictor_C<4, 4, 10, uint16_t>;
395 #endif
396 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x4_CflSubsampler444
397   dsp->cfl_subsamplers[kTransformSize4x4][kSubsamplingType444] =
398       CflSubsampler_C<4, 4, 10, uint16_t, 0, 0>;
399 #endif
400 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x4_CflSubsampler422
401   dsp->cfl_subsamplers[kTransformSize4x4][kSubsamplingType422] =
402       CflSubsampler_C<4, 4, 10, uint16_t, 1, 0>;
403 #endif
404 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x4_CflSubsampler420
405   dsp->cfl_subsamplers[kTransformSize4x4][kSubsamplingType420] =
406       CflSubsampler_C<4, 4, 10, uint16_t, 1, 1>;
407 #endif
408 
409 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x8_CflIntraPredictor
410   dsp->cfl_intra_predictors[kTransformSize4x8] =
411       CflIntraPredictor_C<4, 8, 10, uint16_t>;
412 #endif
413 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x8_CflSubsampler444
414   dsp->cfl_subsamplers[kTransformSize4x8][kSubsamplingType444] =
415       CflSubsampler_C<4, 8, 10, uint16_t, 0, 0>;
416 #endif
417 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x8_CflSubsampler422
418   dsp->cfl_subsamplers[kTransformSize4x8][kSubsamplingType422] =
419       CflSubsampler_C<4, 8, 10, uint16_t, 1, 0>;
420 #endif
421 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x8_CflSubsampler420
422   dsp->cfl_subsamplers[kTransformSize4x8][kSubsamplingType420] =
423       CflSubsampler_C<4, 8, 10, uint16_t, 1, 1>;
424 #endif
425 
426 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x16_CflIntraPredictor
427   dsp->cfl_intra_predictors[kTransformSize4x16] =
428       CflIntraPredictor_C<4, 16, 10, uint16_t>;
429 #endif
430 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x16_CflSubsampler444
431   dsp->cfl_subsamplers[kTransformSize4x16][kSubsamplingType444] =
432       CflSubsampler_C<4, 16, 10, uint16_t, 0, 0>;
433 #endif
434 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x16_CflSubsampler422
435   dsp->cfl_subsamplers[kTransformSize4x16][kSubsamplingType422] =
436       CflSubsampler_C<4, 16, 10, uint16_t, 1, 0>;
437 #endif
438 #ifndef LIBGAV1_Dsp10bpp_TransformSize4x16_CflSubsampler420
439   dsp->cfl_subsamplers[kTransformSize4x16][kSubsamplingType420] =
440       CflSubsampler_C<4, 16, 10, uint16_t, 1, 1>;
441 #endif
442 
443 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x4_CflIntraPredictor
444   dsp->cfl_intra_predictors[kTransformSize8x4] =
445       CflIntraPredictor_C<8, 4, 10, uint16_t>;
446 #endif
447 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x4_CflSubsampler444
448   dsp->cfl_subsamplers[kTransformSize8x4][kSubsamplingType444] =
449       CflSubsampler_C<8, 4, 10, uint16_t, 0, 0>;
450 #endif
451 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x4_CflSubsampler422
452   dsp->cfl_subsamplers[kTransformSize8x4][kSubsamplingType422] =
453       CflSubsampler_C<8, 4, 10, uint16_t, 1, 0>;
454 #endif
455 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x4_CflSubsampler420
456   dsp->cfl_subsamplers[kTransformSize8x4][kSubsamplingType420] =
457       CflSubsampler_C<8, 4, 10, uint16_t, 1, 1>;
458 #endif
459 
460 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x8_CflIntraPredictor
461   dsp->cfl_intra_predictors[kTransformSize8x8] =
462       CflIntraPredictor_C<8, 8, 10, uint16_t>;
463 #endif
464 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x8_CflSubsampler444
465   dsp->cfl_subsamplers[kTransformSize8x8][kSubsamplingType444] =
466       CflSubsampler_C<8, 8, 10, uint16_t, 0, 0>;
467 #endif
468 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x8_CflSubsampler422
469   dsp->cfl_subsamplers[kTransformSize8x8][kSubsamplingType422] =
470       CflSubsampler_C<8, 8, 10, uint16_t, 1, 0>;
471 #endif
472 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x8_CflSubsampler420
473   dsp->cfl_subsamplers[kTransformSize8x8][kSubsamplingType420] =
474       CflSubsampler_C<8, 8, 10, uint16_t, 1, 1>;
475 #endif
476 
477 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x16_CflIntraPredictor
478   dsp->cfl_intra_predictors[kTransformSize8x16] =
479       CflIntraPredictor_C<8, 16, 10, uint16_t>;
480 #endif
481 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x16_CflSubsampler444
482   dsp->cfl_subsamplers[kTransformSize8x16][kSubsamplingType444] =
483       CflSubsampler_C<8, 16, 10, uint16_t, 0, 0>;
484 #endif
485 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x16_CflSubsampler422
486   dsp->cfl_subsamplers[kTransformSize8x16][kSubsamplingType422] =
487       CflSubsampler_C<8, 16, 10, uint16_t, 1, 0>;
488 #endif
489 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x16_CflSubsampler420
490   dsp->cfl_subsamplers[kTransformSize8x16][kSubsamplingType420] =
491       CflSubsampler_C<8, 16, 10, uint16_t, 1, 1>;
492 #endif
493 
494 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x32_CflIntraPredictor
495   dsp->cfl_intra_predictors[kTransformSize8x32] =
496       CflIntraPredictor_C<8, 32, 10, uint16_t>;
497 #endif
498 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x32_CflSubsampler444
499   dsp->cfl_subsamplers[kTransformSize8x32][kSubsamplingType444] =
500       CflSubsampler_C<8, 32, 10, uint16_t, 0, 0>;
501 #endif
502 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x32_CflSubsampler422
503   dsp->cfl_subsamplers[kTransformSize8x32][kSubsamplingType422] =
504       CflSubsampler_C<8, 32, 10, uint16_t, 1, 0>;
505 #endif
506 #ifndef LIBGAV1_Dsp10bpp_TransformSize8x32_CflSubsampler420
507   dsp->cfl_subsamplers[kTransformSize8x32][kSubsamplingType420] =
508       CflSubsampler_C<8, 32, 10, uint16_t, 1, 1>;
509 #endif
510 
511 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x4_CflIntraPredictor
512   dsp->cfl_intra_predictors[kTransformSize16x4] =
513       CflIntraPredictor_C<16, 4, 10, uint16_t>;
514 #endif
515 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x4_CflSubsampler444
516   dsp->cfl_subsamplers[kTransformSize16x4][kSubsamplingType444] =
517       CflSubsampler_C<16, 4, 10, uint16_t, 0, 0>;
518 #endif
519 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x4_CflSubsampler422
520   dsp->cfl_subsamplers[kTransformSize16x4][kSubsamplingType422] =
521       CflSubsampler_C<16, 4, 10, uint16_t, 1, 0>;
522 #endif
523 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x4_CflSubsampler420
524   dsp->cfl_subsamplers[kTransformSize16x4][kSubsamplingType420] =
525       CflSubsampler_C<16, 4, 10, uint16_t, 1, 1>;
526 #endif
527 
528 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x8_CflIntraPredictor
529   dsp->cfl_intra_predictors[kTransformSize16x8] =
530       CflIntraPredictor_C<16, 8, 10, uint16_t>;
531 #endif
532 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x8_CflSubsampler444
533   dsp->cfl_subsamplers[kTransformSize16x8][kSubsamplingType444] =
534       CflSubsampler_C<16, 8, 10, uint16_t, 0, 0>;
535 #endif
536 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x8_CflSubsampler422
537   dsp->cfl_subsamplers[kTransformSize16x8][kSubsamplingType422] =
538       CflSubsampler_C<16, 8, 10, uint16_t, 1, 0>;
539 #endif
540 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x8_CflSubsampler420
541   dsp->cfl_subsamplers[kTransformSize16x8][kSubsamplingType420] =
542       CflSubsampler_C<16, 8, 10, uint16_t, 1, 1>;
543 #endif
544 
545 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x16_CflIntraPredictor
546   dsp->cfl_intra_predictors[kTransformSize16x16] =
547       CflIntraPredictor_C<16, 16, 10, uint16_t>;
548 #endif
549 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x16_CflSubsampler444
550   dsp->cfl_subsamplers[kTransformSize16x16][kSubsamplingType444] =
551       CflSubsampler_C<16, 16, 10, uint16_t, 0, 0>;
552 #endif
553 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x16_CflSubsampler422
554   dsp->cfl_subsamplers[kTransformSize16x16][kSubsamplingType422] =
555       CflSubsampler_C<16, 16, 10, uint16_t, 1, 0>;
556 #endif
557 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x16_CflSubsampler420
558   dsp->cfl_subsamplers[kTransformSize16x16][kSubsamplingType420] =
559       CflSubsampler_C<16, 16, 10, uint16_t, 1, 1>;
560 #endif
561 
562 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x32_CflIntraPredictor
563   dsp->cfl_intra_predictors[kTransformSize16x32] =
564       CflIntraPredictor_C<16, 32, 10, uint16_t>;
565 #endif
566 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x32_CflSubsampler444
567   dsp->cfl_subsamplers[kTransformSize16x32][kSubsamplingType444] =
568       CflSubsampler_C<16, 32, 10, uint16_t, 0, 0>;
569 #endif
570 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x32_CflSubsampler422
571   dsp->cfl_subsamplers[kTransformSize16x32][kSubsamplingType422] =
572       CflSubsampler_C<16, 32, 10, uint16_t, 1, 0>;
573 #endif
574 #ifndef LIBGAV1_Dsp10bpp_TransformSize16x32_CflSubsampler420
575   dsp->cfl_subsamplers[kTransformSize16x32][kSubsamplingType420] =
576       CflSubsampler_C<16, 32, 10, uint16_t, 1, 1>;
577 #endif
578 
579 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x8_CflIntraPredictor
580   dsp->cfl_intra_predictors[kTransformSize32x8] =
581       CflIntraPredictor_C<32, 8, 10, uint16_t>;
582 #endif
583 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x8_CflSubsampler444
584   dsp->cfl_subsamplers[kTransformSize32x8][kSubsamplingType444] =
585       CflSubsampler_C<32, 8, 10, uint16_t, 0, 0>;
586 #endif
587 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x8_CflSubsampler422
588   dsp->cfl_subsamplers[kTransformSize32x8][kSubsamplingType422] =
589       CflSubsampler_C<32, 8, 10, uint16_t, 1, 0>;
590 #endif
591 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x8_CflSubsampler420
592   dsp->cfl_subsamplers[kTransformSize32x8][kSubsamplingType420] =
593       CflSubsampler_C<32, 8, 10, uint16_t, 1, 1>;
594 #endif
595 
596 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x16_CflIntraPredictor
597   dsp->cfl_intra_predictors[kTransformSize32x16] =
598       CflIntraPredictor_C<32, 16, 10, uint16_t>;
599 #endif
600 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x16_CflSubsampler444
601   dsp->cfl_subsamplers[kTransformSize32x16][kSubsamplingType444] =
602       CflSubsampler_C<32, 16, 10, uint16_t, 0, 0>;
603 #endif
604 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x16_CflSubsampler422
605   dsp->cfl_subsamplers[kTransformSize32x16][kSubsamplingType422] =
606       CflSubsampler_C<32, 16, 10, uint16_t, 1, 0>;
607 #endif
608 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x16_CflSubsampler420
609   dsp->cfl_subsamplers[kTransformSize32x16][kSubsamplingType420] =
610       CflSubsampler_C<32, 16, 10, uint16_t, 1, 1>;
611 #endif
612 
613 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x32_CflIntraPredictor
614   dsp->cfl_intra_predictors[kTransformSize32x32] =
615       CflIntraPredictor_C<32, 32, 10, uint16_t>;
616 #endif
617 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x32_CflSubsampler444
618   dsp->cfl_subsamplers[kTransformSize32x32][kSubsamplingType444] =
619       CflSubsampler_C<32, 32, 10, uint16_t, 0, 0>;
620 #endif
621 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x32_CflSubsampler422
622   dsp->cfl_subsamplers[kTransformSize32x32][kSubsamplingType422] =
623       CflSubsampler_C<32, 32, 10, uint16_t, 1, 0>;
624 #endif
625 #ifndef LIBGAV1_Dsp10bpp_TransformSize32x32_CflSubsampler420
626   dsp->cfl_subsamplers[kTransformSize32x32][kSubsamplingType420] =
627       CflSubsampler_C<32, 32, 10, uint16_t, 1, 1>;
628 #endif
629 
630 #endif  // LIBGAV1_ENABLE_ALL_DSP_FUNCTIONS
631   // Cfl predictors are available only for transform sizes with max(width,
632   // height) <= 32. Set all others to nullptr.
633   for (const auto i : kTransformSizesLargerThan32x32) {
634     dsp->cfl_intra_predictors[i] = nullptr;
635     for (int j = 0; j < kNumSubsamplingTypes; ++j) {
636       dsp->cfl_subsamplers[i][j] = nullptr;
637     }
638   }
639 }  // NOLINT(readability/fn_size)
640 #endif  // LIBGAV1_MAX_BITDEPTH >= 10
641 
642 #undef INIT_CFL_INTRAPREDICTOR_WxH
643 #undef INIT_CFL_INTRAPREDICTORS
644 
645 }  // namespace
646 
IntraPredCflInit_C()647 void IntraPredCflInit_C() {
648   Init8bpp();
649 #if LIBGAV1_MAX_BITDEPTH >= 10
650   Init10bpp();
651 #endif
652 }
653 
654 }  // namespace dsp
655 }  // namespace libgav1
656