17ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian/*
27ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
37ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *
47ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
57ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
67ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
77ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
87ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
97ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian */
107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_config.h"
127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h"
137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_dsp/vpx_dsp_common.h"
157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_mem/vpx_mem.h"
167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
177bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define DST(x, y) dst[(x) + (y)*stride]
187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2)
197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define AVG2(a, b) (((a) + (b) + 1) >> 1)
207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d207_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // first column
267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (r = 0; r < bs - 1; ++r) dst[r * stride] = AVG2(left[r], left[r + 1]);
277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // second column
317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 2; ++r)
327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // rest of last row
387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (c = 0; c < bs - 2; ++c) dst[(bs - 1) * stride + c] = left[bs - 1];
397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = bs - 2; r >= 0; --r)
417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs - 2; ++c)
427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                 const uint8_t *above, const uint8_t *left) {
477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int size;
497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs; ++c) {
517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG2(above[c], above[c + 1]);
527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[stride + c] = AVG3(above[c], above[c + 1], above[c + 2]);
537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2, size = bs - 2; r < bs; r += 2, --size) {
557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst + (r + 0) * stride, dst + (r >> 1), size);
567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst + (r + 0) * stride + size, above[bs - 1], bs - size);
577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst + (r + 1) * stride, dst + stride + (r >> 1), size);
587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst + (r + 1) * stride + size, above[bs - 1], bs - size);
597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                 const uint8_t *above, const uint8_t *left) {
647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t above_right = above[bs - 1];
657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *const dst_row0 = dst;
667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int x, size;
677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (x = 0; x < bs - 1; ++x) {
707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[x] = AVG3(above[x], above[x + 1], above[x + 2]);
717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[bs - 1] = above_right;
737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (x = 1, size = bs - 2; x < bs; ++x, --size) {
757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst, dst_row0 + x, size);
767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst + size, above_right, x + 1);
777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // first row
867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (c = 0; c < bs; c++) dst[c] = AVG2(above[c - 1], above[c]);
877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // second row
907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of first col
957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(above[-1], left[0], left[1]);
967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 3; r < bs; ++r)
977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of the block
1007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; ++r) {
1017bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (c = 1; c < bs; c++) dst[c] = dst[-2 * stride + c - 1];
1027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
10868e1c830ade592be74773e249bf94e2bbfb50de7Johann  int i;
10968e1c830ade592be74773e249bf94e2bbfb50de7Johann#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
11068e1c830ade592be74773e249bf94e2bbfb50de7Johann  // silence a spurious -Warray-bounds warning, possibly related to:
11168e1c830ade592be74773e249bf94e2bbfb50de7Johann  // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
11268e1c830ade592be74773e249bf94e2bbfb50de7Johann  uint8_t border[69];
11368e1c830ade592be74773e249bf94e2bbfb50de7Johann#else
11468e1c830ade592be74773e249bf94e2bbfb50de7Johann  uint8_t border[32 + 32 - 1];  // outer border from bottom-left to top-right
11568e1c830ade592be74773e249bf94e2bbfb50de7Johann#endif
11668e1c830ade592be74773e249bf94e2bbfb50de7Johann
11768e1c830ade592be74773e249bf94e2bbfb50de7Johann  // dst(bs, bs - 2)[0], i.e., border starting at bottom-left
11868e1c830ade592be74773e249bf94e2bbfb50de7Johann  for (i = 0; i < bs - 2; ++i) {
11968e1c830ade592be74773e249bf94e2bbfb50de7Johann    border[i] = AVG3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]);
12068e1c830ade592be74773e249bf94e2bbfb50de7Johann  }
12168e1c830ade592be74773e249bf94e2bbfb50de7Johann  border[bs - 2] = AVG3(above[-1], left[0], left[1]);
12268e1c830ade592be74773e249bf94e2bbfb50de7Johann  border[bs - 1] = AVG3(left[0], above[-1], above[0]);
12368e1c830ade592be74773e249bf94e2bbfb50de7Johann  border[bs - 0] = AVG3(above[-1], above[0], above[1]);
12468e1c830ade592be74773e249bf94e2bbfb50de7Johann  // dst[0][2, size), i.e., remaining top border ascending
12568e1c830ade592be74773e249bf94e2bbfb50de7Johann  for (i = 0; i < bs - 2; ++i) {
12668e1c830ade592be74773e249bf94e2bbfb50de7Johann    border[bs + 1 + i] = AVG3(above[i], above[i + 1], above[i + 2]);
12768e1c830ade592be74773e249bf94e2bbfb50de7Johann  }
1287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
12968e1c830ade592be74773e249bf94e2bbfb50de7Johann  for (i = 0; i < bs; ++i) {
13068e1c830ade592be74773e249bf94e2bbfb50de7Johann    memcpy(dst + i * stride, border + bs - 1 - i, bs);
1317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
1367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
1377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG2(above[-1], left[0]);
1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (r = 1; r < bs; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
1397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
1427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[stride] = AVG3(above[-1], left[0], left[1]);
1437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; r++)
1447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
1457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
1467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs - 2; c++)
1487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
1497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
1507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; ++r) {
1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (c = 0; c < bs - 2; c++) dst[c] = dst[-stride + c - 2];
1537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               const uint8_t *above, const uint8_t *left) {
1597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
1617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst, above, bs);
1647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               const uint8_t *above, const uint8_t *left) {
1707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
1717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
1727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, left[r], bs);
1757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                const uint8_t *above, const uint8_t *left) {
1817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
1827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int ytop_left = above[-1];
1837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; c++)
1867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = clip_pixel(left[r] + above[c] - ytop_left);
1877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                    const uint8_t *above, const uint8_t *left) {
1937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, 128, bs);
1997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
2007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
2047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                     const uint8_t *above,
2057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                     const uint8_t *left) {
2067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
2077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
2087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < bs; i++) sum += left[i];
2107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
2117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
2137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, expected_dc, bs);
2147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
2157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
2197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                    const uint8_t *above, const uint8_t *left) {
2207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
2227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < bs; i++) sum += above[i];
2247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
2257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
2277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, expected_dc, bs);
2287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
2297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
2337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                const uint8_t *above, const uint8_t *left) {
2347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
2357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int count = 2 * bs;
2367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++) {
2387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += above[i];
2397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += left[i];
2407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (count >> 1)) / count;
2437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
2457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, expected_dc, bs);
2467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
2477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
250c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohannvoid vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
251c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann                            const uint8_t *above, const uint8_t *left) {
252c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int H = above[-1];
253c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int I = left[0];
254c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int J = left[1];
255c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int K = left[2];
256c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int L = left[3];
257c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
258c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memset(dst + stride * 0, AVG3(H, I, J), 4);
259c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memset(dst + stride * 1, AVG3(I, J, K), 4);
260c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memset(dst + stride * 2, AVG3(J, K, L), 4);
261c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memset(dst + stride * 3, AVG3(K, L, L), 4);
262c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann}
263c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
264c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohannvoid vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
265c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann                            const uint8_t *above, const uint8_t *left) {
266c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int H = above[-1];
267c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int I = above[0];
268c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int J = above[1];
269c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int K = above[2];
270c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int L = above[3];
271c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int M = above[4];
27268e1c830ade592be74773e249bf94e2bbfb50de7Johann  (void)left;
273c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
274c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  dst[0] = AVG3(H, I, J);
275c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  dst[1] = AVG3(I, J, K);
276c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  dst[2] = AVG3(J, K, L);
277c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  dst[3] = AVG3(K, L, M);
278c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memcpy(dst + stride * 1, dst, 4);
279c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memcpy(dst + stride * 2, dst, 4);
280c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  memcpy(dst + stride * 3, dst, 4);
281c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann}
282c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
2837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d207_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
2847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
2857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
2867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
2877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
2887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int L = left[3];
2897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)above;
2907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 0) = AVG2(I, J);
2917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(0, 1) = AVG2(J, K);
2927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 1) = DST(0, 2) = AVG2(K, L);
2937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(1, 0) = AVG3(I, J, K);
2947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0) = DST(1, 1) = AVG3(J, K, L);
2957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 1) = DST(1, 2) = AVG3(K, L, L);
2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L;
2977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d63_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
3007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                             const uint8_t *above, const uint8_t *left) {
3017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
3027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
3037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
3047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
3057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int E = above[4];
3067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int F = above[5];
3077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int G = above[6];
3087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 0) = AVG2(A, B);
3107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(0, 2) = AVG2(B, C);
3117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(1, 2) = AVG2(C, D);
3127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0) = DST(2, 2) = AVG2(D, E);
3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 2) = AVG2(E, F);  // differs from vp8
3147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 1) = AVG3(A, B, C);
3167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
3177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
3187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 3) = AVG3(E, F, G);  // differs from vp8
3207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
3217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3228b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_d63e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
323c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann                              const uint8_t *above, const uint8_t *left) {
324c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int A = above[0];
325c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int B = above[1];
326c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int C = above[2];
327c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int D = above[3];
328c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int E = above[4];
329c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int F = above[5];
330c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int G = above[6];
331c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int H = above[7];
332c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  (void)left;
3337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 0) = AVG2(A, B);
334c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(1, 0) = DST(0, 2) = AVG2(B, C);
335c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(2, 0) = DST(1, 2) = AVG2(C, D);
336c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(3, 0) = DST(2, 2) = AVG2(D, E);
3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 2) = AVG3(E, F, G);
338c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 1) = AVG3(A, B, C);
340c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
341c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
342c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
3437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 3) = AVG3(F, G, H);
344c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann}
345c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
3467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
3477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                             const uint8_t *above, const uint8_t *left) {
3487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
3497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
3507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
3517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
3527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int E = above[4];
3537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int F = above[5];
3547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int G = above[6];
3557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int H = above[7];
3567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)stride;
3577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
3587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 0) = AVG3(A, B, C);
3597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
3607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
3617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
3627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
3647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 3) = H;  // differs from vp8
3657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
3667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
367c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohannvoid vpx_d45e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
368c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann                              const uint8_t *above, const uint8_t *left) {
369c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int A = above[0];
370c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int B = above[1];
371c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int C = above[2];
372c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int D = above[3];
373c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int E = above[4];
374c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int F = above[5];
375c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int G = above[6];
376c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  const int H = above[7];
377c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  (void)stride;
378c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  (void)left;
3797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 0) = AVG3(A, B, C);
3807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
3817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
382c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
3837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 3) = AVG3(G, H, H);
386c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann}
387c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
3887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d117_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
3897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
3907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
3917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
3927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
3937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int X = above[-1];
3947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
3957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
3967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
3977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
3987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0) = DST(1, 2) = AVG2(X, A);
3997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(2, 2) = AVG2(A, B);
4007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(3, 2) = AVG2(B, C);
4017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 0) = AVG2(C, D);
4027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 3) = AVG3(K, J, I);
4047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 2) = AVG3(J, I, X);
4057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 1) = DST(1, 3) = AVG3(I, X, A);
4067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 1) = DST(2, 3) = AVG3(X, A, B);
4077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 1) = DST(3, 3) = AVG3(A, B, C);
4087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 1) = AVG3(B, C, D);
4097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d135_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
4127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
4137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
4147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
4157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
4167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int L = left[3];
4177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int X = above[-1];
4187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
4197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
4207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
4217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
4227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)stride;
4237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 3) = AVG3(J, K, L);
4247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(1, 3) = DST(0, 2) = AVG3(I, J, K);
4257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(2, 3) = DST(1, 2) = DST(0, 1) = AVG3(X, I, J);
4267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I);
4277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X);
4287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 1) = DST(2, 0) = AVG3(C, B, A);
4297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 0) = AVG3(D, C, B);
4307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d153_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
4337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
4347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
4357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
4367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
4377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int L = left[3];
4387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int X = above[-1];
4397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
4407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
4417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
4427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0) = DST(2, 1) = AVG2(I, X);
4447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 1) = DST(2, 2) = AVG2(J, I);
4457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 2) = DST(2, 3) = AVG2(K, J);
4467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(0, 3) = AVG2(L, K);
4477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(3, 0) = AVG3(A, B, C);
4497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(2, 0) = AVG3(X, A, B);
4507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(3, 1) = AVG3(I, X, A);
4517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 1) = DST(3, 2) = AVG3(J, I, X);
4527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 2) = DST(3, 3) = AVG3(K, J, I);
4537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  DST(1, 3) = AVG3(L, K, J);
4547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
4577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d207_predictor(uint16_t *dst, ptrdiff_t stride,
4587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
4597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
4607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
4637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // First column.
4657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 1; ++r) {
4667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG2(left[r], left[r + 1]);
4677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
4697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
4707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Second column.
4727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 2; ++r) {
4737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
4747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
4767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
4777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
4787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Rest of last row.
4807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (c = 0; c < bs - 2; ++c) dst[(bs - 1) * stride + c] = left[bs - 1];
4817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = bs - 2; r >= 0; --r) {
4837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs - 2; ++c)
4847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
4857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4887bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE void highbd_d63_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
4897bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        const uint16_t *above,
4907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        const uint16_t *left, int bd) {
4917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
4937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
4947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; ++r) {
4957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; ++c) {
4967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1],
4977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            above[(r >> 1) + c + 2])
4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     : AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]);
4997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
5007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
5057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        const uint16_t *above,
5067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        const uint16_t *left, int bd) {
5077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
5097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
5107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; ++r) {
5117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; ++c) {
5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      dst[c] = r + c + 2 < bs * 2
5137bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   ? AVG3(above[r + c], above[r + c + 1], above[r + c + 2])
5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   : above[bs * 2 - 1];
5157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
5167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride,
5217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
5227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
5237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
5257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // first row
5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (c = 0; c < bs; c++) dst[c] = AVG2(above[c - 1], above[c]);
5287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
5297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // second row
5317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
5327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
5337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
5347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of first col
5367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(above[-1], left[0], left[1]);
5377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 3; r < bs; ++r)
5387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
5397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of the block
5417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; ++r) {
5427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (c = 1; c < bs; c++) dst[c] = dst[-2 * stride + c - 1];
5437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride,
5487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
5497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
5508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  int i;
5518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
5528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // silence a spurious -Warray-bounds warning, possibly related to:
5538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
5548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  uint16_t border[69];
5558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#else
5568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  uint16_t border[32 + 32 - 1];  // outer border from bottom-left to top-right
5578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif
5587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
5597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // dst(bs, bs - 2)[0], i.e., border starting at bottom-left
5618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  for (i = 0; i < bs - 2; ++i) {
5628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    border[i] = AVG3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]);
5638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  }
5648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  border[bs - 2] = AVG3(above[-1], left[0], left[1]);
5658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  border[bs - 1] = AVG3(left[0], above[-1], above[0]);
5668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  border[bs - 0] = AVG3(above[-1], above[0], above[1]);
5678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // dst[0][2, size), i.e., remaining top border ascending
5688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  for (i = 0; i < bs - 2; ++i) {
5698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    border[bs + 1 + i] = AVG3(above[i], above[i + 1], above[i + 2]);
5708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  }
5717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  for (i = 0; i < bs; ++i) {
5738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    memcpy(dst + i * stride, border + bs - 1 - i, bs * sizeof(dst[0]));
5747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride,
5787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
5797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
5807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
5817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
5827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG2(above[-1], left[0]);
5837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (r = 1; r < bs; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
5847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
5857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
5877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[stride] = AVG3(above[-1], left[0], left[1]);
5887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; r++)
5897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
5907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
5917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs - 2; c++)
5937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
5947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
5957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; ++r) {
5977bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (c = 0; c < bs - 2; c++) dst[c] = dst[-stride + c - 2];
5987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6027bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
6037bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      const uint16_t *above,
6047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      const uint16_t *left, int bd) {
6057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
6067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
6077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
6087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst, above, bs * sizeof(uint16_t));
6107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6147bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
6157bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      const uint16_t *above,
6167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      const uint16_t *left, int bd) {
6177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
6187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
6197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
6207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, left[r], bs);
6227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6267bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
6277bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                       const uint16_t *above,
6287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       const uint16_t *left, int bd) {
6297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
6307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int ytop_left = above[-1];
6317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
6327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; c++)
6357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd);
6367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride,
6417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           int bs, const uint16_t *above,
6427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           const uint16_t *left, int bd) {
6437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
6447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
6457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
6467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, 128 << (bd - 8), bs);
6497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride,
6547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                            int bs, const uint16_t *above,
6557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                            const uint16_t *left, int bd) {
6567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
6577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)above;
6587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
6597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < bs; i++) sum += left[i];
6617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
6627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, expected_dc, bs);
6657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride,
6707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           int bs, const uint16_t *above,
6717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           const uint16_t *left, int bd) {
6727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
6737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)left;
6747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
6757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < bs; i++) sum += above[i];
6777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
6787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, expected_dc, bs);
6817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6857bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
6867bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                       const uint16_t *above,
6877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       const uint16_t *left, int bd) {
6887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
6897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int count = 2 * bs;
6907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)bd;
6917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++) {
6937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += above[i];
6947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += left[i];
6957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (count >> 1)) / count;
6987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
7007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, expected_dc, bs);
7017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
7027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
7037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
7048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7058b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_highbd_d207_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
7068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *above,
7078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *left, int bd) {
7088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int I = left[0];
7098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int J = left[1];
7108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int K = left[2];
7118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int L = left[3];
7128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)above;
7138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)bd;
7148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 0) = AVG2(I, J);
7158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 0) = DST(0, 1) = AVG2(J, K);
7168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 1) = DST(0, 2) = AVG2(K, L);
7178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 0) = AVG3(I, J, K);
7188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 0) = DST(1, 1) = AVG3(J, K, L);
7198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 1) = DST(1, 2) = AVG3(K, L, L);
7208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L;
7218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}
7228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7238b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_highbd_d63_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
7248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                    const uint16_t *above, const uint16_t *left,
7258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                    int bd) {
7268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int A = above[0];
7278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int B = above[1];
7288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int C = above[2];
7298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int D = above[3];
7308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int E = above[4];
7318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int F = above[5];
7328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int G = above[6];
7338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)left;
7348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)bd;
7358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 0) = AVG2(A, B);
7368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 0) = DST(0, 2) = AVG2(B, C);
7378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 0) = DST(1, 2) = AVG2(C, D);
7388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 0) = DST(2, 2) = AVG2(D, E);
7398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 2) = AVG2(E, F);  // differs from vp8
7408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 1) = AVG3(A, B, C);
7428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
7438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
7448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
7458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 3) = AVG3(E, F, G);  // differs from vp8
7468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}
7478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7488b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_highbd_d45_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
7498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                    const uint16_t *above, const uint16_t *left,
7508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                    int bd) {
7518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int A = above[0];
7528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int B = above[1];
7538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int C = above[2];
7548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int D = above[3];
7558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int E = above[4];
7568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int F = above[5];
7578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int G = above[6];
7588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int H = above[7];
7598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)left;
7608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)bd;
7618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 0) = AVG3(A, B, C);
7628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
7638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
7648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
7658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
7668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
7678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 3) = H;  // differs from vp8
7688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}
7698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7708b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_highbd_d117_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
7718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *above,
7728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *left, int bd) {
7738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int I = left[0];
7748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int J = left[1];
7758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int K = left[2];
7768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int X = above[-1];
7778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int A = above[0];
7788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int B = above[1];
7798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int C = above[2];
7808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int D = above[3];
7818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)bd;
7828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 0) = DST(1, 2) = AVG2(X, A);
7838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 0) = DST(2, 2) = AVG2(A, B);
7848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 0) = DST(3, 2) = AVG2(B, C);
7858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 0) = AVG2(C, D);
7868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 3) = AVG3(K, J, I);
7888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 2) = AVG3(J, I, X);
7898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 1) = DST(1, 3) = AVG3(I, X, A);
7908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 1) = DST(2, 3) = AVG3(X, A, B);
7918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 1) = DST(3, 3) = AVG3(A, B, C);
7928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 1) = AVG3(B, C, D);
7938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}
7948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
7958b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_highbd_d135_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
7968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *above,
7978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *left, int bd) {
7988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int I = left[0];
7998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int J = left[1];
8008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int K = left[2];
8018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int L = left[3];
8028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int X = above[-1];
8038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int A = above[0];
8048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int B = above[1];
8058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int C = above[2];
8068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int D = above[3];
8078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)bd;
8088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 3) = AVG3(J, K, L);
8098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 3) = DST(0, 2) = AVG3(I, J, K);
8108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 3) = DST(1, 2) = DST(0, 1) = AVG3(X, I, J);
8118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I);
8128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X);
8138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 1) = DST(2, 0) = AVG3(C, B, A);
8148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 0) = AVG3(D, C, B);
8158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}
8168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
8178b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid vpx_highbd_d153_predictor_4x4_c(uint16_t *dst, ptrdiff_t stride,
8188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *above,
8198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                                     const uint16_t *left, int bd) {
8208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int I = left[0];
8218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int J = left[1];
8228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int K = left[2];
8238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int L = left[3];
8248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int X = above[-1];
8258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int A = above[0];
8268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int B = above[1];
8278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const int C = above[2];
8288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  (void)bd;
8298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
8308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 0) = DST(2, 1) = AVG2(I, X);
8318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 1) = DST(2, 2) = AVG2(J, I);
8328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 2) = DST(2, 3) = AVG2(K, J);
8338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(0, 3) = AVG2(L, K);
8348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
8358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(3, 0) = AVG3(A, B, C);
8368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(2, 0) = AVG3(X, A, B);
8378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 0) = DST(3, 1) = AVG3(I, X, A);
8388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 1) = DST(3, 2) = AVG3(J, I, X);
8398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 2) = DST(3, 3) = AVG3(K, J, I);
8408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  DST(1, 3) = AVG3(L, K, J);
8418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}
8427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
8437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// This serves as a wrapper function, so that all the prediction functions
8457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// can be unified and accessed as a pointer array. Note that the boundary
8467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// above and left are not necessarily used all the time.
8477bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define intra_pred_sized(type, size)                        \
8487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  void vpx_##type##_predictor_##size##x##size##_c(          \
8497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      uint8_t *dst, ptrdiff_t stride, const uint8_t *above, \
8507bc9febe8749e98a3812a0dc4380ceae75c29450Johann      const uint8_t *left) {                                \
8517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    type##_predictor(dst, stride, size, above, left);       \
8527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
8537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
8557bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define intra_pred_highbd_sized(type, size)                        \
8567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  void vpx_highbd_##type##_predictor_##size##x##size##_c(          \
8577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      uint16_t *dst, ptrdiff_t stride, const uint16_t *above,      \
8587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      const uint16_t *left, int bd) {                              \
8597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    highbd_##type##_predictor(dst, stride, size, above, left, bd); \
8607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
8617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8627bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* clang-format off */
8637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_allsizes(type) \
8647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 4) \
8657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
8667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
8677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32) \
8687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 4) \
8697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 8) \
8707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 16) \
8717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 32)
8727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_no_4x4(type) \
8747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
8757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
8767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32) \
8777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 8) \
8787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 16) \
8797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 32)
8807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
8827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_allsizes(type) \
8837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 4) \
8847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
8857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
8867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32)
8877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_no_4x4(type) \
8897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
8907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
8917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32)
8927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
8937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d207)
8957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d63)
8967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d45)
8977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d117)
8987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d135)
8997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d153)
9007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(v)
9017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(h)
9027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(tm)
9037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc_128)
9047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc_left)
9057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc_top)
9067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc)
9077bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* clang-format on */
9087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#undef intra_pred_allsizes
909