Coverage Report

Created: 2025-11-16 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/h264pred.c
Line
Count
Source
1
/*
2
 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
3
 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
/**
23
 * @file
24
 * H.264 / AVC / MPEG-4 part10 prediction functions.
25
 * @author Michael Niedermayer <michaelni@gmx.at>
26
 */
27
28
#include "config.h"
29
#include "libavutil/attributes.h"
30
#include "libavutil/avassert.h"
31
#include "libavutil/intreadwrite.h"
32
#include "codec_id.h"
33
#include "h264pred.h"
34
#include "mathops.h"
35
36
#define BIT_DEPTH 8
37
#include "h264pred_template.c"
38
#undef BIT_DEPTH
39
40
10.5M
#define BIT_DEPTH 9
41
#include "h264pred_template.c"
42
#undef BIT_DEPTH
43
44
31.0M
#define BIT_DEPTH 10
45
#include "h264pred_template.c"
46
#undef BIT_DEPTH
47
48
6.13M
#define BIT_DEPTH 12
49
#include "h264pred_template.c"
50
#undef BIT_DEPTH
51
52
8.80M
#define BIT_DEPTH 14
53
#include "h264pred_template.c"
54
#undef BIT_DEPTH
55
56
static void pred4x4_127_dc_c(uint8_t *src, const uint8_t *topright,
57
                             ptrdiff_t _stride)
58
9.41k
{
59
9.41k
    int stride = _stride;
60
9.41k
    const uint32_t a = 0x7F7F7F7FU;
61
62
9.41k
    AV_WN32A(src + 0 * stride, a);
63
9.41k
    AV_WN32A(src + 1 * stride, a);
64
9.41k
    AV_WN32A(src + 2 * stride, a);
65
9.41k
    AV_WN32A(src + 3 * stride, a);
66
9.41k
}
67
68
static void pred4x4_129_dc_c(uint8_t *src, const uint8_t *topright,
69
                             ptrdiff_t _stride)
70
3.14k
{
71
3.14k
    int stride = _stride;
72
3.14k
    const uint32_t a = 0x81818181U;
73
74
3.14k
    AV_WN32A(src + 0 * stride, a);
75
3.14k
    AV_WN32A(src + 1 * stride, a);
76
3.14k
    AV_WN32A(src + 2 * stride, a);
77
3.14k
    AV_WN32A(src + 3 * stride, a);
78
3.14k
}
79
80
static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright,
81
                                   ptrdiff_t stride)
82
92.7k
{
83
92.7k
    const unsigned lt = src[-1-1*stride];
84
92.7k
    LOAD_TOP_EDGE
85
92.7k
    LOAD_TOP_RIGHT_EDGE
86
92.7k
    uint32_t v = PACK_4U8((lt + 2*t0 + t1 + 2) >> 2,
87
92.7k
                          (t0 + 2*t1 + t2 + 2) >> 2,
88
92.7k
                          (t1 + 2*t2 + t3 + 2) >> 2,
89
92.7k
                          (t2 + 2*t3 + t4 + 2) >> 2);
90
91
92.7k
    AV_WN32A(src+0*stride, v);
92
92.7k
    AV_WN32A(src+1*stride, v);
93
92.7k
    AV_WN32A(src+2*stride, v);
94
92.7k
    AV_WN32A(src+3*stride, v);
95
92.7k
}
96
97
static void pred4x4_horizontal_vp8_c(uint8_t *src, const uint8_t *topright,
98
                                     ptrdiff_t stride)
99
102k
{
100
102k
    const unsigned lt = src[-1-1*stride];
101
102k
    LOAD_LEFT_EDGE
102
103
102k
    AV_WN32A(src+0*stride, ((lt + 2*l0 + l1 + 2) >> 2)*0x01010101);
104
102k
    AV_WN32A(src+1*stride, ((l0 + 2*l1 + l2 + 2) >> 2)*0x01010101);
105
102k
    AV_WN32A(src+2*stride, ((l1 + 2*l2 + l3 + 2) >> 2)*0x01010101);
106
102k
    AV_WN32A(src+3*stride, ((l2 + 2*l3 + l3 + 2) >> 2)*0x01010101);
107
102k
}
108
109
static void pred4x4_down_left_svq3_c(uint8_t *src, const uint8_t *topright,
110
                                     ptrdiff_t stride)
111
622
{
112
622
    LOAD_TOP_EDGE
113
622
    LOAD_LEFT_EDGE
114
115
622
    src[0+0*stride]=(l1 + t1)>>1;
116
622
    src[1+0*stride]=
117
622
    src[0+1*stride]=(l2 + t2)>>1;
118
622
    src[2+0*stride]=
119
622
    src[1+1*stride]=
120
622
    src[0+2*stride]=
121
622
    src[3+0*stride]=
122
622
    src[2+1*stride]=
123
622
    src[1+2*stride]=
124
622
    src[0+3*stride]=
125
622
    src[3+1*stride]=
126
622
    src[2+2*stride]=
127
622
    src[1+3*stride]=
128
622
    src[3+2*stride]=
129
622
    src[2+3*stride]=
130
622
    src[3+3*stride]=(l3 + t3)>>1;
131
622
}
132
133
static void pred4x4_down_left_rv40_c(uint8_t *src, const uint8_t *topright,
134
                                     ptrdiff_t stride)
135
701k
{
136
701k
    LOAD_TOP_EDGE
137
701k
    LOAD_TOP_RIGHT_EDGE
138
701k
    LOAD_LEFT_EDGE
139
701k
    LOAD_DOWN_LEFT_EDGE
140
141
701k
    src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
142
701k
    src[1+0*stride]=
143
701k
    src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
144
701k
    src[2+0*stride]=
145
701k
    src[1+1*stride]=
146
701k
    src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + l4 + 2*l3 + 2)>>3;
147
701k
    src[3+0*stride]=
148
701k
    src[2+1*stride]=
149
701k
    src[1+2*stride]=
150
701k
    src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3 + l5 + 2*l4 + 2)>>3;
151
701k
    src[3+1*stride]=
152
701k
    src[2+2*stride]=
153
701k
    src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l4 + l6 + 2*l5 + 2)>>3;
154
701k
    src[3+2*stride]=
155
701k
    src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l5 + l7 + 2*l6 + 2)>>3;
156
701k
    src[3+3*stride]=(t6 + t7 + 1 + l6 + l7 + 1)>>2;
157
701k
}
158
159
static void pred4x4_down_left_rv40_nodown_c(uint8_t *src,
160
                                            const uint8_t *topright,
161
                                            ptrdiff_t stride)
162
2.69M
{
163
2.69M
    LOAD_TOP_EDGE
164
2.69M
    LOAD_TOP_RIGHT_EDGE
165
2.69M
    LOAD_LEFT_EDGE
166
167
2.69M
    src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
168
2.69M
    src[1+0*stride]=
169
2.69M
    src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
170
2.69M
    src[2+0*stride]=
171
2.69M
    src[1+1*stride]=
172
2.69M
    src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + 3*l3 + 2)>>3;
173
2.69M
    src[3+0*stride]=
174
2.69M
    src[2+1*stride]=
175
2.69M
    src[1+2*stride]=
176
2.69M
    src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3*4 + 2)>>3;
177
2.69M
    src[3+1*stride]=
178
2.69M
    src[2+2*stride]=
179
2.69M
    src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l3*4 + 2)>>3;
180
2.69M
    src[3+2*stride]=
181
2.69M
    src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l3*4 + 2)>>3;
182
2.69M
    src[3+3*stride]=(t6 + t7 + 1 + 2*l3 + 1)>>2;
183
2.69M
}
184
185
static void pred4x4_vertical_left_rv40(uint8_t *src, const uint8_t *topright,
186
                                       ptrdiff_t stride,
187
                                       const int l0, const int l1, const int l2,
188
                                       const int l3, const int l4)
189
3.11M
{
190
3.11M
    LOAD_TOP_EDGE
191
3.11M
    LOAD_TOP_RIGHT_EDGE
192
193
3.11M
    src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
194
3.11M
    src[1+0*stride]=
195
3.11M
    src[0+2*stride]=(t1 + t2 + 1)>>1;
196
3.11M
    src[2+0*stride]=
197
3.11M
    src[1+2*stride]=(t2 + t3 + 1)>>1;
198
3.11M
    src[3+0*stride]=
199
3.11M
    src[2+2*stride]=(t3 + t4+ 1)>>1;
200
3.11M
    src[3+2*stride]=(t4 + t5+ 1)>>1;
201
3.11M
    src[0+1*stride]=(t0 + 2*t1 + t2 + l2 + 2*l3 + l4 + 4)>>3;
202
3.11M
    src[1+1*stride]=
203
3.11M
    src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
204
3.11M
    src[2+1*stride]=
205
3.11M
    src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
206
3.11M
    src[3+1*stride]=
207
3.11M
    src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
208
3.11M
    src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
209
3.11M
}
210
211
static void pred4x4_vertical_left_rv40_c(uint8_t *src, const uint8_t *topright,
212
                                         ptrdiff_t stride)
213
598k
{
214
598k
    LOAD_LEFT_EDGE
215
598k
    LOAD_DOWN_LEFT_EDGE
216
217
598k
    pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4);
218
598k
}
219
220
static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src,
221
                                                const uint8_t *topright,
222
                                                ptrdiff_t stride)
223
2.51M
{
224
2.51M
    LOAD_LEFT_EDGE
225
226
2.51M
    pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3);
227
2.51M
}
228
229
static void pred4x4_vertical_left_vp8_c(uint8_t *src, const uint8_t *topright,
230
                                        ptrdiff_t stride)
231
53.4k
{
232
53.4k
    LOAD_TOP_EDGE
233
53.4k
    LOAD_TOP_RIGHT_EDGE
234
235
53.4k
    src[0+0*stride]=(t0 + t1 + 1)>>1;
236
53.4k
    src[1+0*stride]=
237
53.4k
    src[0+2*stride]=(t1 + t2 + 1)>>1;
238
53.4k
    src[2+0*stride]=
239
53.4k
    src[1+2*stride]=(t2 + t3 + 1)>>1;
240
53.4k
    src[3+0*stride]=
241
53.4k
    src[2+2*stride]=(t3 + t4 + 1)>>1;
242
53.4k
    src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
243
53.4k
    src[1+1*stride]=
244
53.4k
    src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
245
53.4k
    src[2+1*stride]=
246
53.4k
    src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
247
53.4k
    src[3+1*stride]=
248
53.4k
    src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
249
53.4k
    src[3+2*stride]=(t4 + 2*t5 + t6 + 2)>>2;
250
53.4k
    src[3+3*stride]=(t5 + 2*t6 + t7 + 2)>>2;
251
53.4k
}
252
253
static void pred4x4_horizontal_up_rv40_c(uint8_t *src, const uint8_t *topright,
254
                                         ptrdiff_t stride)
255
467k
{
256
467k
    LOAD_LEFT_EDGE
257
467k
    LOAD_DOWN_LEFT_EDGE
258
467k
    LOAD_TOP_EDGE
259
467k
    LOAD_TOP_RIGHT_EDGE
260
261
467k
    src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
262
467k
    src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
263
467k
    src[2+0*stride]=
264
467k
    src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
265
467k
    src[3+0*stride]=
266
467k
    src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
267
467k
    src[2+1*stride]=
268
467k
    src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
269
467k
    src[3+1*stride]=
270
467k
    src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
271
467k
    src[3+2*stride]=
272
467k
    src[1+3*stride]=(l3 + 2*l4 + l5 + 2)>>2;
273
467k
    src[0+3*stride]=
274
467k
    src[2+2*stride]=(t6 + t7 + l3 + l4 + 2)>>2;
275
467k
    src[2+3*stride]=(l4 + l5 + 1)>>1;
276
467k
    src[3+3*stride]=(l4 + 2*l5 + l6 + 2)>>2;
277
467k
}
278
279
static void pred4x4_horizontal_up_rv40_nodown_c(uint8_t *src,
280
                                                const uint8_t *topright,
281
                                                ptrdiff_t stride)
282
2.25M
{
283
2.25M
    LOAD_LEFT_EDGE
284
2.25M
    LOAD_TOP_EDGE
285
2.25M
    LOAD_TOP_RIGHT_EDGE
286
287
2.25M
    src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
288
2.25M
    src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
289
2.25M
    src[2+0*stride]=
290
2.25M
    src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
291
2.25M
    src[3+0*stride]=
292
2.25M
    src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
293
2.25M
    src[2+1*stride]=
294
2.25M
    src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
295
2.25M
    src[3+1*stride]=
296
2.25M
    src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
297
2.25M
    src[3+2*stride]=
298
2.25M
    src[1+3*stride]=l3;
299
2.25M
    src[0+3*stride]=
300
2.25M
    src[2+2*stride]=(t6 + t7 + 2*l3 + 2)>>2;
301
2.25M
    src[2+3*stride]=
302
2.25M
    src[3+3*stride]=l3;
303
2.25M
}
304
305
static void pred4x4_tm_vp8_c(uint8_t *src, const uint8_t *topright,
306
                             ptrdiff_t stride)
307
245k
{
308
245k
    const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP - src[-1-stride];
309
245k
    uint8_t *top = src-stride;
310
245k
    int y;
311
312
1.22M
    for (y = 0; y < 4; y++) {
313
983k
        const uint8_t *cm_in = cm + src[-1];
314
983k
        src[0] = cm_in[top[0]];
315
983k
        src[1] = cm_in[top[1]];
316
983k
        src[2] = cm_in[top[2]];
317
983k
        src[3] = cm_in[top[3]];
318
983k
        src += stride;
319
983k
    }
320
245k
}
321
322
static void pred16x16_plane_svq3_c(uint8_t *src, ptrdiff_t stride)
323
2.44k
{
324
2.44k
    pred16x16_plane_compat_8_c(src, stride, 1, 0);
325
2.44k
}
326
327
static void pred16x16_plane_rv40_c(uint8_t *src, ptrdiff_t stride)
328
73.9k
{
329
73.9k
    pred16x16_plane_compat_8_c(src, stride, 0, 1);
330
73.9k
}
331
332
static void pred16x16_tm_vp8_c(uint8_t *src, ptrdiff_t stride)
333
41.2k
{
334
41.2k
    const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP - src[-1-stride];
335
41.2k
    uint8_t *top = src-stride;
336
41.2k
    int y;
337
338
701k
    for (y = 0; y < 16; y++) {
339
660k
        const uint8_t *cm_in = cm + src[-1];
340
660k
        src[0]  = cm_in[top[0]];
341
660k
        src[1]  = cm_in[top[1]];
342
660k
        src[2]  = cm_in[top[2]];
343
660k
        src[3]  = cm_in[top[3]];
344
660k
        src[4]  = cm_in[top[4]];
345
660k
        src[5]  = cm_in[top[5]];
346
660k
        src[6]  = cm_in[top[6]];
347
660k
        src[7]  = cm_in[top[7]];
348
660k
        src[8]  = cm_in[top[8]];
349
660k
        src[9]  = cm_in[top[9]];
350
660k
        src[10] = cm_in[top[10]];
351
660k
        src[11] = cm_in[top[11]];
352
660k
        src[12] = cm_in[top[12]];
353
660k
        src[13] = cm_in[top[13]];
354
660k
        src[14] = cm_in[top[14]];
355
660k
        src[15] = cm_in[top[15]];
356
660k
        src += stride;
357
660k
    }
358
41.2k
}
359
360
static void pred8x8_left_dc_rv40_c(uint8_t *src, ptrdiff_t stride)
361
606k
{
362
606k
    int i;
363
606k
    unsigned dc0;
364
365
606k
    dc0=0;
366
5.45M
    for(i=0;i<8; i++)
367
4.84M
        dc0+= src[-1+i*stride];
368
606k
    dc0= 0x01010101*((dc0 + 4)>>3);
369
370
5.45M
    for(i=0; i<8; i++){
371
4.84M
        ((uint32_t*)(src+i*stride))[0]=
372
4.84M
        ((uint32_t*)(src+i*stride))[1]= dc0;
373
4.84M
    }
374
606k
}
375
376
static void pred8x8_top_dc_rv40_c(uint8_t *src, ptrdiff_t stride)
377
342k
{
378
342k
    int i;
379
342k
    unsigned dc0;
380
381
342k
    dc0=0;
382
3.07M
    for(i=0;i<8; i++)
383
2.73M
        dc0+= src[i-stride];
384
342k
    dc0= 0x01010101*((dc0 + 4)>>3);
385
386
3.07M
    for(i=0; i<8; i++){
387
2.73M
        ((uint32_t*)(src+i*stride))[0]=
388
2.73M
        ((uint32_t*)(src+i*stride))[1]= dc0;
389
2.73M
    }
390
342k
}
391
392
static void pred8x8_dc_rv40_c(uint8_t *src, ptrdiff_t stride)
393
1.29M
{
394
1.29M
    int i;
395
1.29M
    unsigned dc0 = 0;
396
397
6.47M
    for(i=0;i<4; i++){
398
5.18M
        dc0+= src[-1+i*stride] + src[i-stride];
399
5.18M
        dc0+= src[4+i-stride];
400
5.18M
        dc0+= src[-1+(i+4)*stride];
401
5.18M
    }
402
1.29M
    dc0= 0x01010101*((dc0 + 8)>>4);
403
404
6.47M
    for(i=0; i<4; i++){
405
5.18M
        ((uint32_t*)(src+i*stride))[0]= dc0;
406
5.18M
        ((uint32_t*)(src+i*stride))[1]= dc0;
407
5.18M
    }
408
6.47M
    for(i=4; i<8; i++){
409
5.18M
        ((uint32_t*)(src+i*stride))[0]= dc0;
410
5.18M
        ((uint32_t*)(src+i*stride))[1]= dc0;
411
5.18M
    }
412
1.29M
}
413
414
static void pred8x8_tm_vp8_c(uint8_t *src, ptrdiff_t stride)
415
76.3k
{
416
76.3k
    const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP - src[-1-stride];
417
76.3k
    uint8_t *top = src-stride;
418
76.3k
    int y;
419
420
687k
    for (y = 0; y < 8; y++) {
421
610k
        const uint8_t *cm_in = cm + src[-1];
422
610k
        src[0] = cm_in[top[0]];
423
610k
        src[1] = cm_in[top[1]];
424
610k
        src[2] = cm_in[top[2]];
425
610k
        src[3] = cm_in[top[3]];
426
610k
        src[4] = cm_in[top[4]];
427
610k
        src[5] = cm_in[top[5]];
428
610k
        src[6] = cm_in[top[6]];
429
610k
        src[7] = cm_in[top[7]];
430
610k
        src += stride;
431
610k
    }
432
76.3k
}
433
434
/**
435
 * Set the intra prediction function pointers.
436
 */
437
av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id,
438
                               const int bit_depth,
439
                               int chroma_format_idc)
440
413k
{
441
413k
#undef FUNC
442
413k
#undef FUNCC
443
1.56M
#define FUNC(a, depth) a ## _ ## depth
444
413k
#define FUNCC(a, depth) a ## _ ## depth ## _c
445
413k
#define FUNCD(a) a ## _c
446
447
413k
#define H264_PRED(depth) \
448
413k
    h->pred4x4[VERT_PRED           ] = FUNCC(pred4x4_vertical,        depth);\
449
413k
    h->pred4x4[HOR_PRED            ] = FUNCC(pred4x4_horizontal,      depth);\
450
413k
    h->pred4x4[DC_PRED             ] = FUNCC(pred4x4_dc,              depth);\
451
413k
    h->pred4x4[DIAG_DOWN_LEFT_PRED ] = FUNCC(pred4x4_down_left,       depth);\
452
413k
    h->pred4x4[DIAG_DOWN_RIGHT_PRED] = FUNCC(pred4x4_down_right,      depth);\
453
413k
    h->pred4x4[VERT_RIGHT_PRED     ] = FUNCC(pred4x4_vertical_right,  depth);\
454
413k
    h->pred4x4[HOR_DOWN_PRED       ] = FUNCC(pred4x4_horizontal_down, depth);\
455
413k
    h->pred4x4[VERT_LEFT_PRED      ] = FUNCC(pred4x4_vertical_left,   depth);\
456
413k
    h->pred4x4[HOR_UP_PRED         ] = FUNCC(pred4x4_horizontal_up,   depth);\
457
413k
    h->pred4x4[LEFT_DC_PRED        ] = FUNCC(pred4x4_left_dc,         depth);\
458
413k
    h->pred4x4[TOP_DC_PRED         ] = FUNCC(pred4x4_top_dc,          depth);\
459
413k
    if (depth > 8 || codec_id != AV_CODEC_ID_VP8)\
460
413k
        h->pred4x4[DC_128_PRED     ] = FUNCC(pred4x4_128_dc,          depth);\
461
413k
\
462
413k
    h->pred8x8l[VERT_PRED           ]= FUNCC(pred8x8l_vertical            , depth);\
463
413k
    h->pred8x8l[HOR_PRED            ]= FUNCC(pred8x8l_horizontal          , depth);\
464
413k
    h->pred8x8l[DC_PRED             ]= FUNCC(pred8x8l_dc                  , depth);\
465
413k
    h->pred8x8l[DIAG_DOWN_LEFT_PRED ]= FUNCC(pred8x8l_down_left           , depth);\
466
413k
    h->pred8x8l[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred8x8l_down_right          , depth);\
467
413k
    h->pred8x8l[VERT_RIGHT_PRED     ]= FUNCC(pred8x8l_vertical_right      , depth);\
468
413k
    h->pred8x8l[HOR_DOWN_PRED       ]= FUNCC(pred8x8l_horizontal_down     , depth);\
469
413k
    h->pred8x8l[VERT_LEFT_PRED      ]= FUNCC(pred8x8l_vertical_left       , depth);\
470
413k
    h->pred8x8l[HOR_UP_PRED         ]= FUNCC(pred8x8l_horizontal_up       , depth);\
471
413k
    h->pred8x8l[LEFT_DC_PRED        ]= FUNCC(pred8x8l_left_dc             , depth);\
472
413k
    h->pred8x8l[TOP_DC_PRED         ]= FUNCC(pred8x8l_top_dc              , depth);\
473
413k
    h->pred8x8l[DC_128_PRED         ]= FUNCC(pred8x8l_128_dc              , depth);\
474
413k
\
475
413k
    if (chroma_format_idc <= 1) {\
476
248k
        h->pred8x8[VERT_PRED8x8   ]= FUNCC(pred8x8_vertical               , depth);\
477
248k
        h->pred8x8[HOR_PRED8x8    ]= FUNCC(pred8x8_horizontal             , depth);\
478
248k
        h->pred8x8[PLANE_PRED8x8] = FUNCC(pred8x8_plane,       depth);\
479
248k
    } else {\
480
165k
        h->pred8x8[VERT_PRED8x8   ]= FUNCC(pred8x16_vertical              , depth);\
481
165k
        h->pred8x8[HOR_PRED8x8    ]= FUNCC(pred8x16_horizontal            , depth);\
482
165k
        h->pred8x8[PLANE_PRED8x8] = FUNCC(pred8x16_plane,      depth);\
483
165k
    }\
484
413k
    if (depth > 8 || (codec_id != AV_CODEC_ID_RV40 && \
485
162k
                      codec_id != AV_CODEC_ID_VP7  && \
486
390k
                      codec_id != AV_CODEC_ID_VP8)) { \
487
390k
        if (chroma_format_idc <= 1) {\
488
225k
            h->pred8x8[DC_PRED8x8     ]= FUNCC(pred8x8_dc                     , depth);\
489
225k
            h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x8_left_dc                , depth);\
490
225k
            h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x8_top_dc                 , depth);\
491
225k
            h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l0t, depth);\
492
225k
            h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0lt, depth);\
493
225k
            h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l00, depth);\
494
225k
            h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0l0, depth);\
495
225k
        } else {\
496
165k
            h->pred8x8[DC_PRED8x8     ]= FUNCC(pred8x16_dc                    , depth);\
497
165k
            h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x16_left_dc               , depth);\
498
165k
            h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x16_top_dc                , depth);\
499
165k
            h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_l0t, depth);\
500
165k
            h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_0lt, depth);\
501
165k
            h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_l00, depth);\
502
165k
            h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_0l0, depth);\
503
165k
        }\
504
390k
    }else{\
505
23.0k
        h->pred8x8[DC_PRED8x8     ]= FUNCD(pred8x8_dc_rv40);\
506
23.0k
        h->pred8x8[LEFT_DC_PRED8x8]= FUNCD(pred8x8_left_dc_rv40);\
507
23.0k
        h->pred8x8[TOP_DC_PRED8x8 ]= FUNCD(pred8x8_top_dc_rv40);\
508
23.0k
    }\
509
413k
    if (chroma_format_idc <= 1) {\
510
248k
        h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x8_128_dc                 , depth);\
511
248k
    } else {\
512
165k
        h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x16_128_dc                , depth);\
513
165k
    }\
514
413k
\
515
413k
    h->pred16x16[DC_PRED8x8     ]= FUNCC(pred16x16_dc                     , depth);\
516
413k
    h->pred16x16[VERT_PRED8x8   ]= FUNCC(pred16x16_vertical               , depth);\
517
413k
    h->pred16x16[HOR_PRED8x8    ]= FUNCC(pred16x16_horizontal             , depth);\
518
413k
    h->pred16x16[PLANE_PRED8x8  ]= FUNCC(pred16x16_plane                  , depth);\
519
413k
    h->pred16x16[LEFT_DC_PRED8x8]= FUNCC(pred16x16_left_dc                , depth);\
520
413k
    h->pred16x16[TOP_DC_PRED8x8 ]= FUNCC(pred16x16_top_dc                 , depth);\
521
413k
    h->pred16x16[DC_128_PRED8x8 ]= FUNCC(pred16x16_128_dc                 , depth);\
522
413k
\
523
    /* special lossless h/v prediction for H.264 */ \
524
413k
    h->pred4x4_add  [VERT_PRED   ]= FUNCC(pred4x4_vertical_add            , depth);\
525
413k
    h->pred4x4_add  [ HOR_PRED   ]= FUNCC(pred4x4_horizontal_add          , depth);\
526
413k
    h->pred8x8l_add [VERT_PRED   ]= FUNCC(pred8x8l_vertical_add           , depth);\
527
413k
    h->pred8x8l_add [ HOR_PRED   ]= FUNCC(pred8x8l_horizontal_add         , depth);\
528
413k
    h->pred8x8l_filter_add [VERT_PRED   ]= FUNCC(pred8x8l_vertical_filter_add           , depth);\
529
413k
    h->pred8x8l_filter_add [ HOR_PRED   ]= FUNCC(pred8x8l_horizontal_filter_add         , depth);\
530
413k
    if (chroma_format_idc <= 1) {\
531
248k
        h->pred8x8_add[VERT_PRED8x8] = FUNCC(pred8x8_vertical_add,    depth);\
532
248k
        h->pred8x8_add[ HOR_PRED8x8] = FUNCC(pred8x8_horizontal_add,  depth);\
533
248k
    } else {\
534
165k
        h->pred8x8_add  [VERT_PRED8x8]= FUNCC(pred8x16_vertical_add            , depth);\
535
165k
        h->pred8x8_add  [ HOR_PRED8x8]= FUNCC(pred8x16_horizontal_add          , depth);\
536
165k
    }\
537
413k
    h->pred16x16_add[VERT_PRED8x8]= FUNCC(pred16x16_vertical_add          , depth);\
538
413k
    h->pred16x16_add[ HOR_PRED8x8]= FUNCC(pred16x16_horizontal_add        , depth);\
539
413k
540
413k
    switch (bit_depth) {
541
62.5k
        case 9:
542
62.5k
            H264_PRED(9)
543
62.5k
            break;
544
34.8k
        case 10:
545
34.8k
            H264_PRED(10)
546
34.8k
            break;
547
89.5k
        case 12:
548
89.5k
            H264_PRED(12)
549
89.5k
            break;
550
64.7k
        case 14:
551
64.7k
            H264_PRED(14)
552
64.7k
            break;
553
162k
        default:
554
162k
            av_assert0(bit_depth<=8);
555
162k
            H264_PRED(8)
556
162k
            switch (codec_id) {
557
2.64k
            case AV_CODEC_ID_SVQ3:
558
2.64k
                h->pred4x4[DIAG_DOWN_LEFT_PRED] = FUNCD(pred4x4_down_left_svq3);
559
2.64k
                h->pred16x16[PLANE_PRED8x8    ] = FUNCD(pred16x16_plane_svq3);
560
2.64k
                break;
561
8.52k
            case AV_CODEC_ID_RV40:
562
8.52k
                h->pred4x4[DIAG_DOWN_LEFT_PRED] = FUNCD(pred4x4_down_left_rv40);
563
8.52k
                h->pred4x4[VERT_LEFT_PRED     ] = FUNCD(pred4x4_vertical_left_rv40);
564
8.52k
                h->pred4x4[HOR_UP_PRED        ] = FUNCD(pred4x4_horizontal_up_rv40);
565
8.52k
                h->pred4x4[DIAG_DOWN_LEFT_PRED_RV40_NODOWN] = FUNCD(pred4x4_down_left_rv40_nodown);
566
8.52k
                h->pred4x4[HOR_UP_PRED_RV40_NODOWN] = FUNCD(pred4x4_horizontal_up_rv40_nodown);
567
8.52k
                h->pred4x4[VERT_LEFT_PRED_RV40_NODOWN] = FUNCD(pred4x4_vertical_left_rv40_nodown);
568
8.52k
                h->pred16x16[PLANE_PRED8x8    ] = FUNCD(pred16x16_plane_rv40);
569
8.52k
                break;
570
6.23k
            case AV_CODEC_ID_VP7:
571
14.5k
            case AV_CODEC_ID_VP8:
572
14.5k
                h->pred4x4[VERT_PRED       ] = FUNCD(pred4x4_vertical_vp8);
573
14.5k
                h->pred4x4[HOR_PRED        ] = FUNCD(pred4x4_horizontal_vp8);
574
14.5k
                h->pred4x4[VERT_LEFT_PRED  ] = FUNCD(pred4x4_vertical_left_vp8);
575
14.5k
                h->pred4x4[TM_VP8_PRED     ] = FUNCD(pred4x4_tm_vp8);
576
14.5k
                h->pred4x4[VERT_VP8_PRED   ] = FUNCC(pred4x4_vertical, 8);
577
14.5k
                h->pred4x4[DC_127_PRED     ] = FUNCD(pred4x4_127_dc);
578
14.5k
                h->pred4x4[DC_129_PRED     ] = FUNCD(pred4x4_129_dc);
579
14.5k
                h->pred4x4[HOR_VP8_PRED    ] = FUNCC(pred4x4_horizontal, 8);
580
14.5k
                h->pred8x8[PLANE_PRED8x8   ] = FUNCD(pred8x8_tm_vp8);
581
14.5k
                h->pred8x8[DC_127_PRED8x8  ] = FUNCC(pred8x8_127_dc, 8);
582
14.5k
                h->pred8x8[DC_129_PRED8x8  ] = FUNCC(pred8x8_129_dc, 8);
583
14.5k
                h->pred16x16[PLANE_PRED8x8 ] = FUNCD(pred16x16_tm_vp8);
584
14.5k
                h->pred16x16[DC_127_PRED8x8] = FUNCC(pred16x16_127_dc, 8);
585
14.5k
                h->pred16x16[DC_129_PRED8x8] = FUNCC(pred16x16_129_dc, 8);
586
14.5k
                break;
587
162k
            }
588
162k
            break;
589
413k
    }
590
591
#if ARCH_AARCH64
592
    ff_h264_pred_init_aarch64(h, codec_id, bit_depth, chroma_format_idc);
593
#elif ARCH_ARM
594
    ff_h264_pred_init_arm(h, codec_id, bit_depth, chroma_format_idc);
595
#elif ARCH_X86
596
413k
    ff_h264_pred_init_x86(h, codec_id, bit_depth, chroma_format_idc);
597
#elif ARCH_MIPS
598
    ff_h264_pred_init_mips(h, codec_id, bit_depth, chroma_format_idc);
599
#elif ARCH_LOONGARCH
600
    ff_h264_pred_init_loongarch(h, codec_id, bit_depth, chroma_format_idc);
601
#endif
602
413k
}