• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
d207_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)21 static 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) dst[r * stride] = AVG2(left[r], left[r + 1]);
27   dst[(bs - 1) * stride] = left[bs - 1];
28   dst++;
29 
30   // second column
31   for (r = 0; r < bs - 2; ++r)
32     dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
33   dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
34   dst[(bs - 1) * stride] = left[bs - 1];
35   dst++;
36 
37   // rest of last row
38   for (c = 0; c < bs - 2; ++c) dst[(bs - 1) * stride + c] = left[bs - 1];
39 
40   for (r = bs - 2; r >= 0; --r)
41     for (c = 0; c < bs - 2; ++c)
42       dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
43 }
44 
d63_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)45 static INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
46                                  const uint8_t *above, const uint8_t *left) {
47   int r, c;
48   int size;
49   (void)left;
50   for (c = 0; c < bs; ++c) {
51     dst[c] = AVG2(above[c], above[c + 1]);
52     dst[stride + c] = AVG3(above[c], above[c + 1], above[c + 2]);
53   }
54   for (r = 2, size = bs - 2; r < bs; r += 2, --size) {
55     memcpy(dst + (r + 0) * stride, dst + (r >> 1), size);
56     memset(dst + (r + 0) * stride + size, above[bs - 1], bs - size);
57     memcpy(dst + (r + 1) * stride, dst + stride + (r >> 1), size);
58     memset(dst + (r + 1) * stride + size, above[bs - 1], bs - size);
59   }
60 }
61 
d45_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)62 static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
63                                  const uint8_t *above, const uint8_t *left) {
64   const uint8_t above_right = above[bs - 1];
65   const uint8_t *const dst_row0 = dst;
66   int x, size;
67   (void)left;
68 
69   for (x = 0; x < bs - 1; ++x) {
70     dst[x] = AVG3(above[x], above[x + 1], above[x + 2]);
71   }
72   dst[bs - 1] = above_right;
73   dst += stride;
74   for (x = 1, size = bs - 2; x < bs; ++x, --size) {
75     memcpy(dst, dst_row0 + x, size);
76     memset(dst + size, above_right, x + 1);
77     dst += stride;
78   }
79 }
80 
d117_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)81 static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
82                                   const uint8_t *above, const uint8_t *left) {
83   int r, c;
84 
85   // first row
86   for (c = 0; c < bs; c++) dst[c] = AVG2(above[c - 1], above[c]);
87   dst += stride;
88 
89   // second row
90   dst[0] = AVG3(left[0], above[-1], above[0]);
91   for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
92   dst += stride;
93 
94   // the rest of first col
95   dst[0] = AVG3(above[-1], left[0], left[1]);
96   for (r = 3; r < bs; ++r)
97     dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
98 
99   // the rest of the block
100   for (r = 2; r < bs; ++r) {
101     for (c = 1; c < bs; c++) dst[c] = dst[-2 * stride + c - 1];
102     dst += stride;
103   }
104 }
105 
d135_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)106 static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
107                                   const uint8_t *above, const uint8_t *left) {
108   int i;
109 #if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
110   // silence a spurious -Warray-bounds warning, possibly related to:
111   // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
112   uint8_t border[69];
113 #else
114   uint8_t border[32 + 32 - 1];  // outer border from bottom-left to top-right
115 #endif
116 
117   // dst(bs, bs - 2)[0], i.e., border starting at bottom-left
118   for (i = 0; i < bs - 2; ++i) {
119     border[i] = AVG3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]);
120   }
121   border[bs - 2] = AVG3(above[-1], left[0], left[1]);
122   border[bs - 1] = AVG3(left[0], above[-1], above[0]);
123   border[bs - 0] = AVG3(above[-1], above[0], above[1]);
124   // dst[0][2, size), i.e., remaining top border ascending
125   for (i = 0; i < bs - 2; ++i) {
126     border[bs + 1 + i] = AVG3(above[i], above[i + 1], above[i + 2]);
127   }
128 
129   for (i = 0; i < bs; ++i) {
130     memcpy(dst + i * stride, border + bs - 1 - i, bs);
131   }
132 }
133 
d153_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)134 static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
135                                   const uint8_t *above, const uint8_t *left) {
136   int r, c;
137   dst[0] = AVG2(above[-1], left[0]);
138   for (r = 1; r < bs; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
139   dst++;
140 
141   dst[0] = AVG3(left[0], above[-1], above[0]);
142   dst[stride] = AVG3(above[-1], left[0], left[1]);
143   for (r = 2; r < bs; r++)
144     dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
145   dst++;
146 
147   for (c = 0; c < bs - 2; c++)
148     dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
149   dst += stride;
150 
151   for (r = 1; r < bs; ++r) {
152     for (c = 0; c < bs - 2; c++) dst[c] = dst[-stride + c - 2];
153     dst += stride;
154   }
155 }
156 
v_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)157 static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
158                                const uint8_t *above, const uint8_t *left) {
159   int r;
160   (void)left;
161 
162   for (r = 0; r < bs; r++) {
163     memcpy(dst, above, bs);
164     dst += stride;
165   }
166 }
167 
h_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)168 static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
169                                const uint8_t *above, const uint8_t *left) {
170   int r;
171   (void)above;
172 
173   for (r = 0; r < bs; r++) {
174     memset(dst, left[r], bs);
175     dst += stride;
176   }
177 }
178 
tm_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)179 static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
180                                 const uint8_t *above, const uint8_t *left) {
181   int r, c;
182   int ytop_left = above[-1];
183 
184   for (r = 0; r < bs; r++) {
185     for (c = 0; c < bs; c++)
186       dst[c] = clip_pixel(left[r] + above[c] - ytop_left);
187     dst += stride;
188   }
189 }
190 
dc_128_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)191 static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
192                                     const uint8_t *above, const uint8_t *left) {
193   int r;
194   (void)above;
195   (void)left;
196 
197   for (r = 0; r < bs; r++) {
198     memset(dst, 128, bs);
199     dst += stride;
200   }
201 }
202 
dc_left_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)203 static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
204                                      const uint8_t *above,
205                                      const uint8_t *left) {
206   int i, r, expected_dc, sum = 0;
207   (void)above;
208 
209   for (i = 0; i < bs; i++) sum += left[i];
210   expected_dc = (sum + (bs >> 1)) / bs;
211 
212   for (r = 0; r < bs; r++) {
213     memset(dst, expected_dc, bs);
214     dst += stride;
215   }
216 }
217 
dc_top_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)218 static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
219                                     const uint8_t *above, const uint8_t *left) {
220   int i, r, expected_dc, sum = 0;
221   (void)left;
222 
223   for (i = 0; i < bs; i++) 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 
dc_predictor(uint8_t * dst,ptrdiff_t stride,int bs,const uint8_t * above,const uint8_t * left)232 static 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 
vpx_he_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)250 void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
251                             const uint8_t *above, const uint8_t *left) {
252   const int H = above[-1];
253   const int I = left[0];
254   const int J = left[1];
255   const int K = left[2];
256   const int L = left[3];
257 
258   memset(dst + stride * 0, AVG3(H, I, J), 4);
259   memset(dst + stride * 1, AVG3(I, J, K), 4);
260   memset(dst + stride * 2, AVG3(J, K, L), 4);
261   memset(dst + stride * 3, AVG3(K, L, L), 4);
262 }
263 
vpx_ve_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)264 void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
265                             const uint8_t *above, const uint8_t *left) {
266   const int H = above[-1];
267   const int I = above[0];
268   const int J = above[1];
269   const int K = above[2];
270   const int L = above[3];
271   const int M = above[4];
272   (void)left;
273 
274   dst[0] = AVG3(H, I, J);
275   dst[1] = AVG3(I, J, K);
276   dst[2] = AVG3(J, K, L);
277   dst[3] = AVG3(K, L, M);
278   memcpy(dst + stride * 1, dst, 4);
279   memcpy(dst + stride * 2, dst, 4);
280   memcpy(dst + stride * 3, dst, 4);
281 }
282 
vpx_d207_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)283 void vpx_d207_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
284                               const uint8_t *above, const uint8_t *left) {
285   const int I = left[0];
286   const int J = left[1];
287   const int K = left[2];
288   const int L = left[3];
289   (void)above;
290   DST(0, 0) = AVG2(I, J);
291   DST(2, 0) = DST(0, 1) = AVG2(J, K);
292   DST(2, 1) = DST(0, 2) = AVG2(K, L);
293   DST(1, 0) = AVG3(I, J, K);
294   DST(3, 0) = DST(1, 1) = AVG3(J, K, L);
295   DST(3, 1) = DST(1, 2) = AVG3(K, L, L);
296   DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L;
297 }
298 
vpx_d63_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)299 void vpx_d63_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
300                              const uint8_t *above, const uint8_t *left) {
301   const int A = above[0];
302   const int B = above[1];
303   const int C = above[2];
304   const int D = above[3];
305   const int E = above[4];
306   const int F = above[5];
307   const int G = above[6];
308   (void)left;
309   DST(0, 0) = AVG2(A, B);
310   DST(1, 0) = DST(0, 2) = AVG2(B, C);
311   DST(2, 0) = DST(1, 2) = AVG2(C, D);
312   DST(3, 0) = DST(2, 2) = AVG2(D, E);
313   DST(3, 2) = AVG2(E, F);  // differs from vp8
314 
315   DST(0, 1) = AVG3(A, B, C);
316   DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
317   DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
318   DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
319   DST(3, 3) = AVG3(E, F, G);  // differs from vp8
320 }
321 
vpx_d63e_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)322 void vpx_d63e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
323                               const uint8_t *above, const uint8_t *left) {
324   const int A = above[0];
325   const int B = above[1];
326   const int C = above[2];
327   const int D = above[3];
328   const int E = above[4];
329   const int F = above[5];
330   const int G = above[6];
331   const int H = above[7];
332   (void)left;
333   DST(0, 0) = AVG2(A, B);
334   DST(1, 0) = DST(0, 2) = AVG2(B, C);
335   DST(2, 0) = DST(1, 2) = AVG2(C, D);
336   DST(3, 0) = DST(2, 2) = AVG2(D, E);
337   DST(3, 2) = AVG3(E, F, G);
338 
339   DST(0, 1) = AVG3(A, B, C);
340   DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
341   DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
342   DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
343   DST(3, 3) = AVG3(F, G, H);
344 }
345 
vpx_d45_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)346 void vpx_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
347                              const uint8_t *above, const uint8_t *left) {
348   const int A = above[0];
349   const int B = above[1];
350   const int C = above[2];
351   const int D = above[3];
352   const int E = above[4];
353   const int F = above[5];
354   const int G = above[6];
355   const int H = above[7];
356   (void)stride;
357   (void)left;
358   DST(0, 0) = AVG3(A, B, C);
359   DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
360   DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
361   DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
362   DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
363   DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
364   DST(3, 3) = H;  // differs from vp8
365 }
366 
vpx_d45e_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)367 void vpx_d45e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
368                               const uint8_t *above, const uint8_t *left) {
369   const int A = above[0];
370   const int B = above[1];
371   const int C = above[2];
372   const int D = above[3];
373   const int E = above[4];
374   const int F = above[5];
375   const int G = above[6];
376   const int H = above[7];
377   (void)stride;
378   (void)left;
379   DST(0, 0) = AVG3(A, B, C);
380   DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
381   DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
382   DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
383   DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
384   DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
385   DST(3, 3) = AVG3(G, H, H);
386 }
387 
vpx_d117_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)388 void vpx_d117_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
389                               const uint8_t *above, const uint8_t *left) {
390   const int I = left[0];
391   const int J = left[1];
392   const int K = left[2];
393   const int X = above[-1];
394   const int A = above[0];
395   const int B = above[1];
396   const int C = above[2];
397   const int D = above[3];
398   DST(0, 0) = DST(1, 2) = AVG2(X, A);
399   DST(1, 0) = DST(2, 2) = AVG2(A, B);
400   DST(2, 0) = DST(3, 2) = AVG2(B, C);
401   DST(3, 0) = AVG2(C, D);
402 
403   DST(0, 3) = AVG3(K, J, I);
404   DST(0, 2) = AVG3(J, I, X);
405   DST(0, 1) = DST(1, 3) = AVG3(I, X, A);
406   DST(1, 1) = DST(2, 3) = AVG3(X, A, B);
407   DST(2, 1) = DST(3, 3) = AVG3(A, B, C);
408   DST(3, 1) = AVG3(B, C, D);
409 }
410 
vpx_d135_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)411 void vpx_d135_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
412                               const uint8_t *above, const uint8_t *left) {
413   const int I = left[0];
414   const int J = left[1];
415   const int K = left[2];
416   const int L = left[3];
417   const int X = above[-1];
418   const int A = above[0];
419   const int B = above[1];
420   const int C = above[2];
421   const int D = above[3];
422   (void)stride;
423   DST(0, 3) = AVG3(J, K, L);
424   DST(1, 3) = DST(0, 2) = AVG3(I, J, K);
425   DST(2, 3) = DST(1, 2) = DST(0, 1) = AVG3(X, I, J);
426   DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I);
427   DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X);
428   DST(3, 1) = DST(2, 0) = AVG3(C, B, A);
429   DST(3, 0) = AVG3(D, C, B);
430 }
431 
vpx_d153_predictor_4x4_c(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)432 void vpx_d153_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
433                               const uint8_t *above, const uint8_t *left) {
434   const int I = left[0];
435   const int J = left[1];
436   const int K = left[2];
437   const int L = left[3];
438   const int X = above[-1];
439   const int A = above[0];
440   const int B = above[1];
441   const int C = above[2];
442 
443   DST(0, 0) = DST(2, 1) = AVG2(I, X);
444   DST(0, 1) = DST(2, 2) = AVG2(J, I);
445   DST(0, 2) = DST(2, 3) = AVG2(K, J);
446   DST(0, 3) = AVG2(L, K);
447 
448   DST(3, 0) = AVG3(A, B, C);
449   DST(2, 0) = AVG3(X, A, B);
450   DST(1, 0) = DST(3, 1) = AVG3(I, X, A);
451   DST(1, 1) = DST(3, 2) = AVG3(J, I, X);
452   DST(1, 2) = DST(3, 3) = AVG3(K, J, I);
453   DST(1, 3) = AVG3(L, K, J);
454 }
455 
456 #if CONFIG_VP9_HIGHBITDEPTH
highbd_d207_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)457 static INLINE void highbd_d207_predictor(uint16_t *dst, ptrdiff_t stride,
458                                          int bs, const uint16_t *above,
459                                          const uint16_t *left, int bd) {
460   int r, c;
461   (void)above;
462   (void)bd;
463 
464   // First column.
465   for (r = 0; r < bs - 1; ++r) {
466     dst[r * stride] = AVG2(left[r], left[r + 1]);
467   }
468   dst[(bs - 1) * stride] = left[bs - 1];
469   dst++;
470 
471   // Second column.
472   for (r = 0; r < bs - 2; ++r) {
473     dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
474   }
475   dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
476   dst[(bs - 1) * stride] = left[bs - 1];
477   dst++;
478 
479   // Rest of last row.
480   for (c = 0; c < bs - 2; ++c) dst[(bs - 1) * stride + c] = left[bs - 1];
481 
482   for (r = bs - 2; r >= 0; --r) {
483     for (c = 0; c < bs - 2; ++c)
484       dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
485   }
486 }
487 
highbd_d63_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)488 static INLINE void highbd_d63_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
489                                         const uint16_t *above,
490                                         const uint16_t *left, int bd) {
491   int r, c;
492   (void)left;
493   (void)bd;
494   for (r = 0; r < bs; ++r) {
495     for (c = 0; c < bs; ++c) {
496       dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1],
497                             above[(r >> 1) + c + 2])
498                      : AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]);
499     }
500     dst += stride;
501   }
502 }
503 
highbd_d45_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)504 static INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
505                                         const uint16_t *above,
506                                         const uint16_t *left, int bd) {
507   int r, c;
508   (void)left;
509   (void)bd;
510   for (r = 0; r < bs; ++r) {
511     for (c = 0; c < bs; ++c) {
512       dst[c] = r + c + 2 < bs * 2
513                    ? AVG3(above[r + c], above[r + c + 1], above[r + c + 2])
514                    : above[bs * 2 - 1];
515     }
516     dst += stride;
517   }
518 }
519 
highbd_d117_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)520 static INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride,
521                                          int bs, const uint16_t *above,
522                                          const uint16_t *left, int bd) {
523   int r, c;
524   (void)bd;
525 
526   // first row
527   for (c = 0; c < bs; c++) dst[c] = AVG2(above[c - 1], above[c]);
528   dst += stride;
529 
530   // second row
531   dst[0] = AVG3(left[0], above[-1], above[0]);
532   for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
533   dst += stride;
534 
535   // the rest of first col
536   dst[0] = AVG3(above[-1], left[0], left[1]);
537   for (r = 3; r < bs; ++r)
538     dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
539 
540   // the rest of the block
541   for (r = 2; r < bs; ++r) {
542     for (c = 1; c < bs; c++) dst[c] = dst[-2 * stride + c - 1];
543     dst += stride;
544   }
545 }
546 
highbd_d135_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)547 static INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride,
548                                          int bs, const uint16_t *above,
549                                          const uint16_t *left, int bd) {
550   int i;
551 #if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
552   // silence a spurious -Warray-bounds warning, possibly related to:
553   // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
554   uint16_t border[69];
555 #else
556   uint16_t border[32 + 32 - 1];  // outer border from bottom-left to top-right
557 #endif
558   (void)bd;
559 
560   // dst(bs, bs - 2)[0], i.e., border starting at bottom-left
561   for (i = 0; i < bs - 2; ++i) {
562     border[i] = AVG3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]);
563   }
564   border[bs - 2] = AVG3(above[-1], left[0], left[1]);
565   border[bs - 1] = AVG3(left[0], above[-1], above[0]);
566   border[bs - 0] = AVG3(above[-1], above[0], above[1]);
567   // dst[0][2, size), i.e., remaining top border ascending
568   for (i = 0; i < bs - 2; ++i) {
569     border[bs + 1 + i] = AVG3(above[i], above[i + 1], above[i + 2]);
570   }
571 
572   for (i = 0; i < bs; ++i) {
573     memcpy(dst + i * stride, border + bs - 1 - i, bs * sizeof(dst[0]));
574   }
575 }
576 
highbd_d153_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)577 static INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride,
578                                          int bs, const uint16_t *above,
579                                          const uint16_t *left, int bd) {
580   int r, c;
581   (void)bd;
582   dst[0] = AVG2(above[-1], left[0]);
583   for (r = 1; r < bs; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
584   dst++;
585 
586   dst[0] = AVG3(left[0], above[-1], above[0]);
587   dst[stride] = AVG3(above[-1], left[0], left[1]);
588   for (r = 2; r < bs; r++)
589     dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
590   dst++;
591 
592   for (c = 0; c < bs - 2; c++)
593     dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
594   dst += stride;
595 
596   for (r = 1; r < bs; ++r) {
597     for (c = 0; c < bs - 2; c++) dst[c] = dst[-stride + c - 2];
598     dst += stride;
599   }
600 }
601 
highbd_v_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)602 static INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
603                                       const uint16_t *above,
604                                       const uint16_t *left, int bd) {
605   int r;
606   (void)left;
607   (void)bd;
608   for (r = 0; r < bs; r++) {
609     memcpy(dst, above, bs * sizeof(uint16_t));
610     dst += stride;
611   }
612 }
613 
highbd_h_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)614 static INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
615                                       const uint16_t *above,
616                                       const uint16_t *left, int bd) {
617   int r;
618   (void)above;
619   (void)bd;
620   for (r = 0; r < bs; r++) {
621     vpx_memset16(dst, left[r], bs);
622     dst += stride;
623   }
624 }
625 
highbd_tm_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)626 static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
627                                        const uint16_t *above,
628                                        const uint16_t *left, int bd) {
629   int r, c;
630   int ytop_left = above[-1];
631   (void)bd;
632 
633   for (r = 0; r < bs; r++) {
634     for (c = 0; c < bs; c++)
635       dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd);
636     dst += stride;
637   }
638 }
639 
highbd_dc_128_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)640 static INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride,
641                                            int bs, const uint16_t *above,
642                                            const uint16_t *left, int bd) {
643   int r;
644   (void)above;
645   (void)left;
646 
647   for (r = 0; r < bs; r++) {
648     vpx_memset16(dst, 128 << (bd - 8), bs);
649     dst += stride;
650   }
651 }
652 
highbd_dc_left_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)653 static INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride,
654                                             int bs, const uint16_t *above,
655                                             const uint16_t *left, int bd) {
656   int i, r, expected_dc, sum = 0;
657   (void)above;
658   (void)bd;
659 
660   for (i = 0; i < bs; i++) sum += left[i];
661   expected_dc = (sum + (bs >> 1)) / bs;
662 
663   for (r = 0; r < bs; r++) {
664     vpx_memset16(dst, expected_dc, bs);
665     dst += stride;
666   }
667 }
668 
highbd_dc_top_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)669 static INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride,
670                                            int bs, const uint16_t *above,
671                                            const uint16_t *left, int bd) {
672   int i, r, expected_dc, sum = 0;
673   (void)left;
674   (void)bd;
675 
676   for (i = 0; i < bs; i++) sum += above[i];
677   expected_dc = (sum + (bs >> 1)) / bs;
678 
679   for (r = 0; r < bs; r++) {
680     vpx_memset16(dst, expected_dc, bs);
681     dst += stride;
682   }
683 }
684 
highbd_dc_predictor(uint16_t * dst,ptrdiff_t stride,int bs,const uint16_t * above,const uint16_t * left,int bd)685 static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
686                                        const uint16_t *above,
687                                        const uint16_t *left, int bd) {
688   int i, r, expected_dc, sum = 0;
689   const int count = 2 * bs;
690   (void)bd;
691 
692   for (i = 0; i < bs; i++) {
693     sum += above[i];
694     sum += left[i];
695   }
696 
697   expected_dc = (sum + (count >> 1)) / count;
698 
699   for (r = 0; r < bs; r++) {
700     vpx_memset16(dst, expected_dc, bs);
701     dst += stride;
702   }
703 }
704 
vpx_highbd_d207_predictor_4x4_c(uint16_t * dst,ptrdiff_t stride,const uint16_t * above,const uint16_t * left,int bd)705 void vpx_highbd_d207_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
706                                      const uint16_t *above,
707                                      const uint16_t *left, int bd) {
708   const int I = left[0];
709   const int J = left[1];
710   const int K = left[2];
711   const int L = left[3];
712   (void)above;
713   (void)bd;
714   DST(0, 0) = AVG2(I, J);
715   DST(2, 0) = DST(0, 1) = AVG2(J, K);
716   DST(2, 1) = DST(0, 2) = AVG2(K, L);
717   DST(1, 0) = AVG3(I, J, K);
718   DST(3, 0) = DST(1, 1) = AVG3(J, K, L);
719   DST(3, 1) = DST(1, 2) = AVG3(K, L, L);
720   DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L;
721 }
722 
vpx_highbd_d63_predictor_4x4_c(uint16_t * dst,ptrdiff_t stride,const uint16_t * above,const uint16_t * left,int bd)723 void vpx_highbd_d63_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
724                                     const uint16_t *above, const uint16_t *left,
725                                     int bd) {
726   const int A = above[0];
727   const int B = above[1];
728   const int C = above[2];
729   const int D = above[3];
730   const int E = above[4];
731   const int F = above[5];
732   const int G = above[6];
733   (void)left;
734   (void)bd;
735   DST(0, 0) = AVG2(A, B);
736   DST(1, 0) = DST(0, 2) = AVG2(B, C);
737   DST(2, 0) = DST(1, 2) = AVG2(C, D);
738   DST(3, 0) = DST(2, 2) = AVG2(D, E);
739   DST(3, 2) = AVG2(E, F);  // differs from vp8
740 
741   DST(0, 1) = AVG3(A, B, C);
742   DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
743   DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
744   DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
745   DST(3, 3) = AVG3(E, F, G);  // differs from vp8
746 }
747 
vpx_highbd_d45_predictor_4x4_c(uint16_t * dst,ptrdiff_t stride,const uint16_t * above,const uint16_t * left,int bd)748 void vpx_highbd_d45_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
749                                     const uint16_t *above, const uint16_t *left,
750                                     int bd) {
751   const int A = above[0];
752   const int B = above[1];
753   const int C = above[2];
754   const int D = above[3];
755   const int E = above[4];
756   const int F = above[5];
757   const int G = above[6];
758   const int H = above[7];
759   (void)left;
760   (void)bd;
761   DST(0, 0) = AVG3(A, B, C);
762   DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
763   DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
764   DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
765   DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
766   DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
767   DST(3, 3) = H;  // differs from vp8
768 }
769 
vpx_highbd_d117_predictor_4x4_c(uint16_t * dst,ptrdiff_t stride,const uint16_t * above,const uint16_t * left,int bd)770 void vpx_highbd_d117_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
771                                      const uint16_t *above,
772                                      const uint16_t *left, int bd) {
773   const int I = left[0];
774   const int J = left[1];
775   const int K = left[2];
776   const int X = above[-1];
777   const int A = above[0];
778   const int B = above[1];
779   const int C = above[2];
780   const int D = above[3];
781   (void)bd;
782   DST(0, 0) = DST(1, 2) = AVG2(X, A);
783   DST(1, 0) = DST(2, 2) = AVG2(A, B);
784   DST(2, 0) = DST(3, 2) = AVG2(B, C);
785   DST(3, 0) = AVG2(C, D);
786 
787   DST(0, 3) = AVG3(K, J, I);
788   DST(0, 2) = AVG3(J, I, X);
789   DST(0, 1) = DST(1, 3) = AVG3(I, X, A);
790   DST(1, 1) = DST(2, 3) = AVG3(X, A, B);
791   DST(2, 1) = DST(3, 3) = AVG3(A, B, C);
792   DST(3, 1) = AVG3(B, C, D);
793 }
794 
vpx_highbd_d135_predictor_4x4_c(uint16_t * dst,ptrdiff_t stride,const uint16_t * above,const uint16_t * left,int bd)795 void vpx_highbd_d135_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
796                                      const uint16_t *above,
797                                      const uint16_t *left, int bd) {
798   const int I = left[0];
799   const int J = left[1];
800   const int K = left[2];
801   const int L = left[3];
802   const int X = above[-1];
803   const int A = above[0];
804   const int B = above[1];
805   const int C = above[2];
806   const int D = above[3];
807   (void)bd;
808   DST(0, 3) = AVG3(J, K, L);
809   DST(1, 3) = DST(0, 2) = AVG3(I, J, K);
810   DST(2, 3) = DST(1, 2) = DST(0, 1) = AVG3(X, I, J);
811   DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I);
812   DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X);
813   DST(3, 1) = DST(2, 0) = AVG3(C, B, A);
814   DST(3, 0) = AVG3(D, C, B);
815 }
816 
vpx_highbd_d153_predictor_4x4_c(uint16_t * dst,ptrdiff_t stride,const uint16_t * above,const uint16_t * left,int bd)817 void vpx_highbd_d153_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
818                                      const uint16_t *above,
819                                      const uint16_t *left, int bd) {
820   const int I = left[0];
821   const int J = left[1];
822   const int K = left[2];
823   const int L = left[3];
824   const int X = above[-1];
825   const int A = above[0];
826   const int B = above[1];
827   const int C = above[2];
828   (void)bd;
829 
830   DST(0, 0) = DST(2, 1) = AVG2(I, X);
831   DST(0, 1) = DST(2, 2) = AVG2(J, I);
832   DST(0, 2) = DST(2, 3) = AVG2(K, J);
833   DST(0, 3) = AVG2(L, K);
834 
835   DST(3, 0) = AVG3(A, B, C);
836   DST(2, 0) = AVG3(X, A, B);
837   DST(1, 0) = DST(3, 1) = AVG3(I, X, A);
838   DST(1, 1) = DST(3, 2) = AVG3(J, I, X);
839   DST(1, 2) = DST(3, 3) = AVG3(K, J, I);
840   DST(1, 3) = AVG3(L, K, J);
841 }
842 #endif  // CONFIG_VP9_HIGHBITDEPTH
843 
844 // This serves as a wrapper function, so that all the prediction functions
845 // can be unified and accessed as a pointer array. Note that the boundary
846 // above and left are not necessarily used all the time.
847 #define intra_pred_sized(type, size)                        \
848   void vpx_##type##_predictor_##size##x##size##_c(          \
849       uint8_t *dst, ptrdiff_t stride, const uint8_t *above, \
850       const uint8_t *left) {                                \
851     type##_predictor(dst, stride, size, above, left);       \
852   }
853 
854 #if CONFIG_VP9_HIGHBITDEPTH
855 #define intra_pred_highbd_sized(type, size)                        \
856   void vpx_highbd_##type##_predictor_##size##x##size##_c(          \
857       uint16_t *dst, ptrdiff_t stride, const uint16_t *above,      \
858       const uint16_t *left, int bd) {                              \
859     highbd_##type##_predictor(dst, stride, size, above, left, bd); \
860   }
861 
862 /* clang-format off */
863 #define intra_pred_allsizes(type) \
864   intra_pred_sized(type, 4) \
865   intra_pred_sized(type, 8) \
866   intra_pred_sized(type, 16) \
867   intra_pred_sized(type, 32) \
868   intra_pred_highbd_sized(type, 4) \
869   intra_pred_highbd_sized(type, 8) \
870   intra_pred_highbd_sized(type, 16) \
871   intra_pred_highbd_sized(type, 32)
872 
873 #define intra_pred_no_4x4(type) \
874   intra_pred_sized(type, 8) \
875   intra_pred_sized(type, 16) \
876   intra_pred_sized(type, 32) \
877   intra_pred_highbd_sized(type, 8) \
878   intra_pred_highbd_sized(type, 16) \
879   intra_pred_highbd_sized(type, 32)
880 
881 #else
882 #define intra_pred_allsizes(type) \
883   intra_pred_sized(type, 4) \
884   intra_pred_sized(type, 8) \
885   intra_pred_sized(type, 16) \
886   intra_pred_sized(type, 32)
887 
888 #define intra_pred_no_4x4(type) \
889   intra_pred_sized(type, 8) \
890   intra_pred_sized(type, 16) \
891   intra_pred_sized(type, 32)
892 #endif  // CONFIG_VP9_HIGHBITDEPTH
893 
894 intra_pred_no_4x4(d207)
895 intra_pred_no_4x4(d63)
896 intra_pred_no_4x4(d45)
897 intra_pred_no_4x4(d117)
898 intra_pred_no_4x4(d135)
899 intra_pred_no_4x4(d153)
900 intra_pred_allsizes(v)
901 intra_pred_allsizes(h)
902 intra_pred_allsizes(tm)
903 intra_pred_allsizes(dc_128)
904 intra_pred_allsizes(dc_left)
905 intra_pred_allsizes(dc_top)
906 intra_pred_allsizes(dc)
907 /* clang-format on */
908 #undef intra_pred_allsizes
909