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
177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#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;
247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // first column
267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 1; ++r)
277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG2(left[r], left[r + 1]);
287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // second column
327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 2; ++r)
337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // rest of last row
397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs - 2; ++c)
407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[(bs - 1) * stride + c] = left[bs - 1];
417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = bs - 2; r >= 0; --r)
437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs - 2; ++c)
447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                 const uint8_t *above, const uint8_t *left) {
497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int size;
517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs; ++c) {
537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG2(above[c], above[c + 1]);
547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[stride + c] = AVG3(above[c], above[c + 1], above[c + 2]);
557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2, size = bs - 2; r < bs; r += 2, --size) {
577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst + (r + 0) * stride, dst + (r >> 1), size);
587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst + (r + 0) * stride + size, above[bs - 1], bs - size);
597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst + (r + 1) * stride, dst + stride + (r >> 1), size);
607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst + (r + 1) * stride + size, above[bs - 1], bs - size);
617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                 const uint8_t *above, const uint8_t *left) {
667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t above_right = above[bs - 1];
677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *const dst_row0 = dst;
687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int x, size;
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (x = 0; x < bs - 1; ++x) {
727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[x] = AVG3(above[x], above[x + 1], above[x + 2]);
737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[bs - 1] = above_right;
757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (x = 1, size = bs - 2; x < bs; ++x, --size) {
777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst, dst_row0 + x, size);
787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst + size, above_right, x + 1);
797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // first row
887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs; c++)
897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG2(above[c - 1], above[c]);
907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // second row
937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 1; c < bs; c++)
957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of first col
997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(above[-1], left[0], left[1]);
1007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 3; r < bs; ++r)
1017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
1027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of the block
1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; ++r) {
1057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 1; c < bs; c++)
1067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = dst[-2 * stride + c - 1];
1077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
1137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
1147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
1157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 1; c < bs; c++)
1167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
1177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[stride] = AVG3(above[-1], left[0], left[1]);
1197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; ++r)
1207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
1217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
1237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; ++r) {
1247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 1; c < bs; c++)
1257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = dst[-stride + c - 1];
1267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                  const uint8_t *above, const uint8_t *left) {
1327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
1337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG2(above[-1], left[0]);
1347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; r++)
1357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG2(left[r - 1], left[r]);
1367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
1377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
1397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[stride] = AVG3(above[-1], left[0], left[1]);
1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; r++)
1417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
1427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
1437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs - 2; c++)
1457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
1467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
1477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; ++r) {
1497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs - 2; c++)
1507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = dst[-stride + c - 2];
1517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               const uint8_t *above, const uint8_t *left) {
1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
1597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst, above, bs);
1627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               const uint8_t *above, const uint8_t *left) {
1687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
1697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
1707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, left[r], bs);
1737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                const uint8_t *above, const uint8_t *left) {
1797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
1807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int ytop_left = above[-1];
1817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; c++)
1847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = clip_pixel(left[r] + above[c] - ytop_left);
1857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
1907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                    const uint8_t *above, const uint8_t *left) {
1917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
1927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
1937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
1947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, 128, bs);
1977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
2027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                     const uint8_t *above,
2037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                     const uint8_t *left) {
2047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
2057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
2067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++)
2087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += left[i];
2097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
2107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
2127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dst, expected_dc, bs);
2137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
2147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
2187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                    const uint8_t *above, const uint8_t *left) {
2197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
2207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
2217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++)
2237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    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
2507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d207_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
2517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
2527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
2537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
2547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
2557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int L = left[3];
2567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)above;
2577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0) =             AVG2(I, J);
2587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(0, 1) = AVG2(J, K);
2597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 1) = DST(0, 2) = AVG2(K, L);
2607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) =             AVG3(I, J, K);
2617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0) = DST(1, 1) = AVG3(J, K, L);
2627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 1) = DST(1, 2) = AVG3(K, L, L);
2637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 2) = DST(2, 2) =
2647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L;
2657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d63_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
2687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                             const uint8_t *above, const uint8_t *left) {
2697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
2707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
2717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
2727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
2737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int E = above[4];
2747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int F = above[5];
2757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int G = above[6];
2767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
2777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0) =             AVG2(A, B);
2787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(0, 2) = AVG2(B, C);
2797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(1, 2) = AVG2(C, D);
2807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0) = DST(2, 2) = AVG2(D, E);
2817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              DST(3, 2) = AVG2(E, F);  // differs from vp8
2827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 1) =             AVG3(A, B, C);
2847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
2857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
2867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
2877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              DST(3, 3) = AVG3(E, F, G);  // differs from vp8
2887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
2917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                             const uint8_t *above, const uint8_t *left) {
2927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
2937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
2947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
2957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
2967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int E = above[4];
2977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int F = above[5];
2987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int G = above[6];
2997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int H = above[7];
3007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)stride;
3017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)left;
3027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0)                                     = AVG3(A, B, C);
3037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(0, 1)                         = AVG3(B, C, D);
3047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(1, 1) = DST(0, 2)             = AVG3(C, D, E);
3057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
3067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
3077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                          DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
3087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      DST(3, 3) = H;  // differs from vp8
3097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
3107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d117_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
3127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
3137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
3147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
3157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
3167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int X = above[-1];
3177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
3187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
3197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
3207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
3217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0) = DST(1, 2) = AVG2(X, A);
3227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(2, 2) = AVG2(A, B);
3237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0) = DST(3, 2) = AVG2(B, C);
3247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0)             = AVG2(C, D);
3257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 3) =             AVG3(K, J, I);
3277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 2) =             AVG3(J, I, X);
3287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 1) = DST(1, 3) = AVG3(I, X, A);
3297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 1) = DST(2, 3) = AVG3(X, A, B);
3307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 1) = DST(3, 3) = AVG3(A, B, C);
3317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 1) =             AVG3(B, C, D);
3327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
3337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d135_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
3357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
3367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
3377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
3387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
3397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int L = left[3];
3407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int X = above[-1];
3417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
3427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
3437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
3447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int D = above[3];
3457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void)stride;
3467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 3)                                     = AVG3(J, K, L);
3477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 3) = DST(0, 2)                         = AVG3(I, J, K);
3487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 3) = DST(1, 2) = DST(0, 1)             = AVG3(X, I, J);
3497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I);
3507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X);
3517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                          DST(3, 1) = DST(2, 0) = AVG3(C, B, A);
3527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      DST(3, 0) = AVG3(D, C, B);
3537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
3547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_d153_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
3567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              const uint8_t *above, const uint8_t *left) {
3577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int I = left[0];
3587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int J = left[1];
3597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int K = left[2];
3607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int L = left[3];
3617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int X = above[-1];
3627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int A = above[0];
3637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int B = above[1];
3647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int C = above[2];
3657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 0) = DST(2, 1) = AVG2(I, X);
3677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 1) = DST(2, 2) = AVG2(J, I);
3687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 2) = DST(2, 3) = AVG2(K, J);
3697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(0, 3)             = AVG2(L, K);
3707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(3, 0)             = AVG3(A, B, C);
3727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(2, 0)             = AVG3(X, A, B);
3737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 0) = DST(3, 1) = AVG3(I, X, A);
3747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 1) = DST(3, 2) = AVG3(J, I, X);
3757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 2) = DST(3, 3) = AVG3(K, J, I);
3767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  DST(1, 3)             = AVG3(L, K, J);
3777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
3787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
3807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d207_predictor(uint16_t *dst, ptrdiff_t stride,
3817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
3827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
3837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
3847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
3857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
3867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // First column.
3887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 1; ++r) {
3897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG2(left[r], left[r + 1]);
3907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
3917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
3927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
3937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
3947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Second column.
3957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs - 2; ++r) {
3967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]);
3977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
3987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]);
3997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[(bs - 1) * stride] = left[bs - 1];
4007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
4017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Rest of last row.
4037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs - 2; ++c)
4047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[(bs - 1) * stride + c] = left[bs - 1];
4057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = bs - 2; r >= 0; --r) {
4077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs - 2; ++c)
4087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[r * stride + c] = dst[(r + 1) * stride + c - 2];
4097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d63_predictor(uint16_t *dst, ptrdiff_t stride,
4137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        int bs, const uint16_t *above,
4147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        const uint16_t *left, int bd) {
4157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
4177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
4187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; ++r) {
4197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; ++c) {
4207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1],
4217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            above[(r >> 1) + c + 2])
4227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          : AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]);
4237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
4247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
4257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
4297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        const uint16_t *above,
4307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                        const uint16_t *left, int bd) {
4317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
4337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
4347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; ++r) {
4357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; ++c) {
4367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = r + c + 2 < bs * 2 ? AVG3(above[r + c], above[r + c + 1],
4377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         above[r + c + 2])
4387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          : above[bs * 2 - 1];
4397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
4407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
4417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride,
4457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
4467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
4477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
4497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // first row
4517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs; c++)
4527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG2(above[c - 1], above[c]);
4537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
4547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // second row
4567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
4577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 1; c < bs; c++)
4587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
4597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
4607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of first col
4627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(above[-1], left[0], left[1]);
4637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 3; r < bs; ++r)
4647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
4657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // the rest of the block
4677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; ++r) {
4687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 1; c < bs; c++)
4697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = dst[-2 * stride + c - 1];
4707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
4717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride,
4757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
4767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
4777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
4797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
4807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 1; c < bs; c++)
4817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
4827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[stride] = AVG3(above[-1], left[0], left[1]);
4847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; ++r)
4857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
4867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
4887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; ++r) {
4897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 1; c < bs; c++)
4907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = dst[-stride + c - 1];
4917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
4927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
4937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
4947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride,
4967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         int bs, const uint16_t *above,
4977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                         const uint16_t *left, int bd) {
4987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
4997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
5007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG2(above[-1], left[0]);
5017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; r++)
5027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG2(left[r - 1], left[r]);
5037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
5047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[0] = AVG3(left[0], above[-1], above[0]);
5067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst[stride] = AVG3(above[-1], left[0], left[1]);
5077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 2; r < bs; r++)
5087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
5097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst++;
5107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (c = 0; c < bs - 2; c++)
5127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
5137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dst += stride;
5147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 1; r < bs; ++r) {
5167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs - 2; c++)
5177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = dst[-stride + c - 2];
5187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride,
5237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      int bs, const uint16_t *above,
5247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      const uint16_t *left, int bd) {
5257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
5267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
5277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
5287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
5297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memcpy(dst, above, bs * sizeof(uint16_t));
5307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride,
5357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      int bs, const uint16_t *above,
5367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                      const uint16_t *left, int bd) {
5377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
5387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
5397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
5407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
5417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, left[r], bs);
5427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride,
5477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       int bs, const uint16_t *above,
5487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       const uint16_t *left, int bd) {
5497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r, c;
5507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int ytop_left = above[-1];
5517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
5527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
5547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (c = 0; c < bs; c++)
5557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd);
5567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride,
5617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           int bs, const uint16_t *above,
5627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           const uint16_t *left, int bd) {
5637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int r;
5647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
5657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
5667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
5687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, 128 << (bd - 8), bs);
5697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride,
5747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                            int bs, const uint16_t *above,
5757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                            const uint16_t *left, int bd) {
5767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
5777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) above;
5787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
5797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++)
5817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += left[i];
5827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
5837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
5857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, expected_dc, bs);
5867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
5877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
5887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
5897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride,
5917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           int bs, const uint16_t *above,
5927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           const uint16_t *left, int bd) {
5937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
5947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) left;
5957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
5967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++)
5987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += above[i];
5997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (bs >> 1)) / bs;
6007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, expected_dc, bs);
6037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride,
6087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       int bs, const uint16_t *above,
6097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       const uint16_t *left, int bd) {
6107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, r, expected_dc, sum = 0;
6117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int count = 2 * bs;
6127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  (void) bd;
6137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < bs; i++) {
6157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += above[i];
6167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    sum += left[i];
6177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  expected_dc = (sum + (count >> 1)) / count;
6207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (r = 0; r < bs; r++) {
6227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_memset16(dst, expected_dc, bs);
6237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += stride;
6247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
6267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
6277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// This serves as a wrapper function, so that all the prediction functions
6297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// can be unified and accessed as a pointer array. Note that the boundary
6307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// above and left are not necessarily used all the time.
6317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_sized(type, size) \
6327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  void vpx_##type##_predictor_##size##x##size##_c(uint8_t *dst, \
6337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                                  ptrdiff_t stride, \
6347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                                  const uint8_t *above, \
6357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                                  const uint8_t *left) { \
6367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    type##_predictor(dst, stride, size, above, left); \
6377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
6407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_highbd_sized(type, size) \
6417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  void vpx_highbd_##type##_predictor_##size##x##size##_c( \
6427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      uint16_t *dst, ptrdiff_t stride, const uint16_t *above, \
6437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      const uint16_t *left, int bd) { \
6447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    highbd_##type##_predictor(dst, stride, size, above, left, bd); \
6457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
6467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_allsizes(type) \
6487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 4) \
6497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
6507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
6517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32) \
6527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 4) \
6537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 8) \
6547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 16) \
6557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 32)
6567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_no_4x4(type) \
6587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
6597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
6607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32) \
6617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 4) \
6627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 8) \
6637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 16) \
6647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_highbd_sized(type, 32)
6657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
6677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_allsizes(type) \
6687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 4) \
6697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
6707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
6717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32)
6727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define intra_pred_no_4x4(type) \
6747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 8) \
6757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 16) \
6767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  intra_pred_sized(type, 32)
6777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
6787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
6797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d207)
6807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d63)
6817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d45)
6827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d117)
6837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d135)
6847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_no_4x4(d153)
6857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(v)
6867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(h)
6877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(tm)
6887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc_128)
6897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc_left)
6907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc_top)
6917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianintra_pred_allsizes(dc)
6927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#undef intra_pred_allsizes
693