Coverage Report

Created: 2026-08-13 07:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/dav1d/src/filmgrain_tmpl.c
Line
Count
Source
1
/*
2
 * Copyright © 2018, Niklas Haas
3
 * Copyright © 2018, VideoLAN and dav1d authors
4
 * Copyright © 2018, Two Orioles, LLC
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions are met:
9
 *
10
 * 1. Redistributions of source code must retain the above copyright notice, this
11
 *    list of conditions and the following disclaimer.
12
 *
13
 * 2. Redistributions in binary form must reproduce the above copyright notice,
14
 *    this list of conditions and the following disclaimer in the documentation
15
 *    and/or other materials provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
21
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
29
#include "common/attributes.h"
30
#include "common/intops.h"
31
32
#include "src/filmgrain.h"
33
#include "src/tables.h"
34
35
1.29k
#define SUB_GRAIN_WIDTH 44
36
1.13k
#define SUB_GRAIN_HEIGHT 38
37
38
36.4M
static inline int get_random_number(const int bits, unsigned *const state) {
39
36.4M
    const int r = *state;
40
36.4M
    unsigned bit = ((r >> 0) ^ (r >> 1) ^ (r >> 3) ^ (r >> 12)) & 1;
41
36.4M
    *state = (r >> 1) | (bit << 15);
42
43
36.4M
    return (*state >> (16 - bits)) & ((1 << bits) - 1);
44
36.4M
}
45
46
104M
static inline int round2(const int x, const uint64_t shift) {
47
104M
    return (x + ((1 << shift) >> 1)) >> shift;
48
104M
}
49
50
static void generate_grain_y_c(entry buf[][GRAIN_WIDTH],
51
                               const Dav1dFilmGrainData *const data
52
                               HIGHBD_DECL_SUFFIX)
53
2.91k
{
54
2.91k
    const int bitdepth_min_8 = bitdepth_from_max(bitdepth_max) - 8;
55
2.91k
    unsigned seed = data->seed;
56
2.91k
    const int shift = 4 - bitdepth_min_8 + data->grain_scale_shift;
57
2.91k
    const int grain_ctr = 128 << bitdepth_min_8;
58
2.91k
    const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
59
60
215k
    for (int y = 0; y < GRAIN_HEIGHT; y++) {
61
17.6M
        for (int x = 0; x < GRAIN_WIDTH; x++) {
62
17.4M
            const int value = get_random_number(11, &seed);
63
17.4M
            buf[y][x] = round2(dav1d_gaussian_sequence[ value ], shift);
64
17.4M
        }
65
212k
    }
66
67
2.91k
    const int ar_pad = 3;
68
2.91k
    const int ar_lag = data->ar_coeff_lag;
69
70
206k
    for (int y = ar_pad; y < GRAIN_HEIGHT; y++) {
71
15.6M
        for (int x = ar_pad; x < GRAIN_WIDTH - ar_pad; x++) {
72
15.4M
            const int8_t *coeff = data->ar_coeffs_y;
73
15.4M
            int sum = 0;
74
46.6M
            for (int dy = -ar_lag; dy <= 0; dy++) {
75
122M
                for (int dx = -ar_lag; dx <= ar_lag; dx++) {
76
106M
                    if (!dx && !dy)
77
15.4M
                        break;
78
91.5M
                    sum += *(coeff++) * buf[y + dy][x + dx];
79
91.5M
                }
80
31.2M
            }
81
82
15.4M
            const int grain = buf[y][x] + round2(sum, data->ar_coeff_shift);
83
15.4M
            buf[y][x] = iclip(grain, grain_min, grain_max);
84
15.4M
        }
85
203k
    }
86
2.91k
}
87
88
static NOINLINE void
89
generate_grain_uv_c(entry buf[][GRAIN_WIDTH],
90
                    const entry buf_y[][GRAIN_WIDTH],
91
                    const Dav1dFilmGrainData *const data, const intptr_t uv,
92
                    const int subx, const int suby HIGHBD_DECL_SUFFIX)
93
4.03k
{
94
4.03k
    const int bitdepth_min_8 = bitdepth_from_max(bitdepth_max) - 8;
95
4.03k
    unsigned seed = data->seed ^ (uv ? 0x49d8 : 0xb524);
96
4.03k
    const int shift = 4 - bitdepth_min_8 + data->grain_scale_shift;
97
4.03k
    const int grain_ctr = 128 << bitdepth_min_8;
98
4.03k
    const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
99
100
4.03k
    const int chromaW = subx ? SUB_GRAIN_WIDTH  : GRAIN_WIDTH;
101
4.03k
    const int chromaH = suby ? SUB_GRAIN_HEIGHT : GRAIN_HEIGHT;
102
103
258k
    for (int y = 0; y < chromaH; y++) {
104
19.0M
        for (int x = 0; x < chromaW; x++) {
105
18.7M
            const int value = get_random_number(11, &seed);
106
18.7M
            buf[y][x] = round2(dav1d_gaussian_sequence[ value ], shift);
107
18.7M
        }
108
254k
    }
109
110
4.03k
    const int ar_pad = 3;
111
4.03k
    const int ar_lag = data->ar_coeff_lag;
112
113
246k
    for (int y = ar_pad; y < chromaH; y++) {
114
16.7M
        for (int x = ar_pad; x < chromaW - ar_pad; x++) {
115
16.4M
            const int8_t *coeff = data->ar_coeffs_uv[uv];
116
16.4M
            int sum = 0;
117
50.5M
            for (int dy = -ar_lag; dy <= 0; dy++) {
118
133M
                for (int dx = -ar_lag; dx <= ar_lag; dx++) {
119
                    // For the final (current) pixel, we need to add in the
120
                    // contribution from the luma grain texture
121
115M
                    if (!dx && !dy) {
122
16.4M
                        if (!data->num_y_points)
123
8.17M
                            break;
124
8.30M
                        int luma = 0;
125
8.30M
                        const int lumaX = ((x - ar_pad) << subx) + ar_pad;
126
8.30M
                        const int lumaY = ((y - ar_pad) << suby) + ar_pad;
127
17.9M
                        for (int i = 0; i <= suby; i++) {
128
22.0M
                            for (int j = 0; j <= subx; j++) {
129
12.3M
                                luma += buf_y[lumaY + i][lumaX + j];
130
12.3M
                            }
131
9.60M
                        }
132
8.30M
                        luma = round2(luma, subx + suby);
133
8.30M
                        sum += luma * (*coeff);
134
8.30M
                        break;
135
16.4M
                    }
136
137
99.1M
                    sum += *(coeff++) * buf[y + dy][x + dx];
138
99.1M
                }
139
34.0M
            }
140
141
16.4M
            const int grain = buf[y][x] + round2(sum, data->ar_coeff_shift);
142
16.4M
            buf[y][x] = iclip(grain, grain_min, grain_max);
143
16.4M
        }
144
242k
    }
145
4.03k
}
146
147
#define gnuv_ss_fn(nm, ss_x, ss_y) \
148
4.03k
static decl_generate_grain_uv_fn(generate_grain_uv_##nm##_c) { \
149
4.03k
    generate_grain_uv_c(buf, buf_y, data, uv, ss_x, ss_y HIGHBD_TAIL_SUFFIX); \
150
4.03k
}
filmgrain_tmpl.c:generate_grain_uv_420_c
Line
Count
Source
148
1.13k
static decl_generate_grain_uv_fn(generate_grain_uv_##nm##_c) { \
149
1.13k
    generate_grain_uv_c(buf, buf_y, data, uv, ss_x, ss_y HIGHBD_TAIL_SUFFIX); \
150
1.13k
}
filmgrain_tmpl.c:generate_grain_uv_422_c
Line
Count
Source
148
162
static decl_generate_grain_uv_fn(generate_grain_uv_##nm##_c) { \
149
162
    generate_grain_uv_c(buf, buf_y, data, uv, ss_x, ss_y HIGHBD_TAIL_SUFFIX); \
150
162
}
filmgrain_tmpl.c:generate_grain_uv_444_c
Line
Count
Source
148
2.73k
static decl_generate_grain_uv_fn(generate_grain_uv_##nm##_c) { \
149
2.73k
    generate_grain_uv_c(buf, buf_y, data, uv, ss_x, ss_y HIGHBD_TAIL_SUFFIX); \
150
2.73k
}
151
152
gnuv_ss_fn(420, 1, 1);
153
gnuv_ss_fn(422, 1, 0);
154
gnuv_ss_fn(444, 0, 0);
155
156
// samples from the correct block of a grain LUT, while taking into account the
157
// offsets provided by the offsets cache
158
static inline entry sample_lut(const entry grain_lut[][GRAIN_WIDTH],
159
                               const int offsets[2][2], const int subx, const int suby,
160
                               const int bx, const int by, const int x, const int y)
161
28.7M
{
162
28.7M
    const int randval = offsets[bx][by];
163
28.7M
    const int offx = 3 + (2 >> subx) * (3 + (randval >> 4));
164
28.7M
    const int offy = 3 + (2 >> suby) * (3 + (randval & 0xF));
165
28.7M
    return grain_lut[offy + y + (FG_BLOCK_SIZE >> suby) * by]
166
28.7M
                    [offx + x + (FG_BLOCK_SIZE >> subx) * bx];
167
28.7M
}
168
169
static void fgy_32x32xn_c(pixel *const dst_row, const pixel *const src_row,
170
                          const ptrdiff_t stride,
171
                          const Dav1dFilmGrainData *const data, const size_t pw,
172
                          const uint8_t scaling[SCALING_SIZE],
173
                          const entry grain_lut[][GRAIN_WIDTH],
174
                          const int bh, const int row_num HIGHBD_DECL_SUFFIX)
175
24.9k
{
176
24.9k
    const int rows = 1 + (data->overlap_flag && row_num > 0);
177
24.9k
    const int bitdepth_min_8 = bitdepth_from_max(bitdepth_max) - 8;
178
24.9k
    const int grain_ctr = 128 << bitdepth_min_8;
179
24.9k
    const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
180
181
24.9k
    int min_value, max_value;
182
24.9k
    if (data->clip_to_restricted_range) {
183
16.9k
        min_value = 16 << bitdepth_min_8;
184
16.9k
        max_value = 235 << bitdepth_min_8;
185
16.9k
    } else {
186
7.99k
        min_value = 0;
187
7.99k
        max_value = BITDEPTH_MAX;
188
7.99k
    }
189
190
    // seed[0] contains the current row, seed[1] contains the previous
191
24.9k
    unsigned seed[2];
192
68.6k
    for (int i = 0; i < rows; i++) {
193
43.6k
        seed[i] = data->seed;
194
43.6k
        seed[i] ^= (((row_num - i) * 37  + 178) & 0xFF) << 8;
195
43.6k
        seed[i] ^= (((row_num - i) * 173 + 105) & 0xFF);
196
43.6k
    }
197
198
24.9k
    assert(stride % (FG_BLOCK_SIZE * sizeof(pixel)) == 0);
199
200
24.9k
    int offsets[2 /* col offset */][2 /* row offset */];
201
202
    // process this row in FG_BLOCK_SIZE^2 blocks
203
85.4k
    for (unsigned bx = 0; bx < pw; bx += FG_BLOCK_SIZE) {
204
60.4k
        const int bw = imin(FG_BLOCK_SIZE, (int) pw - bx);
205
206
60.4k
        if (data->overlap_flag && bx) {
207
            // shift previous offsets left
208
82.2k
            for (int i = 0; i < rows; i++)
209
53.6k
                offsets[1][i] = offsets[0][i];
210
28.6k
        }
211
212
        // update current offsets
213
164k
        for (int i = 0; i < rows; i++)
214
103k
            offsets[0][i] = get_random_number(8, &seed[i]);
215
216
        // x/y block offsets to compensate for overlapped regions
217
60.4k
        const int ystart = data->overlap_flag && row_num ? imin(2, bh) : 0;
218
60.4k
        const int xstart = data->overlap_flag && bx      ? imin(2, bw) : 0;
219
220
60.4k
        static const int w[2][2] = { { 27, 17 }, { 17, 27 } };
221
222
60.4k
#define add_noise_y(x, y, grain)                                                  \
223
17.7M
        const pixel *const src = src_row + (y) * PXSTRIDE(stride) + (x) + bx;     \
224
17.7M
        pixel *const dst = dst_row + (y) * PXSTRIDE(stride) + (x) + bx;           \
225
17.7M
        const int noise = round2(scaling[ *src ] * (grain), data->scaling_shift); \
226
17.7M
        *dst = iclip(*src + noise, min_value, max_value);
227
228
1.50M
        for (int y = ystart; y < bh; y++) {
229
            // Non-overlapped image region (straightforward)
230
16.3M
            for (int x = xstart; x < bw; x++) {
231
14.8M
                int grain = sample_lut(grain_lut, offsets, 0, 0, 0, 0, x, y);
232
14.8M
                add_noise_y(x, y, grain);
233
14.8M
            }
234
235
            // Special case for overlapped column
236
2.70M
            for (int x = 0; x < xstart; x++) {
237
1.26M
                int grain = sample_lut(grain_lut, offsets, 0, 0, 0, 0, x, y);
238
1.26M
                int old   = sample_lut(grain_lut, offsets, 0, 0, 1, 0, x, y);
239
1.26M
                grain = round2(old * w[x][0] + grain * w[x][1], 5);
240
1.26M
                grain = iclip(grain, grain_min, grain_max);
241
1.26M
                add_noise_y(x, y, grain);
242
1.26M
            }
243
1.44M
        }
244
245
145k
        for (int y = 0; y < ystart; y++) {
246
            // Special case for overlapped row (sans corner)
247
1.61M
            for (int x = xstart; x < bw; x++) {
248
1.52M
                int grain = sample_lut(grain_lut, offsets, 0, 0, 0, 0, x, y);
249
1.52M
                int old   = sample_lut(grain_lut, offsets, 0, 0, 0, 1, x, y);
250
1.52M
                grain = round2(old * w[y][0] + grain * w[y][1], 5);
251
1.52M
                grain = iclip(grain, grain_min, grain_max);
252
1.52M
                add_noise_y(x, y, grain);
253
1.52M
            }
254
255
            // Special case for doubly-overlapped corner
256
179k
            for (int x = 0; x < xstart; x++) {
257
                // Blend the top pixel with the top left block
258
94.9k
                int top = sample_lut(grain_lut, offsets, 0, 0, 0, 1, x, y);
259
94.9k
                int old = sample_lut(grain_lut, offsets, 0, 0, 1, 1, x, y);
260
94.9k
                top = round2(old * w[x][0] + top * w[x][1], 5);
261
94.9k
                top = iclip(top, grain_min, grain_max);
262
263
                // Blend the current pixel with the left block
264
94.9k
                int grain = sample_lut(grain_lut, offsets, 0, 0, 0, 0, x, y);
265
94.9k
                old = sample_lut(grain_lut, offsets, 0, 0, 1, 0, x, y);
266
94.9k
                grain = round2(old * w[x][0] + grain * w[x][1], 5);
267
94.9k
                grain = iclip(grain, grain_min, grain_max);
268
269
                // Mix the row rows together and apply grain
270
94.9k
                grain = round2(top * w[y][0] + grain * w[y][1], 5);
271
94.9k
                grain = iclip(grain, grain_min, grain_max);
272
94.9k
                add_noise_y(x, y, grain);
273
94.9k
            }
274
84.9k
        }
275
60.4k
    }
276
24.9k
}
277
278
static NOINLINE void
279
fguv_32x32xn_c(pixel *const dst_row, const pixel *const src_row,
280
               const ptrdiff_t stride, const Dav1dFilmGrainData *const data,
281
               const size_t pw, const uint8_t scaling[SCALING_SIZE],
282
               const entry grain_lut[][GRAIN_WIDTH], const int bh,
283
               const int row_num, const pixel *const luma_row,
284
               const ptrdiff_t luma_stride, const int uv, const int is_id,
285
               const int sx, const int sy HIGHBD_DECL_SUFFIX)
286
40.5k
{
287
40.5k
    const int rows = 1 + (data->overlap_flag && row_num > 0);
288
40.5k
    const int bitdepth_min_8 = bitdepth_from_max(bitdepth_max) - 8;
289
40.5k
    const int grain_ctr = 128 << bitdepth_min_8;
290
40.5k
    const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
291
292
40.5k
    int min_value, max_value;
293
40.5k
    if (data->clip_to_restricted_range) {
294
28.3k
        min_value = 16 << bitdepth_min_8;
295
28.3k
        max_value = (is_id ? 235 : 240) << bitdepth_min_8;
296
28.3k
    } else {
297
12.1k
        min_value = 0;
298
12.1k
        max_value = BITDEPTH_MAX;
299
12.1k
    }
300
301
    // seed[0] contains the current row, seed[1] contains the previous
302
40.5k
    unsigned seed[2];
303
108k
    for (int i = 0; i < rows; i++) {
304
67.6k
        seed[i] = data->seed;
305
67.6k
        seed[i] ^= (((row_num - i) * 37  + 178) & 0xFF) << 8;
306
67.6k
        seed[i] ^= (((row_num - i) * 173 + 105) & 0xFF);
307
67.6k
    }
308
309
40.5k
    assert(stride % (FG_BLOCK_SIZE * sizeof(pixel)) == 0);
310
311
40.5k
    int offsets[2 /* col offset */][2 /* row offset */];
312
313
    // process this row in FG_BLOCK_SIZE^2 blocks (subsampled)
314
172k
    for (unsigned bx = 0; bx < pw; bx += FG_BLOCK_SIZE >> sx) {
315
131k
        const int bw = imin(FG_BLOCK_SIZE >> sx, (int)(pw - bx));
316
131k
        if (data->overlap_flag && bx) {
317
            // shift previous offsets left
318
101k
            for (int i = 0; i < rows; i++)
319
65.3k
                offsets[1][i] = offsets[0][i];
320
36.2k
        }
321
322
        // update current offsets
323
318k
        for (int i = 0; i < rows; i++)
324
186k
            offsets[0][i] = get_random_number(8, &seed[i]);
325
326
        // x/y block offsets to compensate for overlapped regions
327
131k
        const int ystart = data->overlap_flag && row_num ? imin(2 >> sy, bh) : 0;
328
131k
        const int xstart = data->overlap_flag && bx      ? imin(2 >> sx, bw) : 0;
329
330
131k
        static const int w[2 /* sub */][2 /* off */][2] = {
331
131k
            { { 27, 17 }, { 17, 27 } },
332
131k
            { { 23, 22 } },
333
131k
        };
334
335
131k
#define add_noise_uv(x, y, grain)                                                    \
336
16.9M
            const int lx = (bx + x) << sx;                                           \
337
16.9M
            const int ly = y << sy;                                                  \
338
16.9M
            const pixel *const luma = luma_row + ly * PXSTRIDE(luma_stride) + lx;    \
339
16.9M
            pixel avg = luma[0];                                                     \
340
16.9M
            if (sx)                                                                  \
341
16.9M
                avg = (avg + luma[1] + 1) >> 1;                                      \
342
16.9M
            const pixel *const src = src_row + (y) * PXSTRIDE(stride) + (bx + (x));  \
343
16.9M
            pixel *const dst = dst_row + (y) * PXSTRIDE(stride) + (bx + (x));        \
344
16.9M
            int val = avg;                                                           \
345
16.9M
            if (!data->chroma_scaling_from_luma) {                                   \
346
3.83M
                const int combined = avg * data->uv_luma_mult[uv] +                  \
347
3.83M
                               *src * data->uv_mult[uv];                             \
348
3.83M
                val = iclip_pixel( (combined >> 6) +                                 \
349
3.83M
                                   (data->uv_offset[uv] * (1 << bitdepth_min_8)) );  \
350
3.83M
            }                                                                        \
351
16.9M
            const int noise = round2(scaling[ val ] * (grain), data->scaling_shift); \
352
16.9M
            *dst = iclip(*src + noise, min_value, max_value);
353
354
2.02M
        for (int y = ystart; y < bh; y++) {
355
            // Non-overlapped image region (straightforward)
356
16.7M
            for (int x = xstart; x < bw; x++) {
357
14.8M
                int grain = sample_lut(grain_lut, offsets, sx, sy, 0, 0, x, y);
358
14.8M
                add_noise_uv(x, y, grain);
359
14.8M
            }
360
361
            // Special case for overlapped column
362
2.79M
            for (int x = 0; x < xstart; x++) {
363
900k
                int grain = sample_lut(grain_lut, offsets, sx, sy, 0, 0, x, y);
364
900k
                int old   = sample_lut(grain_lut, offsets, sx, sy, 1, 0, x, y);
365
900k
                grain = round2(old * w[sx][x][0] + grain * w[sx][x][1], 5);
366
900k
                grain = iclip(grain, grain_min, grain_max);
367
900k
                add_noise_uv(x, y, grain);
368
900k
            }
369
1.89M
        }
370
371
210k
        for (int y = 0; y < ystart; y++) {
372
            // Special case for overlapped row (sans corner)
373
1.18M
            for (int x = xstart; x < bw; x++) {
374
1.10M
                int grain = sample_lut(grain_lut, offsets, sx, sy, 0, 0, x, y);
375
1.10M
                int old   = sample_lut(grain_lut, offsets, sx, sy, 0, 1, x, y);
376
1.10M
                grain = round2(old * w[sy][y][0] + grain * w[sy][y][1], 5);
377
1.10M
                grain = iclip(grain, grain_min, grain_max);
378
1.10M
                add_noise_uv(x, y, grain);
379
1.10M
            }
380
381
            // Special case for doubly-overlapped corner
382
135k
            for (int x = 0; x < xstart; x++) {
383
                // Blend the top pixel with the top left block
384
57.1k
                int top = sample_lut(grain_lut, offsets, sx, sy, 0, 1, x, y);
385
57.1k
                int old = sample_lut(grain_lut, offsets, sx, sy, 1, 1, x, y);
386
57.1k
                top = round2(old * w[sx][x][0] + top * w[sx][x][1], 5);
387
57.1k
                top = iclip(top, grain_min, grain_max);
388
389
                // Blend the current pixel with the left block
390
57.1k
                int grain = sample_lut(grain_lut, offsets, sx, sy, 0, 0, x, y);
391
57.1k
                old = sample_lut(grain_lut, offsets, sx, sy, 1, 0, x, y);
392
57.1k
                grain = round2(old * w[sx][x][0] + grain * w[sx][x][1], 5);
393
57.1k
                grain = iclip(grain, grain_min, grain_max);
394
395
                // Mix the row rows together and apply to image
396
57.1k
                grain = round2(top * w[sy][y][0] + grain * w[sy][y][1], 5);
397
57.1k
                grain = iclip(grain, grain_min, grain_max);
398
57.1k
                add_noise_uv(x, y, grain);
399
57.1k
            }
400
78.3k
        }
401
131k
    }
402
40.5k
}
403
404
#define fguv_ss_fn(nm, ss_x, ss_y) \
405
40.5k
static decl_fguv_32x32xn_fn(fguv_32x32xn_##nm##_c) { \
406
40.5k
    fguv_32x32xn_c(dst_row, src_row, stride, data, pw, scaling, grain_lut, bh, \
407
40.5k
                   row_num, luma_row, luma_stride, uv_pl, is_id, ss_x, ss_y \
408
40.5k
                   HIGHBD_TAIL_SUFFIX); \
409
40.5k
}
filmgrain_tmpl.c:fguv_32x32xn_420_c
Line
Count
Source
405
18.0k
static decl_fguv_32x32xn_fn(fguv_32x32xn_##nm##_c) { \
406
18.0k
    fguv_32x32xn_c(dst_row, src_row, stride, data, pw, scaling, grain_lut, bh, \
407
18.0k
                   row_num, luma_row, luma_stride, uv_pl, is_id, ss_x, ss_y \
408
18.0k
                   HIGHBD_TAIL_SUFFIX); \
409
18.0k
}
filmgrain_tmpl.c:fguv_32x32xn_422_c
Line
Count
Source
405
902
static decl_fguv_32x32xn_fn(fguv_32x32xn_##nm##_c) { \
406
902
    fguv_32x32xn_c(dst_row, src_row, stride, data, pw, scaling, grain_lut, bh, \
407
902
                   row_num, luma_row, luma_stride, uv_pl, is_id, ss_x, ss_y \
408
902
                   HIGHBD_TAIL_SUFFIX); \
409
902
}
filmgrain_tmpl.c:fguv_32x32xn_444_c
Line
Count
Source
405
21.6k
static decl_fguv_32x32xn_fn(fguv_32x32xn_##nm##_c) { \
406
21.6k
    fguv_32x32xn_c(dst_row, src_row, stride, data, pw, scaling, grain_lut, bh, \
407
21.6k
                   row_num, luma_row, luma_stride, uv_pl, is_id, ss_x, ss_y \
408
21.6k
                   HIGHBD_TAIL_SUFFIX); \
409
21.6k
}
410
411
fguv_ss_fn(420, 1, 1);
412
fguv_ss_fn(422, 1, 0);
413
fguv_ss_fn(444, 0, 0);
414
415
#if HAVE_ASM
416
#if ARCH_AARCH64 || ARCH_ARM
417
#include "src/arm/filmgrain.h"
418
#elif ARCH_X86
419
#include "src/x86/filmgrain.h"
420
#elif ARCH_RISCV
421
#include "src/riscv/filmgrain.h"
422
#endif
423
#endif
424
425
55.8k
COLD void bitfn(dav1d_film_grain_dsp_init)(Dav1dFilmGrainDSPContext *const c) {
426
55.8k
    c->generate_grain_y = generate_grain_y_c;
427
55.8k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I420 - 1] = generate_grain_uv_420_c;
428
55.8k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I422 - 1] = generate_grain_uv_422_c;
429
55.8k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I444 - 1] = generate_grain_uv_444_c;
430
431
55.8k
    c->fgy_32x32xn = fgy_32x32xn_c;
432
55.8k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I420 - 1] = fguv_32x32xn_420_c;
433
55.8k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I422 - 1] = fguv_32x32xn_422_c;
434
55.8k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I444 - 1] = fguv_32x32xn_444_c;
435
436
#if HAVE_ASM
437
#if ARCH_AARCH64 || ARCH_ARM
438
    film_grain_dsp_init_arm(c);
439
#elif ARCH_X86
440
    film_grain_dsp_init_x86(c);
441
#elif ARCH_RISCV
442
    film_grain_dsp_init_riscv(c);
443
#endif
444
#endif
445
55.8k
}
dav1d_film_grain_dsp_init_8bpc
Line
Count
Source
425
25.1k
COLD void bitfn(dav1d_film_grain_dsp_init)(Dav1dFilmGrainDSPContext *const c) {
426
25.1k
    c->generate_grain_y = generate_grain_y_c;
427
25.1k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I420 - 1] = generate_grain_uv_420_c;
428
25.1k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I422 - 1] = generate_grain_uv_422_c;
429
25.1k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I444 - 1] = generate_grain_uv_444_c;
430
431
25.1k
    c->fgy_32x32xn = fgy_32x32xn_c;
432
25.1k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I420 - 1] = fguv_32x32xn_420_c;
433
25.1k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I422 - 1] = fguv_32x32xn_422_c;
434
25.1k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I444 - 1] = fguv_32x32xn_444_c;
435
436
#if HAVE_ASM
437
#if ARCH_AARCH64 || ARCH_ARM
438
    film_grain_dsp_init_arm(c);
439
#elif ARCH_X86
440
    film_grain_dsp_init_x86(c);
441
#elif ARCH_RISCV
442
    film_grain_dsp_init_riscv(c);
443
#endif
444
#endif
445
25.1k
}
dav1d_film_grain_dsp_init_16bpc
Line
Count
Source
425
30.6k
COLD void bitfn(dav1d_film_grain_dsp_init)(Dav1dFilmGrainDSPContext *const c) {
426
30.6k
    c->generate_grain_y = generate_grain_y_c;
427
30.6k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I420 - 1] = generate_grain_uv_420_c;
428
30.6k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I422 - 1] = generate_grain_uv_422_c;
429
30.6k
    c->generate_grain_uv[DAV1D_PIXEL_LAYOUT_I444 - 1] = generate_grain_uv_444_c;
430
431
30.6k
    c->fgy_32x32xn = fgy_32x32xn_c;
432
30.6k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I420 - 1] = fguv_32x32xn_420_c;
433
30.6k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I422 - 1] = fguv_32x32xn_422_c;
434
30.6k
    c->fguv_32x32xn[DAV1D_PIXEL_LAYOUT_I444 - 1] = fguv_32x32xn_444_c;
435
436
#if HAVE_ASM
437
#if ARCH_AARCH64 || ARCH_ARM
438
    film_grain_dsp_init_arm(c);
439
#elif ARCH_X86
440
    film_grain_dsp_init_x86(c);
441
#elif ARCH_RISCV
442
    film_grain_dsp_init_riscv(c);
443
#endif
444
#endif
445
30.6k
}