]> granicus.if.org Git - libvpx/blob - vp9/common/vp9_reconintra.c
bb94c2cfe43a773e2660eef8c506bf7593c73e06
[libvpx] / vp9 / common / vp9_reconintra.c
1 /*
2  *  Copyright (c) 2010 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 "./vp9_rtcd.h"
13
14 #include "vpx_mem/vpx_mem.h"
15 #include "vpx_ports/mem.h"
16 #include "vpx_ports/vpx_once.h"
17
18 #include "vp9/common/vp9_reconintra.h"
19 #include "vp9/common/vp9_onyxc_int.h"
20
21 const TX_TYPE intra_mode_to_tx_type_lookup[INTRA_MODES] = {
22   DCT_DCT,    // DC
23   ADST_DCT,   // V
24   DCT_ADST,   // H
25   DCT_DCT,    // D45
26   ADST_ADST,  // D135
27   ADST_DCT,   // D117
28   DCT_ADST,   // D153
29   DCT_ADST,   // D207
30   ADST_DCT,   // D63
31   ADST_ADST,  // TM
32 };
33
34 enum {
35   NEED_LEFT = 1 << 1,
36   NEED_ABOVE = 1 << 2,
37   NEED_ABOVERIGHT = 1 << 3,
38 };
39
40 static const uint8_t extend_modes[INTRA_MODES] = {
41   NEED_ABOVE | NEED_LEFT,       // DC
42   NEED_ABOVE,                   // V
43   NEED_LEFT,                    // H
44   NEED_ABOVERIGHT,              // D45
45   NEED_LEFT | NEED_ABOVE,       // D135
46   NEED_LEFT | NEED_ABOVE,       // D117
47   NEED_LEFT | NEED_ABOVE,       // D153
48   NEED_LEFT,                    // D207
49   NEED_ABOVERIGHT,              // D63
50   NEED_LEFT | NEED_ABOVE,       // TM
51 };
52
53 // This serves as a wrapper function, so that all the prediction functions
54 // can be unified and accessed as a pointer array. Note that the boundary
55 // above and left are not necessarily used all the time.
56 #define intra_pred_sized(type, size) \
57   void vp9_##type##_predictor_##size##x##size##_c(uint8_t *dst, \
58                                                   ptrdiff_t stride, \
59                                                   const uint8_t *above, \
60                                                   const uint8_t *left) { \
61     type##_predictor(dst, stride, size, above, left); \
62   }
63
64 #if CONFIG_VP9_HIGHBITDEPTH
65 #define intra_pred_highbd_sized(type, size) \
66   void vp9_highbd_##type##_predictor_##size##x##size##_c( \
67       uint16_t *dst, ptrdiff_t stride, const uint16_t *above, \
68       const uint16_t *left, int bd) { \
69     highbd_##type##_predictor(dst, stride, size, above, left, bd); \
70   }
71
72 #define intra_pred_allsizes(type) \
73   intra_pred_sized(type, 4) \
74   intra_pred_sized(type, 8) \
75   intra_pred_sized(type, 16) \
76   intra_pred_sized(type, 32) \
77   intra_pred_highbd_sized(type, 4) \
78   intra_pred_highbd_sized(type, 8) \
79   intra_pred_highbd_sized(type, 16) \
80   intra_pred_highbd_sized(type, 32)
81
82 #define intra_pred_no_4x4(type) \
83   intra_pred_sized(type, 8) \
84   intra_pred_sized(type, 16) \
85   intra_pred_sized(type, 32) \
86   intra_pred_highbd_sized(type, 4) \
87   intra_pred_highbd_sized(type, 8) \
88   intra_pred_highbd_sized(type, 16) \
89   intra_pred_highbd_sized(type, 32)
90
91 #else
92
93 #define intra_pred_allsizes(type) \
94   intra_pred_sized(type, 4) \
95   intra_pred_sized(type, 8) \
96   intra_pred_sized(type, 16) \
97   intra_pred_sized(type, 32)
98
99 #define intra_pred_no_4x4(type) \
100   intra_pred_sized(type, 8) \
101   intra_pred_sized(type, 16) \
102   intra_pred_sized(type, 32)
103 #endif  // CONFIG_VP9_HIGHBITDEPTH
104
105 #if CONFIG_VP9_HIGHBITDEPTH
106 static INLINE void highbd_d207_predictor(uint16_t *dst, ptrdiff_t stride,
107                                          int bs, const uint16_t *above,
108                                          const uint16_t *left, int bd) {
109   int r, c;
110   (void) above;
111   (void) bd;
112
113   // First column.
114   for (r = 0; r < bs - 1; ++r) {
115     dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1], 1);
116   }
117   dst[(bs - 1) * stride] = left[bs - 1];
118   dst++;
119
120   // Second column.
121   for (r = 0; r < bs - 2; ++r) {
122     dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1] * 2 +
123                                          left[r + 2], 2);
124   }
125   dst[(bs - 2) * stride] = ROUND_POWER_OF_TWO(left[bs - 2] +
126                                               left[bs - 1] * 3, 2);
127   dst[(bs - 1) * stride] = left[bs - 1];
128   dst++;
129
130   // Rest of last row.
131   for (c = 0; c < bs - 2; ++c)
132     dst[(bs - 1) * stride + c] = left[bs - 1];
133
134   for (r = bs - 2; r >= 0; --r) {
135     for (c = 0; c < bs - 2; ++c)
136       dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
137   }
138 }
139
140 static INLINE void highbd_d63_predictor(uint16_t *dst, ptrdiff_t stride,
141                                         int bs, const uint16_t *above,
142                                         const uint16_t *left, int bd) {
143   int r, c;
144   (void) left;
145   (void) bd;
146   for (r = 0; r < bs; ++r) {
147     for (c = 0; c < bs; ++c) {
148       dst[c] = r & 1 ? ROUND_POWER_OF_TWO(above[r/2 + c] +
149                                           above[r/2 + c + 1] * 2 +
150                                           above[r/2 + c + 2], 2)
151                      : ROUND_POWER_OF_TWO(above[r/2 + c] +
152                                           above[r/2 + c + 1], 1);
153     }
154     dst += stride;
155   }
156 }
157
158 static INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
159                                         const uint16_t *above,
160                                         const uint16_t *left, int bd) {
161   int r, c;
162   (void) left;
163   (void) bd;
164   for (r = 0; r < bs; ++r) {
165     for (c = 0; c < bs; ++c) {
166       dst[c] = r + c + 2 < bs * 2 ?  ROUND_POWER_OF_TWO(above[r + c] +
167                                                         above[r + c + 1] * 2 +
168                                                         above[r + c + 2], 2)
169                                   : above[bs * 2 - 1];
170     }
171     dst += stride;
172   }
173 }
174
175 static INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride,
176                                          int bs, const uint16_t *above,
177                                          const uint16_t *left, int bd) {
178   int r, c;
179   (void) bd;
180
181   // first row
182   for (c = 0; c < bs; c++)
183     dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c], 1);
184   dst += stride;
185
186   // second row
187   dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2);
188   for (c = 1; c < bs; c++)
189     dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2);
190   dst += stride;
191
192   // the rest of first col
193   dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2);
194   for (r = 3; r < bs; ++r)
195     dst[(r - 2) * stride] = ROUND_POWER_OF_TWO(left[r - 3] + left[r - 2] * 2 +
196                                                left[r - 1], 2);
197
198   // the rest of the block
199   for (r = 2; r < bs; ++r) {
200     for (c = 1; c < bs; c++)
201       dst[c] = dst[-2 * stride + c - 1];
202     dst += stride;
203   }
204 }
205
206 static INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride,
207                                          int bs, const uint16_t *above,
208                                          const uint16_t *left, int bd) {
209   int r, c;
210   (void) bd;
211   dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2);
212   for (c = 1; c < bs; c++)
213     dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2);
214
215   dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2);
216   for (r = 2; r < bs; ++r)
217     dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 +
218                                          left[r], 2);
219
220   dst += stride;
221   for (r = 1; r < bs; ++r) {
222     for (c = 1; c < bs; c++)
223       dst[c] = dst[-stride + c - 1];
224     dst += stride;
225   }
226 }
227
228 static INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride,
229                                          int bs, const uint16_t *above,
230                                          const uint16_t *left, int bd) {
231   int r, c;
232   (void) bd;
233   dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0], 1);
234   for (r = 1; r < bs; r++)
235     dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 1] + left[r], 1);
236   dst++;
237
238   dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2);
239   dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2);
240   for (r = 2; r < bs; r++)
241     dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 +
242                                          left[r], 2);
243   dst++;
244
245   for (c = 0; c < bs - 2; c++)
246     dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c] * 2 + above[c + 1], 2);
247   dst += stride;
248
249   for (r = 1; r < bs; ++r) {
250     for (c = 0; c < bs - 2; c++)
251       dst[c] = dst[-stride + c - 2];
252     dst += stride;
253   }
254 }
255
256 static INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride,
257                                       int bs, const uint16_t *above,
258                                       const uint16_t *left, int bd) {
259   int r;
260   (void) left;
261   (void) bd;
262   for (r = 0; r < bs; r++) {
263     memcpy(dst, above, bs * sizeof(uint16_t));
264     dst += stride;
265   }
266 }
267
268 static INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride,
269                                       int bs, const uint16_t *above,
270                                       const uint16_t *left, int bd) {
271   int r;
272   (void) above;
273   (void) bd;
274   for (r = 0; r < bs; r++) {
275     vpx_memset16(dst, left[r], bs);
276     dst += stride;
277   }
278 }
279
280 static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride,
281                                        int bs, const uint16_t *above,
282                                        const uint16_t *left, int bd) {
283   int r, c;
284   int ytop_left = above[-1];
285   (void) bd;
286
287   for (r = 0; r < bs; r++) {
288     for (c = 0; c < bs; c++)
289       dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd);
290     dst += stride;
291   }
292 }
293
294 static INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride,
295                                            int bs, const uint16_t *above,
296                                            const uint16_t *left, int bd) {
297   int r;
298   (void) above;
299   (void) left;
300
301   for (r = 0; r < bs; r++) {
302     vpx_memset16(dst, 128 << (bd - 8), bs);
303     dst += stride;
304   }
305 }
306
307 static INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride,
308                                             int bs, const uint16_t *above,
309                                             const uint16_t *left, int bd) {
310   int i, r, expected_dc, sum = 0;
311   (void) above;
312   (void) bd;
313
314   for (i = 0; i < bs; i++)
315     sum += left[i];
316   expected_dc = (sum + (bs >> 1)) / bs;
317
318   for (r = 0; r < bs; r++) {
319     vpx_memset16(dst, expected_dc, bs);
320     dst += stride;
321   }
322 }
323
324 static INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride,
325                                            int bs, const uint16_t *above,
326                                            const uint16_t *left, int bd) {
327   int i, r, expected_dc, sum = 0;
328   (void) left;
329   (void) bd;
330
331   for (i = 0; i < bs; i++)
332     sum += above[i];
333   expected_dc = (sum + (bs >> 1)) / bs;
334
335   for (r = 0; r < bs; r++) {
336     vpx_memset16(dst, expected_dc, bs);
337     dst += stride;
338   }
339 }
340
341 static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride,
342                                        int bs, const uint16_t *above,
343                                        const uint16_t *left, int bd) {
344   int i, r, expected_dc, sum = 0;
345   const int count = 2 * bs;
346   (void) bd;
347
348   for (i = 0; i < bs; i++) {
349     sum += above[i];
350     sum += left[i];
351   }
352
353   expected_dc = (sum + (count >> 1)) / count;
354
355   for (r = 0; r < bs; r++) {
356     vpx_memset16(dst, expected_dc, bs);
357     dst += stride;
358   }
359 }
360 #endif  // CONFIG_VP9_HIGHBITDEPTH
361
362 #define DST(x, y) dst[(x) + (y) * stride]
363 #define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2)
364
365 static INLINE void d207_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
366                                   const uint8_t *above, const uint8_t *left) {
367   int r, c;
368   (void) above;
369   // first column
370   for (r = 0; r < bs - 1; ++r)
371     dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1], 1);
372   dst[(bs - 1) * stride] = left[bs - 1];
373   dst++;
374
375   // second column
376   for (r = 0; r < bs - 2; ++r)
377     dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1] * 2 +
378                                          left[r + 2], 2);
379   dst[(bs - 2) * stride] = ROUND_POWER_OF_TWO(left[bs - 2] +
380                                               left[bs - 1] * 3, 2);
381   dst[(bs - 1) * stride] = left[bs - 1];
382   dst++;
383
384   // rest of last row
385   for (c = 0; c < bs - 2; ++c)
386     dst[(bs - 1) * stride + c] = left[bs - 1];
387
388   for (r = bs - 2; r >= 0; --r)
389     for (c = 0; c < bs - 2; ++c)
390       dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
391 }
392 intra_pred_allsizes(d207)
393
394 static INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
395                                  const uint8_t *above, const uint8_t *left) {
396   int r, c;
397   (void) left;
398   for (r = 0; r < bs; ++r) {
399     for (c = 0; c < bs; ++c)
400       dst[c] = r & 1 ? ROUND_POWER_OF_TWO(above[r/2 + c] +
401                                           above[r/2 + c + 1] * 2 +
402                                           above[r/2 + c + 2], 2)
403                      : ROUND_POWER_OF_TWO(above[r/2 + c] +
404                                           above[r/2 + c + 1], 1);
405     dst += stride;
406   }
407 }
408 intra_pred_allsizes(d63)
409
410 void vp9_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
411                              const uint8_t *above, const uint8_t *left) {
412   const int A = above[0];
413   const int B = above[1];
414   const int C = above[2];
415   const int D = above[3];
416   const int E = above[4];
417   const int F = above[5];
418   const int G = above[6];
419   const int H = above[7];
420   (void)stride;
421   (void)left;
422   DST(0, 0)                                     = AVG3(A, B, C);
423   DST(1, 0) = DST(0, 1)                         = AVG3(B, C, D);
424   DST(2, 0) = DST(1, 1) = DST(0, 2)             = AVG3(C, D, E);
425   DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
426               DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
427                           DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
428                                       DST(3, 3) = AVG3(G, H, H);
429 }
430
431 static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
432                                  const uint8_t *above, const uint8_t *left) {
433   int r, c;
434   (void) left;
435   for (r = 0; r < bs; ++r) {
436     for (c = 0; c < bs; ++c)
437       dst[c] = r + c + 2 < bs * 2 ?  ROUND_POWER_OF_TWO(above[r + c] +
438                                                         above[r + c + 1] * 2 +
439                                                         above[r + c + 2], 2)
440                                   : above[bs * 2 - 1];
441     dst += stride;
442   }
443 }
444 intra_pred_no_4x4(d45)
445
446 static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
447                                   const uint8_t *above, const uint8_t *left) {
448   int r, c;
449
450   // first row
451   for (c = 0; c < bs; c++)
452     dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c], 1);
453   dst += stride;
454
455   // second row
456   dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2);
457   for (c = 1; c < bs; c++)
458     dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2);
459   dst += stride;
460
461   // the rest of first col
462   dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2);
463   for (r = 3; r < bs; ++r)
464     dst[(r - 2) * stride] = ROUND_POWER_OF_TWO(left[r - 3] + left[r - 2] * 2 +
465                                                left[r - 1], 2);
466
467   // the rest of the block
468   for (r = 2; r < bs; ++r) {
469     for (c = 1; c < bs; c++)
470       dst[c] = dst[-2 * stride + c - 1];
471     dst += stride;
472   }
473 }
474 intra_pred_allsizes(d117)
475
476 static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
477                                   const uint8_t *above, const uint8_t *left) {
478   int r, c;
479   dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2);
480   for (c = 1; c < bs; c++)
481     dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2);
482
483   dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2);
484   for (r = 2; r < bs; ++r)
485     dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 +
486                                          left[r], 2);
487
488   dst += stride;
489   for (r = 1; r < bs; ++r) {
490     for (c = 1; c < bs; c++)
491       dst[c] = dst[-stride + c - 1];
492     dst += stride;
493   }
494 }
495 intra_pred_allsizes(d135)
496
497 static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
498                                   const uint8_t *above, const uint8_t *left) {
499   int r, c;
500   dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0], 1);
501   for (r = 1; r < bs; r++)
502     dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 1] + left[r], 1);
503   dst++;
504
505   dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2);
506   dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2);
507   for (r = 2; r < bs; r++)
508     dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 +
509                                          left[r], 2);
510   dst++;
511
512   for (c = 0; c < bs - 2; c++)
513     dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c] * 2 + above[c + 1], 2);
514   dst += stride;
515
516   for (r = 1; r < bs; ++r) {
517     for (c = 0; c < bs - 2; c++)
518       dst[c] = dst[-stride + c - 2];
519     dst += stride;
520   }
521 }
522 intra_pred_allsizes(d153)
523
524 static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
525                                const uint8_t *above, const uint8_t *left) {
526   int r;
527   (void) left;
528
529   for (r = 0; r < bs; r++) {
530     memcpy(dst, above, bs);
531     dst += stride;
532   }
533 }
534 intra_pred_allsizes(v)
535
536 static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
537                                const uint8_t *above, const uint8_t *left) {
538   int r;
539   (void) above;
540
541   for (r = 0; r < bs; r++) {
542     memset(dst, left[r], bs);
543     dst += stride;
544   }
545 }
546 intra_pred_allsizes(h)
547
548 static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
549                                 const uint8_t *above, const uint8_t *left) {
550   int r, c;
551   int ytop_left = above[-1];
552
553   for (r = 0; r < bs; r++) {
554     for (c = 0; c < bs; c++)
555       dst[c] = clip_pixel(left[r] + above[c] - ytop_left);
556     dst += stride;
557   }
558 }
559 intra_pred_allsizes(tm)
560
561 static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
562                                     const uint8_t *above, const uint8_t *left) {
563   int r;
564   (void) above;
565   (void) left;
566
567   for (r = 0; r < bs; r++) {
568     memset(dst, 128, bs);
569     dst += stride;
570   }
571 }
572 intra_pred_allsizes(dc_128)
573
574 static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
575                                      const uint8_t *above,
576                                      const uint8_t *left) {
577   int i, r, expected_dc, sum = 0;
578   (void) above;
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     memset(dst, expected_dc, bs);
586     dst += stride;
587   }
588 }
589 intra_pred_allsizes(dc_left)
590
591 static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
592                                     const uint8_t *above, const uint8_t *left) {
593   int i, r, expected_dc, sum = 0;
594   (void) left;
595
596   for (i = 0; i < bs; i++)
597     sum += above[i];
598   expected_dc = (sum + (bs >> 1)) / bs;
599
600   for (r = 0; r < bs; r++) {
601     memset(dst, expected_dc, bs);
602     dst += stride;
603   }
604 }
605 intra_pred_allsizes(dc_top)
606
607 static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
608                                 const uint8_t *above, const uint8_t *left) {
609   int i, r, expected_dc, sum = 0;
610   const int count = 2 * bs;
611
612   for (i = 0; i < bs; i++) {
613     sum += above[i];
614     sum += left[i];
615   }
616
617   expected_dc = (sum + (count >> 1)) / count;
618
619   for (r = 0; r < bs; r++) {
620     memset(dst, expected_dc, bs);
621     dst += stride;
622   }
623 }
624 intra_pred_allsizes(dc)
625 #undef intra_pred_allsizes
626
627 typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride,
628                               const uint8_t *above, const uint8_t *left);
629
630 static intra_pred_fn pred[INTRA_MODES][TX_SIZES];
631 static intra_pred_fn dc_pred[2][2][TX_SIZES];
632
633 #if CONFIG_VP9_HIGHBITDEPTH
634 typedef void (*intra_high_pred_fn)(uint16_t *dst, ptrdiff_t stride,
635                                    const uint16_t *above, const uint16_t *left,
636                                    int bd);
637 static intra_high_pred_fn pred_high[INTRA_MODES][4];
638 static intra_high_pred_fn dc_pred_high[2][2][4];
639 #endif  // CONFIG_VP9_HIGHBITDEPTH
640
641 static void vp9_init_intra_predictors_internal(void) {
642 #define INIT_ALL_SIZES(p, type) \
643   p[TX_4X4] = vp9_##type##_predictor_4x4; \
644   p[TX_8X8] = vp9_##type##_predictor_8x8; \
645   p[TX_16X16] = vp9_##type##_predictor_16x16; \
646   p[TX_32X32] = vp9_##type##_predictor_32x32
647
648   INIT_ALL_SIZES(pred[V_PRED], v);
649   INIT_ALL_SIZES(pred[H_PRED], h);
650   INIT_ALL_SIZES(pred[D207_PRED], d207);
651   INIT_ALL_SIZES(pred[D45_PRED], d45);
652   INIT_ALL_SIZES(pred[D63_PRED], d63);
653   INIT_ALL_SIZES(pred[D117_PRED], d117);
654   INIT_ALL_SIZES(pred[D135_PRED], d135);
655   INIT_ALL_SIZES(pred[D153_PRED], d153);
656   INIT_ALL_SIZES(pred[TM_PRED], tm);
657
658   INIT_ALL_SIZES(dc_pred[0][0], dc_128);
659   INIT_ALL_SIZES(dc_pred[0][1], dc_top);
660   INIT_ALL_SIZES(dc_pred[1][0], dc_left);
661   INIT_ALL_SIZES(dc_pred[1][1], dc);
662
663 #if CONFIG_VP9_HIGHBITDEPTH
664   INIT_ALL_SIZES(pred_high[V_PRED], highbd_v);
665   INIT_ALL_SIZES(pred_high[H_PRED], highbd_h);
666   INIT_ALL_SIZES(pred_high[D207_PRED], highbd_d207);
667   INIT_ALL_SIZES(pred_high[D45_PRED], highbd_d45);
668   INIT_ALL_SIZES(pred_high[D63_PRED], highbd_d63);
669   INIT_ALL_SIZES(pred_high[D117_PRED], highbd_d117);
670   INIT_ALL_SIZES(pred_high[D135_PRED], highbd_d135);
671   INIT_ALL_SIZES(pred_high[D153_PRED], highbd_d153);
672   INIT_ALL_SIZES(pred_high[TM_PRED], highbd_tm);
673
674   INIT_ALL_SIZES(dc_pred_high[0][0], highbd_dc_128);
675   INIT_ALL_SIZES(dc_pred_high[0][1], highbd_dc_top);
676   INIT_ALL_SIZES(dc_pred_high[1][0], highbd_dc_left);
677   INIT_ALL_SIZES(dc_pred_high[1][1], highbd_dc);
678 #endif  // CONFIG_VP9_HIGHBITDEPTH
679
680 #undef intra_pred_allsizes
681 }
682
683 #if CONFIG_VP9_HIGHBITDEPTH
684 static void build_intra_predictors_high(const MACROBLOCKD *xd,
685                                         const uint8_t *ref8,
686                                         int ref_stride,
687                                         uint8_t *dst8,
688                                         int dst_stride,
689                                         PREDICTION_MODE mode,
690                                         TX_SIZE tx_size,
691                                         int up_available,
692                                         int left_available,
693                                         int right_available,
694                                         int x, int y,
695                                         int plane, int bd) {
696   int i;
697   uint16_t *dst = CONVERT_TO_SHORTPTR(dst8);
698   uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
699   DECLARE_ALIGNED(16, uint16_t, left_col[32]);
700   DECLARE_ALIGNED(16, uint16_t, above_data[64 + 16]);
701   uint16_t *above_row = above_data + 16;
702   const uint16_t *const_above_row = above_row;
703   const int bs = 4 << tx_size;
704   int frame_width, frame_height;
705   int x0, y0;
706   const struct macroblockd_plane *const pd = &xd->plane[plane];
707   //  int base=128;
708   int base = 128 << (bd - 8);
709   // 127 127 127 .. 127 127 127 127 127 127
710   // 129  A   B  ..  Y   Z
711   // 129  C   D  ..  W   X
712   // 129  E   F  ..  U   V
713   // 129  G   H  ..  S   T   T   T   T   T
714
715   // Get current frame pointer, width and height.
716   if (plane == 0) {
717     frame_width = xd->cur_buf->y_width;
718     frame_height = xd->cur_buf->y_height;
719   } else {
720     frame_width = xd->cur_buf->uv_width;
721     frame_height = xd->cur_buf->uv_height;
722   }
723
724   // Get block position in current frame.
725   x0 = (-xd->mb_to_left_edge >> (3 + pd->subsampling_x)) + x;
726   y0 = (-xd->mb_to_top_edge >> (3 + pd->subsampling_y)) + y;
727
728   // left
729   if (left_available) {
730     if (xd->mb_to_bottom_edge < 0) {
731       /* slower path if the block needs border extension */
732       if (y0 + bs <= frame_height) {
733         for (i = 0; i < bs; ++i)
734           left_col[i] = ref[i * ref_stride - 1];
735       } else {
736         const int extend_bottom = frame_height - y0;
737         for (i = 0; i < extend_bottom; ++i)
738           left_col[i] = ref[i * ref_stride - 1];
739         for (; i < bs; ++i)
740           left_col[i] = ref[(extend_bottom - 1) * ref_stride - 1];
741       }
742     } else {
743       /* faster path if the block does not need extension */
744       for (i = 0; i < bs; ++i)
745         left_col[i] = ref[i * ref_stride - 1];
746     }
747   } else {
748     // TODO(Peter): this value should probably change for high bitdepth
749     vpx_memset16(left_col, base + 1, bs);
750   }
751
752   // TODO(hkuang) do not extend 2*bs pixels for all modes.
753   // above
754   if (up_available) {
755     const uint16_t *above_ref = ref - ref_stride;
756     if (xd->mb_to_right_edge < 0) {
757       /* slower path if the block needs border extension */
758       if (x0 + 2 * bs <= frame_width) {
759         if (right_available && bs == 4) {
760           memcpy(above_row, above_ref, 2 * bs * sizeof(uint16_t));
761         } else {
762           memcpy(above_row, above_ref, bs * sizeof(uint16_t));
763           vpx_memset16(above_row + bs, above_row[bs - 1], bs);
764         }
765       } else if (x0 + bs <= frame_width) {
766         const int r = frame_width - x0;
767         if (right_available && bs == 4) {
768           memcpy(above_row, above_ref, r * sizeof(uint16_t));
769           vpx_memset16(above_row + r, above_row[r - 1],
770                        x0 + 2 * bs - frame_width);
771         } else {
772           memcpy(above_row, above_ref, bs * sizeof(uint16_t));
773           vpx_memset16(above_row + bs, above_row[bs - 1], bs);
774         }
775       } else if (x0 <= frame_width) {
776         const int r = frame_width - x0;
777         memcpy(above_row, above_ref, r * sizeof(uint16_t));
778         vpx_memset16(above_row + r, above_row[r - 1],
779                        x0 + 2 * bs - frame_width);
780       }
781       // TODO(Peter) this value should probably change for high bitdepth
782       above_row[-1] = left_available ? above_ref[-1] : (base+1);
783     } else {
784       /* faster path if the block does not need extension */
785       if (bs == 4 && right_available && left_available) {
786         const_above_row = above_ref;
787       } else {
788         memcpy(above_row, above_ref, bs * sizeof(uint16_t));
789         if (bs == 4 && right_available)
790           memcpy(above_row + bs, above_ref + bs, bs * sizeof(uint16_t));
791         else
792           vpx_memset16(above_row + bs, above_row[bs - 1], bs);
793         // TODO(Peter): this value should probably change for high bitdepth
794         above_row[-1] = left_available ? above_ref[-1] : (base+1);
795       }
796     }
797   } else {
798     vpx_memset16(above_row, base - 1, bs * 2);
799     // TODO(Peter): this value should probably change for high bitdepth
800     above_row[-1] = base - 1;
801   }
802
803   // predict
804   if (mode == DC_PRED) {
805     dc_pred_high[left_available][up_available][tx_size](dst, dst_stride,
806                                                         const_above_row,
807                                                         left_col, xd->bd);
808   } else {
809     pred_high[mode][tx_size](dst, dst_stride, const_above_row, left_col,
810                              xd->bd);
811   }
812 }
813 #endif  // CONFIG_VP9_HIGHBITDEPTH
814
815 static void build_intra_predictors(const MACROBLOCKD *xd, const uint8_t *ref,
816                                    int ref_stride, uint8_t *dst, int dst_stride,
817                                    PREDICTION_MODE mode, TX_SIZE tx_size,
818                                    int up_available, int left_available,
819                                    int right_available, int x, int y,
820                                    int plane) {
821   int i;
822   DECLARE_ALIGNED(16, uint8_t, left_col[32]);
823   DECLARE_ALIGNED(16, uint8_t, above_data[64 + 16]);
824   uint8_t *above_row = above_data + 16;
825   const uint8_t *const_above_row = above_row;
826   const int bs = 4 << tx_size;
827   int frame_width, frame_height;
828   int x0, y0;
829   const struct macroblockd_plane *const pd = &xd->plane[plane];
830
831   // 127 127 127 .. 127 127 127 127 127 127
832   // 129  A   B  ..  Y   Z
833   // 129  C   D  ..  W   X
834   // 129  E   F  ..  U   V
835   // 129  G   H  ..  S   T   T   T   T   T
836   // ..
837
838   // Get current frame pointer, width and height.
839   if (plane == 0) {
840     frame_width = xd->cur_buf->y_width;
841     frame_height = xd->cur_buf->y_height;
842   } else {
843     frame_width = xd->cur_buf->uv_width;
844     frame_height = xd->cur_buf->uv_height;
845   }
846
847   // Get block position in current frame.
848   x0 = (-xd->mb_to_left_edge >> (3 + pd->subsampling_x)) + x;
849   y0 = (-xd->mb_to_top_edge >> (3 + pd->subsampling_y)) + y;
850
851   // NEED_LEFT
852   if (extend_modes[mode] & NEED_LEFT) {
853     if (left_available) {
854       if (xd->mb_to_bottom_edge < 0) {
855         /* slower path if the block needs border extension */
856         if (y0 + bs <= frame_height) {
857           for (i = 0; i < bs; ++i)
858             left_col[i] = ref[i * ref_stride - 1];
859         } else {
860           const int extend_bottom = frame_height - y0;
861           for (i = 0; i < extend_bottom; ++i)
862             left_col[i] = ref[i * ref_stride - 1];
863           for (; i < bs; ++i)
864             left_col[i] = ref[(extend_bottom - 1) * ref_stride - 1];
865         }
866       } else {
867         /* faster path if the block does not need extension */
868         for (i = 0; i < bs; ++i)
869           left_col[i] = ref[i * ref_stride - 1];
870       }
871     } else {
872       memset(left_col, 129, bs);
873     }
874   }
875
876   // NEED_ABOVE
877   if (extend_modes[mode] & NEED_ABOVE) {
878     if (up_available) {
879       const uint8_t *above_ref = ref - ref_stride;
880       if (xd->mb_to_right_edge < 0) {
881         /* slower path if the block needs border extension */
882         if (x0 + bs <= frame_width) {
883           memcpy(above_row, above_ref, bs);
884         } else if (x0 <= frame_width) {
885           const int r = frame_width - x0;
886           memcpy(above_row, above_ref, r);
887           memset(above_row + r, above_row[r - 1], x0 + bs - frame_width);
888         }
889       } else {
890         /* faster path if the block does not need extension */
891         if (bs == 4 && right_available && left_available) {
892           const_above_row = above_ref;
893         } else {
894           memcpy(above_row, above_ref, bs);
895         }
896       }
897       above_row[-1] = left_available ? above_ref[-1] : 129;
898     } else {
899       memset(above_row, 127, bs);
900       above_row[-1] = 127;
901     }
902   }
903
904   // NEED_ABOVERIGHT
905   if (extend_modes[mode] & NEED_ABOVERIGHT) {
906     if (up_available) {
907       const uint8_t *above_ref = ref - ref_stride;
908       if (xd->mb_to_right_edge < 0) {
909         /* slower path if the block needs border extension */
910         if (x0 + 2 * bs <= frame_width) {
911           if (right_available && bs == 4) {
912             memcpy(above_row, above_ref, 2 * bs);
913           } else {
914             memcpy(above_row, above_ref, bs);
915             memset(above_row + bs, above_row[bs - 1], bs);
916           }
917         } else if (x0 + bs <= frame_width) {
918           const int r = frame_width - x0;
919           if (right_available && bs == 4) {
920             memcpy(above_row, above_ref, r);
921             memset(above_row + r, above_row[r - 1], x0 + 2 * bs - frame_width);
922           } else {
923             memcpy(above_row, above_ref, bs);
924             memset(above_row + bs, above_row[bs - 1], bs);
925           }
926         } else if (x0 <= frame_width) {
927           const int r = frame_width - x0;
928           memcpy(above_row, above_ref, r);
929           memset(above_row + r, above_row[r - 1], x0 + 2 * bs - frame_width);
930         }
931       } else {
932         /* faster path if the block does not need extension */
933         if (bs == 4 && right_available && left_available) {
934           const_above_row = above_ref;
935         } else {
936           memcpy(above_row, above_ref, bs);
937           if (bs == 4 && right_available)
938             memcpy(above_row + bs, above_ref + bs, bs);
939           else
940             memset(above_row + bs, above_row[bs - 1], bs);
941         }
942       }
943       above_row[-1] = left_available ? above_ref[-1] : 129;
944     } else {
945       memset(above_row, 127, bs * 2);
946       above_row[-1] = 127;
947     }
948   }
949
950   // predict
951   if (mode == DC_PRED) {
952     dc_pred[left_available][up_available][tx_size](dst, dst_stride,
953                                                    const_above_row, left_col);
954   } else {
955     pred[mode][tx_size](dst, dst_stride, const_above_row, left_col);
956   }
957 }
958
959 void vp9_predict_intra_block(const MACROBLOCKD *xd, int block_idx, int bwl_in,
960                              TX_SIZE tx_size, PREDICTION_MODE mode,
961                              const uint8_t *ref, int ref_stride,
962                              uint8_t *dst, int dst_stride,
963                              int aoff, int loff, int plane) {
964   const int bwl = bwl_in - tx_size;
965   const int wmask = (1 << bwl) - 1;
966   const int have_top = (block_idx >> bwl) || xd->up_available;
967   const int have_left = (block_idx & wmask) || xd->left_available;
968   const int have_right = ((block_idx & wmask) != wmask);
969   const int x = aoff * 4;
970   const int y = loff * 4;
971
972   assert(bwl >= 0);
973 #if CONFIG_VP9_HIGHBITDEPTH
974   if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
975     build_intra_predictors_high(xd, ref, ref_stride, dst, dst_stride, mode,
976                                 tx_size, have_top, have_left, have_right,
977                                 x, y, plane, xd->bd);
978     return;
979   }
980 #endif
981   build_intra_predictors(xd, ref, ref_stride, dst, dst_stride, mode, tx_size,
982                          have_top, have_left, have_right, x, y, plane);
983 }
984
985 void vp9_init_intra_predictors(void) {
986   once(vp9_init_intra_predictors_internal);
987 }