intrapred.c revision 7ce0a1d1337c01056ba24006efab21f00e179e04
1/*
2 *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "./vpx_config.h"
12#include "./vpx_dsp_rtcd.h"
13
14#include "vpx_dsp/vpx_dsp_common.h"
15#include "vpx_mem/vpx_mem.h"
16
17#define DST(x, y) dst[(x) + (y) * stride]
18#define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2)
19#define AVG2(a, b) (((a) + (b) + 1) >> 1)
20
21static INLINE void d207_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
22                                  const uint8_t *above, const uint8_t *left) {
23  int r, c;
24  (void) above;
25  // first column
26  for (r = 0; r < bs - 1; ++r)
27    dst[r * stride] = AVG2(left[r], left[r + 1]);
28  dst[(bs - 1) * stride] = left[bs - 1];
29  dst++;
30
31  // second column
32  for (r = 0; r < bs - 2; ++r)
33    dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
34  dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
35  dst[(bs - 1) * stride] = left[bs - 1];
36  dst++;
37
38  // rest of last row
39  for (c = 0; c < bs - 2; ++c)
40    dst[(bs - 1) * stride + c] = left[bs - 1];
41
42  for (r = bs - 2; r >= 0; --r)
43    for (c = 0; c < bs - 2; ++c)
44      dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
45}
46
47static INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
48                                 const uint8_t *above, const uint8_t *left) {
49  int r, c;
50  int size;
51  (void)left;
52  for (c = 0; c < bs; ++c) {
53    dst[c] = AVG2(above[c], above[c + 1]);
54    dst[stride + c] = AVG3(above[c], above[c + 1], above[c + 2]);
55  }
56  for (r = 2, size = bs - 2; r < bs; r += 2, --size) {
57    memcpy(dst + (r + 0) * stride, dst + (r >> 1), size);
58    memset(dst + (r + 0) * stride + size, above[bs - 1], bs - size);
59    memcpy(dst + (r + 1) * stride, dst + stride + (r >> 1), size);
60    memset(dst + (r + 1) * stride + size, above[bs - 1], bs - size);
61  }
62}
63
64static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
65                                 const uint8_t *above, const uint8_t *left) {
66  const uint8_t above_right = above[bs - 1];
67  const uint8_t *const dst_row0 = dst;
68  int x, size;
69  (void)left;
70
71  for (x = 0; x < bs - 1; ++x) {
72    dst[x] = AVG3(above[x], above[x + 1], above[x + 2]);
73  }
74  dst[bs - 1] = above_right;
75  dst += stride;
76  for (x = 1, size = bs - 2; x < bs; ++x, --size) {
77    memcpy(dst, dst_row0 + x, size);
78    memset(dst + size, above_right, x + 1);
79    dst += stride;
80  }
81}
82
83static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
84                                  const uint8_t *above, const uint8_t *left) {
85  int r, c;
86
87  // first row
88  for (c = 0; c < bs; c++)
89    dst[c] = AVG2(above[c - 1], above[c]);
90  dst += stride;
91
92  // second row
93  dst[0] = AVG3(left[0], above[-1], above[0]);
94  for (c = 1; c < bs; c++)
95    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
96  dst += stride;
97
98  // the rest of first col
99  dst[0] = AVG3(above[-1], left[0], left[1]);
100  for (r = 3; r < bs; ++r)
101    dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
102
103  // the rest of the block
104  for (r = 2; r < bs; ++r) {
105    for (c = 1; c < bs; c++)
106      dst[c] = dst[-2 * stride + c - 1];
107    dst += stride;
108  }
109}
110
111static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
112                                  const uint8_t *above, const uint8_t *left) {
113  int r, c;
114  dst[0] = AVG3(left[0], above[-1], above[0]);
115  for (c = 1; c < bs; c++)
116    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
117
118  dst[stride] = AVG3(above[-1], left[0], left[1]);
119  for (r = 2; r < bs; ++r)
120    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
121
122  dst += stride;
123  for (r = 1; r < bs; ++r) {
124    for (c = 1; c < bs; c++)
125      dst[c] = dst[-stride + c - 1];
126    dst += stride;
127  }
128}
129
130static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
131                                  const uint8_t *above, const uint8_t *left) {
132  int r, c;
133  dst[0] = AVG2(above[-1], left[0]);
134  for (r = 1; r < bs; r++)
135    dst[r * stride] = AVG2(left[r - 1], left[r]);
136  dst++;
137
138  dst[0] = AVG3(left[0], above[-1], above[0]);
139  dst[stride] = AVG3(above[-1], left[0], left[1]);
140  for (r = 2; r < bs; r++)
141    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
142  dst++;
143
144  for (c = 0; c < bs - 2; c++)
145    dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
146  dst += stride;
147
148  for (r = 1; r < bs; ++r) {
149    for (c = 0; c < bs - 2; c++)
150      dst[c] = dst[-stride + c - 2];
151    dst += stride;
152  }
153}
154
155static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
156                               const uint8_t *above, const uint8_t *left) {
157  int r;
158  (void) left;
159
160  for (r = 0; r < bs; r++) {
161    memcpy(dst, above, bs);
162    dst += stride;
163  }
164}
165
166static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
167                               const uint8_t *above, const uint8_t *left) {
168  int r;
169  (void) above;
170
171  for (r = 0; r < bs; r++) {
172    memset(dst, left[r], bs);
173    dst += stride;
174  }
175}
176
177static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
178                                const uint8_t *above, const uint8_t *left) {
179  int r, c;
180  int ytop_left = above[-1];
181
182  for (r = 0; r < bs; r++) {
183    for (c = 0; c < bs; c++)
184      dst[c] = clip_pixel(left[r] + above[c] - ytop_left);
185    dst += stride;
186  }
187}
188
189static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
190                                    const uint8_t *above, const uint8_t *left) {
191  int r;
192  (void) above;
193  (void) left;
194
195  for (r = 0; r < bs; r++) {
196    memset(dst, 128, bs);
197    dst += stride;
198  }
199}
200
201static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
202                                     const uint8_t *above,
203                                     const uint8_t *left) {
204  int i, r, expected_dc, sum = 0;
205  (void) above;
206
207  for (i = 0; i < bs; i++)
208    sum += left[i];
209  expected_dc = (sum + (bs >> 1)) / bs;
210
211  for (r = 0; r < bs; r++) {
212    memset(dst, expected_dc, bs);
213    dst += stride;
214  }
215}
216
217static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
218                                    const uint8_t *above, const uint8_t *left) {
219  int i, r, expected_dc, sum = 0;
220  (void) left;
221
222  for (i = 0; i < bs; i++)
223    sum += above[i];
224  expected_dc = (sum + (bs >> 1)) / bs;
225
226  for (r = 0; r < bs; r++) {
227    memset(dst, expected_dc, bs);
228    dst += stride;
229  }
230}
231
232static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
233                                const uint8_t *above, const uint8_t *left) {
234  int i, r, expected_dc, sum = 0;
235  const int count = 2 * bs;
236
237  for (i = 0; i < bs; i++) {
238    sum += above[i];
239    sum += left[i];
240  }
241
242  expected_dc = (sum + (count >> 1)) / count;
243
244  for (r = 0; r < bs; r++) {
245    memset(dst, expected_dc, bs);
246    dst += stride;
247  }
248}
249
250void vpx_d207_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
251                              const uint8_t *above, const uint8_t *left) {
252  const int I = left[0];
253  const int J = left[1];
254  const int K = left[2];
255  const int L = left[3];
256  (void)above;
257  DST(0, 0) =             AVG2(I, J);
258  DST(2, 0) = DST(0, 1) = AVG2(J, K);
259  DST(2, 1) = DST(0, 2) = AVG2(K, L);
260  DST(1, 0) =             AVG3(I, J, K);
261  DST(3, 0) = DST(1, 1) = AVG3(J, K, L);
262  DST(3, 1) = DST(1, 2) = AVG3(K, L, L);
263  DST(3, 2) = DST(2, 2) =
264      DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L;
265}
266
267void vpx_d63_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
268                             const uint8_t *above, const uint8_t *left) {
269  const int A = above[0];
270  const int B = above[1];
271  const int C = above[2];
272  const int D = above[3];
273  const int E = above[4];
274  const int F = above[5];
275  const int G = above[6];
276  (void)left;
277  DST(0, 0) =             AVG2(A, B);
278  DST(1, 0) = DST(0, 2) = AVG2(B, C);
279  DST(2, 0) = DST(1, 2) = AVG2(C, D);
280  DST(3, 0) = DST(2, 2) = AVG2(D, E);
281              DST(3, 2) = AVG2(E, F);  // differs from vp8
282
283  DST(0, 1) =             AVG3(A, B, C);
284  DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
285  DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
286  DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
287              DST(3, 3) = AVG3(E, F, G);  // differs from vp8
288}
289
290void vpx_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
291                             const uint8_t *above, const uint8_t *left) {
292  const int A = above[0];
293  const int B = above[1];
294  const int C = above[2];
295  const int D = above[3];
296  const int E = above[4];
297  const int F = above[5];
298  const int G = above[6];
299  const int H = above[7];
300  (void)stride;
301  (void)left;
302  DST(0, 0)                                     = AVG3(A, B, C);
303  DST(1, 0) = DST(0, 1)                         = AVG3(B, C, D);
304  DST(2, 0) = DST(1, 1) = DST(0, 2)             = AVG3(C, D, E);
305  DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
306              DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
307                          DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
308                                      DST(3, 3) = H;  // differs from vp8
309}
310
311void vpx_d117_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
312                              const uint8_t *above, const uint8_t *left) {
313  const int I = left[0];
314  const int J = left[1];
315  const int K = left[2];
316  const int X = above[-1];
317  const int A = above[0];
318  const int B = above[1];
319  const int C = above[2];
320  const int D = above[3];
321  DST(0, 0) = DST(1, 2) = AVG2(X, A);
322  DST(1, 0) = DST(2, 2) = AVG2(A, B);
323  DST(2, 0) = DST(3, 2) = AVG2(B, C);
324  DST(3, 0)             = AVG2(C, D);
325
326  DST(0, 3) =             AVG3(K, J, I);
327  DST(0, 2) =             AVG3(J, I, X);
328  DST(0, 1) = DST(1, 3) = AVG3(I, X, A);
329  DST(1, 1) = DST(2, 3) = AVG3(X, A, B);
330  DST(2, 1) = DST(3, 3) = AVG3(A, B, C);
331  DST(3, 1) =             AVG3(B, C, D);
332}
333
334void vpx_d135_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
335                              const uint8_t *above, const uint8_t *left) {
336  const int I = left[0];
337  const int J = left[1];
338  const int K = left[2];
339  const int L = left[3];
340  const int X = above[-1];
341  const int A = above[0];
342  const int B = above[1];
343  const int C = above[2];
344  const int D = above[3];
345  (void)stride;
346  DST(0, 3)                                     = AVG3(J, K, L);
347  DST(1, 3) = DST(0, 2)                         = AVG3(I, J, K);
348  DST(2, 3) = DST(1, 2) = DST(0, 1)             = AVG3(X, I, J);
349  DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I);
350              DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X);
351                          DST(3, 1) = DST(2, 0) = AVG3(C, B, A);
352                                      DST(3, 0) = AVG3(D, C, B);
353}
354
355void vpx_d153_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
356                              const uint8_t *above, const uint8_t *left) {
357  const int I = left[0];
358  const int J = left[1];
359  const int K = left[2];
360  const int L = left[3];
361  const int X = above[-1];
362  const int A = above[0];
363  const int B = above[1];
364  const int C = above[2];
365
366  DST(0, 0) = DST(2, 1) = AVG2(I, X);
367  DST(0, 1) = DST(2, 2) = AVG2(J, I);
368  DST(0, 2) = DST(2, 3) = AVG2(K, J);
369  DST(0, 3)             = AVG2(L, K);
370
371  DST(3, 0)             = AVG3(A, B, C);
372  DST(2, 0)             = AVG3(X, A, B);
373  DST(1, 0) = DST(3, 1) = AVG3(I, X, A);
374  DST(1, 1) = DST(3, 2) = AVG3(J, I, X);
375  DST(1, 2) = DST(3, 3) = AVG3(K, J, I);
376  DST(1, 3)             = AVG3(L, K, J);
377}
378
379#if CONFIG_VP9_HIGHBITDEPTH
380static INLINE void highbd_d207_predictor(uint16_t *dst, ptrdiff_t stride,
381                                         int bs, const uint16_t *above,
382                                         const uint16_t *left, int bd) {
383  int r, c;
384  (void) above;
385  (void) bd;
386
387  // First column.
388  for (r = 0; r < bs - 1; ++r) {
389    dst[r * stride] = AVG2(left[r], left[r + 1]);
390  }
391  dst[(bs - 1) * stride] = left[bs - 1];
392  dst++;
393
394  // Second column.
395  for (r = 0; r < bs - 2; ++r) {
396    dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
397  }
398  dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
399  dst[(bs - 1) * stride] = left[bs - 1];
400  dst++;
401
402  // Rest of last row.
403  for (c = 0; c < bs - 2; ++c)
404    dst[(bs - 1) * stride + c] = left[bs - 1];
405
406  for (r = bs - 2; r >= 0; --r) {
407    for (c = 0; c < bs - 2; ++c)
408      dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
409  }
410}
411
412static INLINE void highbd_d63_predictor(uint16_t *dst, ptrdiff_t stride,
413                                        int bs, const uint16_t *above,
414                                        const uint16_t *left, int bd) {
415  int r, c;
416  (void) left;
417  (void) bd;
418  for (r = 0; r < bs; ++r) {
419    for (c = 0; c < bs; ++c) {
420      dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1],
421                            above[(r >> 1) + c + 2])
422          : AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]);
423    }
424    dst += stride;
425  }
426}
427
428static INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
429                                        const uint16_t *above,
430                                        const uint16_t *left, int bd) {
431  int r, c;
432  (void) left;
433  (void) bd;
434  for (r = 0; r < bs; ++r) {
435    for (c = 0; c < bs; ++c) {
436      dst[c] = r + c + 2 < bs * 2 ? AVG3(above[r + c], above[r + c + 1],
437                                         above[r + c + 2])
438          : above[bs * 2 - 1];
439    }
440    dst += stride;
441  }
442}
443
444static INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride,
445                                         int bs, const uint16_t *above,
446                                         const uint16_t *left, int bd) {
447  int r, c;
448  (void) bd;
449
450  // first row
451  for (c = 0; c < bs; c++)
452    dst[c] = AVG2(above[c - 1], above[c]);
453  dst += stride;
454
455  // second row
456  dst[0] = AVG3(left[0], above[-1], above[0]);
457  for (c = 1; c < bs; c++)
458    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
459  dst += stride;
460
461  // the rest of first col
462  dst[0] = AVG3(above[-1], left[0], left[1]);
463  for (r = 3; r < bs; ++r)
464    dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
465
466  // the rest of the block
467  for (r = 2; r < bs; ++r) {
468    for (c = 1; c < bs; c++)
469      dst[c] = dst[-2 * stride + c - 1];
470    dst += stride;
471  }
472}
473
474static INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride,
475                                         int bs, const uint16_t *above,
476                                         const uint16_t *left, int bd) {
477  int r, c;
478  (void) bd;
479  dst[0] = AVG3(left[0], above[-1], above[0]);
480  for (c = 1; c < bs; c++)
481    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
482
483  dst[stride] = AVG3(above[-1], left[0], left[1]);
484  for (r = 2; r < bs; ++r)
485    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
486
487  dst += stride;
488  for (r = 1; r < bs; ++r) {
489    for (c = 1; c < bs; c++)
490      dst[c] = dst[-stride + c - 1];
491    dst += stride;
492  }
493}
494
495static INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride,
496                                         int bs, const uint16_t *above,
497                                         const uint16_t *left, int bd) {
498  int r, c;
499  (void) bd;
500  dst[0] = AVG2(above[-1], left[0]);
501  for (r = 1; r < bs; r++)
502    dst[r * stride] = AVG2(left[r - 1], left[r]);
503  dst++;
504
505  dst[0] = AVG3(left[0], above[-1], above[0]);
506  dst[stride] = AVG3(above[-1], left[0], left[1]);
507  for (r = 2; r < bs; r++)
508    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
509  dst++;
510
511  for (c = 0; c < bs - 2; c++)
512    dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
513  dst += stride;
514
515  for (r = 1; r < bs; ++r) {
516    for (c = 0; c < bs - 2; c++)
517      dst[c] = dst[-stride + c - 2];
518    dst += stride;
519  }
520}
521
522static INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride,
523                                      int bs, const uint16_t *above,
524                                      const uint16_t *left, int bd) {
525  int r;
526  (void) left;
527  (void) bd;
528  for (r = 0; r < bs; r++) {
529    memcpy(dst, above, bs * sizeof(uint16_t));
530    dst += stride;
531  }
532}
533
534static INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride,
535                                      int bs, const uint16_t *above,
536                                      const uint16_t *left, int bd) {
537  int r;
538  (void) above;
539  (void) bd;
540  for (r = 0; r < bs; r++) {
541    vpx_memset16(dst, left[r], bs);
542    dst += stride;
543  }
544}
545
546static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride,
547                                       int bs, const uint16_t *above,
548                                       const uint16_t *left, int bd) {
549  int r, c;
550  int ytop_left = above[-1];
551  (void) bd;
552
553  for (r = 0; r < bs; r++) {
554    for (c = 0; c < bs; c++)
555      dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd);
556    dst += stride;
557  }
558}
559
560static INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride,
561                                           int bs, const uint16_t *above,
562                                           const uint16_t *left, int bd) {
563  int r;
564  (void) above;
565  (void) left;
566
567  for (r = 0; r < bs; r++) {
568    vpx_memset16(dst, 128 << (bd - 8), bs);
569    dst += stride;
570  }
571}
572
573static INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride,
574                                            int bs, const uint16_t *above,
575                                            const uint16_t *left, int bd) {
576  int i, r, expected_dc, sum = 0;
577  (void) above;
578  (void) bd;
579
580  for (i = 0; i < bs; i++)
581    sum += left[i];
582  expected_dc = (sum + (bs >> 1)) / bs;
583
584  for (r = 0; r < bs; r++) {
585    vpx_memset16(dst, expected_dc, bs);
586    dst += stride;
587  }
588}
589
590static INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride,
591                                           int bs, const uint16_t *above,
592                                           const uint16_t *left, int bd) {
593  int i, r, expected_dc, sum = 0;
594  (void) left;
595  (void) bd;
596
597  for (i = 0; i < bs; i++)
598    sum += above[i];
599  expected_dc = (sum + (bs >> 1)) / bs;
600
601  for (r = 0; r < bs; r++) {
602    vpx_memset16(dst, expected_dc, bs);
603    dst += stride;
604  }
605}
606
607static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride,
608                                       int bs, const uint16_t *above,
609                                       const uint16_t *left, int bd) {
610  int i, r, expected_dc, sum = 0;
611  const int count = 2 * bs;
612  (void) bd;
613
614  for (i = 0; i < bs; i++) {
615    sum += above[i];
616    sum += left[i];
617  }
618
619  expected_dc = (sum + (count >> 1)) / count;
620
621  for (r = 0; r < bs; r++) {
622    vpx_memset16(dst, expected_dc, bs);
623    dst += stride;
624  }
625}
626#endif  // CONFIG_VP9_HIGHBITDEPTH
627
628// This serves as a wrapper function, so that all the prediction functions
629// can be unified and accessed as a pointer array. Note that the boundary
630// above and left are not necessarily used all the time.
631#define intra_pred_sized(type, size) \
632  void vpx_##type##_predictor_##size##x##size##_c(uint8_t *dst, \
633                                                  ptrdiff_t stride, \
634                                                  const uint8_t *above, \
635                                                  const uint8_t *left) { \
636    type##_predictor(dst, stride, size, above, left); \
637  }
638
639#if CONFIG_VP9_HIGHBITDEPTH
640#define intra_pred_highbd_sized(type, size) \
641  void vpx_highbd_##type##_predictor_##size##x##size##_c( \
642      uint16_t *dst, ptrdiff_t stride, const uint16_t *above, \
643      const uint16_t *left, int bd) { \
644    highbd_##type##_predictor(dst, stride, size, above, left, bd); \
645  }
646
647#define intra_pred_allsizes(type) \
648  intra_pred_sized(type, 4) \
649  intra_pred_sized(type, 8) \
650  intra_pred_sized(type, 16) \
651  intra_pred_sized(type, 32) \
652  intra_pred_highbd_sized(type, 4) \
653  intra_pred_highbd_sized(type, 8) \
654  intra_pred_highbd_sized(type, 16) \
655  intra_pred_highbd_sized(type, 32)
656
657#define intra_pred_no_4x4(type) \
658  intra_pred_sized(type, 8) \
659  intra_pred_sized(type, 16) \
660  intra_pred_sized(type, 32) \
661  intra_pred_highbd_sized(type, 4) \
662  intra_pred_highbd_sized(type, 8) \
663  intra_pred_highbd_sized(type, 16) \
664  intra_pred_highbd_sized(type, 32)
665
666#else
667#define intra_pred_allsizes(type) \
668  intra_pred_sized(type, 4) \
669  intra_pred_sized(type, 8) \
670  intra_pred_sized(type, 16) \
671  intra_pred_sized(type, 32)
672
673#define intra_pred_no_4x4(type) \
674  intra_pred_sized(type, 8) \
675  intra_pred_sized(type, 16) \
676  intra_pred_sized(type, 32)
677#endif  // CONFIG_VP9_HIGHBITDEPTH
678
679intra_pred_no_4x4(d207)
680intra_pred_no_4x4(d63)
681intra_pred_no_4x4(d45)
682intra_pred_no_4x4(d117)
683intra_pred_no_4x4(d135)
684intra_pred_no_4x4(d153)
685intra_pred_allsizes(v)
686intra_pred_allsizes(h)
687intra_pred_allsizes(tm)
688intra_pred_allsizes(dc_128)
689intra_pred_allsizes(dc_left)
690intra_pred_allsizes(dc_top)
691intra_pred_allsizes(dc)
692#undef intra_pred_allsizes
693