/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the
 * Alliance for Open Media Patent License 1.0 was not distributed with this
 * source code in the PATENTS file, you can obtain it at
 * aomedia.org/license/patent-license/.
 */

#include <math.h>

#include "config/aom_config.h"
#include "config/aom_dsp_rtcd.h"
#include "config/av1_rtcd.h"

#include "aom_dsp/aom_dsp_common.h"
#include "aom_mem/aom_mem.h"
#include "aom_ports/aom_once.h"
#include "aom_ports/mem.h"
#include "aom_ports/system_state.h"
#include "av1/common/av1_common_int.h"
#include "av1/common/cfl.h"
#include "av1/common/intra_dip.h"
#include "av1/common/reconintra.h"
#include <av1/encoder/block.h>

enum {
  NEED_LEFT = 1 << 1,
  NEED_ABOVE = 1 << 2,
  NEED_ABOVERIGHT = 1 << 3,
  NEED_ABOVELEFT = 1 << 4,
  NEED_BOTTOMLEFT = 1 << 5,
};

#define INTRA_EDGE_FILT 3
#define INTRA_EDGE_TAPS 5
#define MAX_UPSAMPLE_SZ 16
#define NUM_INTRA_NEIGHBOUR_PIXELS (MAX_TX_SIZE * 2 + 64)

static const uint8_t extend_modes[INTRA_MODES] = {
  NEED_ABOVE | NEED_LEFT | NEED_ABOVELEFT,  // DC
  NEED_ABOVE,                               // V
  NEED_LEFT,                                // H
  NEED_ABOVE | NEED_ABOVERIGHT,             // D45
  NEED_LEFT | NEED_ABOVE | NEED_ABOVELEFT,  // D135
  NEED_LEFT | NEED_ABOVE | NEED_ABOVELEFT,  // D113
  NEED_LEFT | NEED_ABOVE | NEED_ABOVELEFT,  // D157
  NEED_LEFT | NEED_BOTTOMLEFT,              // D203
  NEED_ABOVE | NEED_ABOVERIGHT,             // D67
  NEED_LEFT | NEED_ABOVE | NEED_ABOVELEFT
#if CONFIG_BLEND_MODE
      | NEED_ABOVERIGHT | NEED_BOTTOMLEFT
#endif  // CONFIG_BLEND_MODE
  ,     // SMOOTH
  NEED_LEFT | NEED_ABOVE
#if CONFIG_BLEND_MODE
      | NEED_BOTTOMLEFT
#endif  // CONFIG_BLEND_MODE
  ,     // SMOOTH_V
  NEED_LEFT | NEED_ABOVE
#if CONFIG_BLEND_MODE
      | NEED_ABOVERIGHT
#endif                                      // CONFIG_BLEND_MODE
  ,                                         // SMOOTH_H
  NEED_LEFT | NEED_ABOVE | NEED_ABOVELEFT,  // PAETH
};

#if CONFIG_EXT_RECUR_PARTITIONS
static int has_top_right(const AV1_COMMON *cm, const MACROBLOCKD *xd,
                         BLOCK_SIZE bsize, int mi_row, int mi_col,
                         int top_available, int right_available, TX_SIZE txsz,
#if CONFIG_NEW_TX_PARTITION
                         int plane,
#endif  // CONFIG_NEW_TX_PARTITION
                         int row_off, int col_off, int ss_x, int ss_y,
                         int px_to_right_edge, int *px_top_right,
                         int is_bsize_altered_for_chroma) {
  if (!top_available || !right_available) return 0;

  const int bw_unit = mi_size_wide[bsize];
  const int plane_bw_unit = AOMMAX(bw_unit >> ss_x, 1);
  const int top_right_count_unit = tx_size_wide_unit[txsz];
  const int px_tr_common = AOMMIN(tx_size_wide[txsz], px_to_right_edge);

  if (px_tr_common <= 0) return 0;

  *px_top_right = px_tr_common;

#if CONFIG_NEW_TX_PARTITION
#if CONFIG_4WAY_5WAY_TX_PARTITION
  if (plane == AOM_PLANE_Y) {
    int txb_idx = xd->mi[0]->txb_idx;
    TX_PARTITION_TYPE partition = xd->mi[0]->tx_partition_type[0];
    if (partition == TX_PARTITION_HORZ5 || partition == TX_PARTITION_VERT5) {
      if (txb_idx >= 1) return 0;
    }
  }
#endif  // CONFIG_4WAY_5WAY_TX_PARTITION
#endif  // CONFIG_NEW_TX_PARTITION

  if (row_off > 0) {  // Just need to check if enough pixels on the right.
    const int plane_bw_unit_64 = mi_size_wide[BLOCK_64X64] >> ss_x;
    if (block_size_wide[bsize] > block_size_wide[BLOCK_64X64]) {
      // Special case: For 256 and 128 blocks, if the tx unit's top right center
      // is aligned with 64x64 boundary and we are not at the right most column,
      // then the tx unit does in fact have pixels available at its top-right
      // corner.
      const int tr_col = col_off + top_right_count_unit;
      const int plane_bh_unit_64 = mi_size_high[BLOCK_64X64] >> ss_y;
      if (tr_col != plane_bw_unit && tr_col % plane_bw_unit_64 == 0 &&
          row_off % plane_bh_unit_64 == 0) {
        return 1;
      }
      const int col_off_64 = col_off % plane_bw_unit_64;
      return col_off_64 + top_right_count_unit < plane_bw_unit_64;
    }
    return col_off + top_right_count_unit < plane_bw_unit;
  } else {
    // All top-right pixels are in the block above, which is already available.
    if (col_off + top_right_count_unit < plane_bw_unit) return 1;

    // Handle the top-right intra tx block of the coding block
    const int sb_mi_size = mi_size_wide[cm->sb_size];
    const int mi_row_aligned =
        is_bsize_altered_for_chroma
            ? xd->mi[0]->chroma_ref_info.mi_row_chroma_base
            : mi_row;
    const int mi_col_aligned =
        is_bsize_altered_for_chroma
            ? xd->mi[0]->chroma_ref_info.mi_col_chroma_base
            : mi_col;
    const int tr_mask_row = (mi_row_aligned & (sb_mi_size - 1)) - 1;
    const int tr_mask_col =
        (mi_col_aligned & (sb_mi_size - 1)) + mi_size_wide[bsize];

    if (tr_mask_row < 0) {
      return 1;
    } else if (tr_mask_col >= sb_mi_size) {
      return 0;
    } else {  // Handle the general case: the top_right mi is in the same SB
      const int tr_offset = tr_mask_row * xd->is_mi_coded_stride + tr_mask_col;
      // As long as the first mi is available, we determine tr is available
      int has_tr = xd->is_mi_coded[av1_get_sdp_idx(xd->tree_type)][tr_offset];

      // Calculate px_top_right: how many top-right pixels are available. If it
      // is less than tx_size_wide[txsz], px_top_right will be used to
      // determine the location of the last available pixel, which will be used
      // for padding.
      if (has_tr) {
        int mi_tr = 0;
        for (int i = 0; i < top_right_count_unit << ss_x; ++i) {
          if ((tr_mask_col + i) >= sb_mi_size ||
              !xd->is_mi_coded[av1_get_sdp_idx(xd->tree_type)][tr_offset + i]) {
            break;
          } else {
            mi_tr++;
          }
        }

        *px_top_right = AOMMIN((mi_tr << MI_SIZE_LOG2) >> ss_x, px_tr_common);
      }

      return has_tr;
    }
  }
}
#else
// Tables to store if the top-right reference pixels are available. The flags
// are represented with bits, packed into 8-bit integers. E.g., for the 32x32
// blocks in a 128x128 superblock, the index of the "o" block is 10 (in raster
// order), so its flag is stored at the 3rd bit of the 2nd entry in the table,
// i.e. (table[10 / 8] >> (10 % 8)) & 1.
//       . . . .
//       . . . .
//       . . o .
//       . . . .
static uint8_t has_tr_4x4[128] = {
  255, 255, 255, 255, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  127, 127, 127, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  255, 127, 255, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  127, 127, 127, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  255, 255, 255, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  127, 127, 127, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  255, 127, 255, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
  127, 127, 127, 127, 85, 85, 85, 85, 119, 119, 119, 119, 85, 85, 85, 85,
};
static uint8_t has_tr_4x8[64] = {
  255, 255, 255, 255, 119, 119, 119, 119, 127, 127, 127, 127, 119,
  119, 119, 119, 255, 127, 255, 127, 119, 119, 119, 119, 127, 127,
  127, 127, 119, 119, 119, 119, 255, 255, 255, 127, 119, 119, 119,
  119, 127, 127, 127, 127, 119, 119, 119, 119, 255, 127, 255, 127,
  119, 119, 119, 119, 127, 127, 127, 127, 119, 119, 119, 119,
};
static uint8_t has_tr_8x4[64] = {
  255, 255, 0, 0, 85, 85, 0, 0, 119, 119, 0, 0, 85, 85, 0, 0,
  127, 127, 0, 0, 85, 85, 0, 0, 119, 119, 0, 0, 85, 85, 0, 0,
  255, 127, 0, 0, 85, 85, 0, 0, 119, 119, 0, 0, 85, 85, 0, 0,
  127, 127, 0, 0, 85, 85, 0, 0, 119, 119, 0, 0, 85, 85, 0, 0,
};
static uint8_t has_tr_8x8[32] = {
  255, 255, 85, 85, 119, 119, 85, 85, 127, 127, 85, 85, 119, 119, 85, 85,
  255, 127, 85, 85, 119, 119, 85, 85, 127, 127, 85, 85, 119, 119, 85, 85,
};
static uint8_t has_tr_8x16[16] = {
  255, 255, 119, 119, 127, 127, 119, 119,
  255, 127, 119, 119, 127, 127, 119, 119,
};
static uint8_t has_tr_16x8[16] = {
  255, 0, 85, 0, 119, 0, 85, 0, 127, 0, 85, 0, 119, 0, 85, 0,
};
static uint8_t has_tr_16x16[8] = {
  255, 85, 119, 85, 127, 85, 119, 85,
};
static uint8_t has_tr_16x32[4] = { 255, 119, 127, 119 };
static uint8_t has_tr_32x16[4] = { 15, 5, 7, 5 };
static uint8_t has_tr_32x32[2] = { 95, 87 };
static uint8_t has_tr_32x64[1] = { 127 };
static uint8_t has_tr_64x32[1] = { 19 };
static uint8_t has_tr_64x64[1] = { 7 };
static uint8_t has_tr_64x128[1] = { 3 };
static uint8_t has_tr_128x64[1] = { 1 };
static uint8_t has_tr_128x128[1] = { 1 };
static uint8_t has_tr_4x16[32] = {
  255, 255, 255, 255, 127, 127, 127, 127, 255, 127, 255,
  127, 127, 127, 127, 127, 255, 255, 255, 127, 127, 127,
  127, 127, 255, 127, 255, 127, 127, 127, 127, 127,
};
static uint8_t has_tr_16x4[32] = {
  255, 0, 0, 0, 85, 0, 0, 0, 119, 0, 0, 0, 85, 0, 0, 0,
  127, 0, 0, 0, 85, 0, 0, 0, 119, 0, 0, 0, 85, 0, 0, 0,
};
static uint8_t has_tr_8x32[8] = {
  255, 255, 127, 127, 255, 127, 127, 127,
};
static uint8_t has_tr_32x8[8] = {
  15, 0, 5, 0, 7, 0, 5, 0,
};
static uint8_t has_tr_16x64[2] = { 255, 127 };
static uint8_t has_tr_64x16[2] = { 3, 1 };

static const uint8_t *const has_tr_tables[BLOCK_SIZES_ALL] = {
  // 4X4
  has_tr_4x4,
  // 4X8,       8X4,            8X8
  has_tr_4x8, has_tr_8x4, has_tr_8x8,
  // 8X16,      16X8,           16X16
  has_tr_8x16, has_tr_16x8, has_tr_16x16,
  // 16X32,     32X16,          32X32
  has_tr_16x32, has_tr_32x16, has_tr_32x32,
  // 32X64,     64X32,          64X64
  has_tr_32x64, has_tr_64x32, has_tr_64x64,
  // 64x128,    128x64,         128x128
  has_tr_64x128, has_tr_128x64, has_tr_128x128,
  // 4x16,      16x4,            8x32
  has_tr_4x16, has_tr_16x4, has_tr_8x32,
  // 32x8,      16x64,           64x16
  has_tr_32x8, has_tr_16x64, has_tr_64x16
};

static uint8_t has_tr_vert_8x8[32] = {
  255, 255, 0, 0, 119, 119, 0, 0, 127, 127, 0, 0, 119, 119, 0, 0,
  255, 127, 0, 0, 119, 119, 0, 0, 127, 127, 0, 0, 119, 119, 0, 0,
};
static uint8_t has_tr_vert_16x16[8] = {
  255, 0, 119, 0, 127, 0, 119, 0,
};
static uint8_t has_tr_vert_32x32[2] = { 15, 7 };
static uint8_t has_tr_vert_64x64[1] = { 3 };

// The _vert_* tables are like the ordinary tables above, but describe the
// order we visit square blocks when doing a PARTITION_VERT_A or
// PARTITION_VERT_B. This is the same order as normal except for on the last
// split where we go vertically (TL, BL, TR, BR). We treat the rectangular block
// as a pair of squares, which means that these tables work correctly for both
// mixed vertical partition types.
//
// There are tables for each of the square sizes. Vertical rectangles (like
// BLOCK_16X32) use their respective "non-vert" table
static const uint8_t *const has_tr_vert_tables[BLOCK_SIZES] = {
  // 4X4
  NULL,
  // 4X8,      8X4,         8X8
  has_tr_4x8, NULL, has_tr_vert_8x8,
  // 8X16,     16X8,        16X16
  has_tr_8x16, NULL, has_tr_vert_16x16,
  // 16X32,    32X16,       32X32
  has_tr_16x32, NULL, has_tr_vert_32x32,
  // 32X64,    64X32,       64X64
  has_tr_32x64, NULL, has_tr_vert_64x64,
  // 64x128,   128x64,      128x128
  has_tr_64x128, NULL, has_tr_128x128
};

static const uint8_t *get_has_tr_table(PARTITION_TYPE partition,
                                       BLOCK_SIZE bsize) {
  const uint8_t *ret = NULL;
  // If this is a mixed vertical partition, look up bsize in orders_vert.
  if (partition == PARTITION_VERT_A || partition == PARTITION_VERT_B) {
    assert(bsize < BLOCK_SIZES);
    ret = has_tr_vert_tables[bsize];
  } else {
    ret = has_tr_tables[bsize];
  }
  assert(ret);
  return ret;
}

static int has_top_right(const AV1_COMMON *cm, BLOCK_SIZE bsize, int mi_row,
                         int mi_col, int top_available, int right_available,
                         PARTITION_TYPE partition, TX_SIZE txsz, int row_off,
                         int col_off, int ss_x, int ss_y) {
  if (!top_available || !right_available) return 0;

  const int bw_unit = mi_size_wide[bsize];
  const int plane_bw_unit = AOMMAX(bw_unit >> ss_x, 1);
  const int top_right_count_unit = tx_size_wide_unit[txsz];

  if (row_off > 0) {  // Just need to check if enough pixels on the right.
    if (block_size_wide[bsize] > block_size_wide[BLOCK_64X64]) {
      // Special case: For 128x128 blocks, the transform unit whose
      // top-right corner is at the center of the block does in fact have
      // pixels available at its top-right corner.
      if (row_off == mi_size_high[BLOCK_64X64] >> ss_y &&
          col_off + top_right_count_unit == mi_size_wide[BLOCK_64X64] >> ss_x) {
        return 1;
      }
      const int plane_bw_unit_64 = mi_size_wide[BLOCK_64X64] >> ss_x;
      const int col_off_64 = col_off % plane_bw_unit_64;
      return col_off_64 + top_right_count_unit < plane_bw_unit_64;
    }
    return col_off + top_right_count_unit < plane_bw_unit;
  } else {
    // All top-right pixels are in the block above, which is already available.
    if (col_off + top_right_count_unit < plane_bw_unit) return 1;

    const int bw_in_mi_log2 = mi_size_wide_log2[bsize];
    const int bh_in_mi_log2 = mi_size_high_log2[bsize];
    const int sb_mi_size = mi_size_high[cm->sb_size];
    const int blk_row_in_sb = (mi_row & (sb_mi_size - 1)) >> bh_in_mi_log2;
    const int blk_col_in_sb = (mi_col & (sb_mi_size - 1)) >> bw_in_mi_log2;

    // Top row of superblock: so top-right pixels are in the top and/or
    // top-right superblocks, both of which are already available.
    if (blk_row_in_sb == 0) return 1;

    // Rightmost column of superblock (and not the top row): so top-right pixels
    // fall in the right superblock, which is not available yet.
    if (((blk_col_in_sb + 1) << bw_in_mi_log2) >= sb_mi_size) {
      return 0;
    }

    // General case (neither top row nor rightmost column): check if the
    // top-right block is coded before the current block.
    const int this_blk_index =
        ((blk_row_in_sb + 0) << (MAX_MIB_SIZE_LOG2 - bw_in_mi_log2)) +
        blk_col_in_sb + 0;
    const int idx1 = this_blk_index / 8;
    const int idx2 = this_blk_index % 8;
    const uint8_t *has_tr_table = get_has_tr_table(partition, bsize);
    return (has_tr_table[idx1] >> idx2) & 1;
  }
}
#endif

static int has_bottom_left(const AV1_COMMON *cm, const MACROBLOCKD *xd,
                           BLOCK_SIZE bsize, int mi_row, int mi_col,
                           int bottom_available, int left_available,
                           TX_SIZE txsz,
#if CONFIG_NEW_TX_PARTITION
                           int plane,
#endif  // CONFIG_NEW_TX_PARTITION
                           int row_off, int col_off, int ss_x, int ss_y,
                           int px_to_bottom_edge, int *px_bottom_left,
                           int is_bsize_altered_for_chroma) {
  if (!bottom_available || !left_available) return 0;

  const int px_bl_common = AOMMIN(tx_size_high[txsz], px_to_bottom_edge);

  if (px_bl_common <= 0) return 0;

#if CONFIG_NEW_TX_PARTITION
#if CONFIG_4WAY_5WAY_TX_PARTITION
  if (plane == AOM_PLANE_Y) {
    int txb_idx = xd->mi[0]->txb_idx;
    TX_PARTITION_TYPE partition = xd->mi[0]->tx_partition_type[0];
    if (partition == TX_PARTITION_HORZ5 || partition == TX_PARTITION_VERT5) {
      if (txb_idx >= 1) return 0;
    }
  }
#endif  // CONFIG_4WAY_5WAY_TX_PARTITION
#endif  // CONFIG_NEW_TX_PARTITION
  *px_bottom_left = px_bl_common;

  // Special case for 128x* blocks, when col_off is half the block width.
  // This is needed because 128x* superblocks are divided into 64x* blocks in
  // raster order
  if (block_size_wide[bsize] > block_size_wide[BLOCK_64X64] && col_off > 0) {
    const int plane_bw_unit_64 = mi_size_wide[BLOCK_64X64] >> ss_x;
    const int col_off_64 = col_off % plane_bw_unit_64;
    if (col_off_64 == 0) {
      // We are at the left edge of top-right or bottom-right 64x* block.
      const int plane_bh_unit_64 = mi_size_high[BLOCK_64X64] >> ss_y;
      const int row_off_64 = row_off % plane_bh_unit_64;
      const int plane_bh_unit =
          AOMMIN(mi_size_high[bsize] >> ss_y, plane_bh_unit_64);
      // Check if all bottom-left pixels are in the left 64x* block (which is
      // already coded).
      return row_off_64 + tx_size_high_unit[txsz] < plane_bh_unit;
    }
  }

  if (col_off > 0) {
    // Bottom-left pixels are in the bottom-left block, which is not available.
    return 0;
  } else {
    const int bh_unit = mi_size_high[bsize];
    const int plane_bh_unit = AOMMAX(bh_unit >> ss_y, 1);
    const int bottom_left_count_unit = tx_size_high_unit[txsz];

    // All bottom-left pixels are in the left block, which is already available.
    if (row_off + bottom_left_count_unit < plane_bh_unit) return 1;

    // The general case: neither the leftmost column nor the bottom row. The
    // bottom-left mi is in the same SB
    const int sb_mi_size = mi_size_high[cm->sb_size];
    const int mi_row_aligned =
        is_bsize_altered_for_chroma
            ? xd->mi[0]->chroma_ref_info.mi_row_chroma_base
            : mi_row;
    const int mi_col_aligned =
        is_bsize_altered_for_chroma
            ? xd->mi[0]->chroma_ref_info.mi_col_chroma_base
            : mi_col;
    const int bl_mask_row =
        (mi_row_aligned & (sb_mi_size - 1)) + mi_size_high[bsize];
    const int bl_mask_col = (mi_col_aligned & (sb_mi_size - 1)) - 1;

    if (bl_mask_col < 0) {
      const int plane_sb_height = block_size_high[cm->sb_size] >> ss_y;
      const int plane_bottom_row =
          (((mi_row_aligned & (sb_mi_size - 1)) << MI_SIZE_LOG2) +
           block_size_high[bsize]) >>
          ss_y;
      *px_bottom_left =
          AOMMIN(plane_sb_height - plane_bottom_row, px_bl_common);

      return *px_bottom_left > 0;
    } else if (bl_mask_row >= sb_mi_size) {
      return 0;
    } else {
      const int bl_offset = bl_mask_row * xd->is_mi_coded_stride + bl_mask_col;
      // As long as there is one bottom-left mi available, we determine bl is
      // available
      int has_bl = xd->is_mi_coded[av1_get_sdp_idx(xd->tree_type)][bl_offset];

      // Calculate px_bottom_left: how many bottom-left pixels are available. If
      // it is less than tx_size_high[txsz], px_bottom_left will be used to
      // determine the location of the last available pixel, which will be used
      // for padding.
      if (has_bl) {
        int mi_bl = 0;
        for (int i = 0; i < bottom_left_count_unit << ss_y; ++i) {
          if ((bl_mask_row + i) >= sb_mi_size ||
              !xd->is_mi_coded[av1_get_sdp_idx(xd->tree_type)]
                              [bl_offset + i * xd->is_mi_coded_stride]) {
            break;
          } else {
            mi_bl++;
          }
        }

        *px_bottom_left = AOMMIN((mi_bl << MI_SIZE_LOG2) >> ss_y, px_bl_common);
      }

      return has_bl;
    }
  }
}

typedef void (*intra_high_pred_fn)(uint16_t *dst, ptrdiff_t stride,
                                   const uint16_t *above, const uint16_t *left,
                                   int bd);
static intra_high_pred_fn pred_high[INTRA_MODES][TX_SIZES_ALL];
static intra_high_pred_fn dc_pred_high[2][2][TX_SIZES_ALL];
#if CONFIG_IBP_DC
static intra_high_pred_fn ibp_dc_pred_high[2][2][TX_SIZES_ALL];
#endif

static void init_intra_predictors_internal(void) {
  assert(NELEMENTS(mode_to_angle_map) == INTRA_MODES);

#if CONFIG_EXT_RECUR_PARTITIONS
#define INIT_RECTANGULAR(p, type)             \
  p[TX_4X8] = aom_##type##_predictor_4x8;     \
  p[TX_8X4] = aom_##type##_predictor_8x4;     \
  p[TX_8X16] = aom_##type##_predictor_8x16;   \
  p[TX_16X8] = aom_##type##_predictor_16x8;   \
  p[TX_16X32] = aom_##type##_predictor_16x32; \
  p[TX_32X16] = aom_##type##_predictor_32x16; \
  p[TX_32X64] = aom_##type##_predictor_32x64; \
  p[TX_64X32] = aom_##type##_predictor_64x32; \
  p[TX_4X16] = aom_##type##_predictor_4x16;   \
  p[TX_16X4] = aom_##type##_predictor_16x4;   \
  p[TX_8X32] = aom_##type##_predictor_8x32;   \
  p[TX_32X8] = aom_##type##_predictor_32x8;   \
  p[TX_16X64] = aom_##type##_predictor_16x64; \
  p[TX_64X16] = aom_##type##_predictor_64x16; \
  p[TX_4X32] = aom_##type##_predictor_4x32;   \
  p[TX_32X4] = aom_##type##_predictor_32x4;   \
  p[TX_8X64] = aom_##type##_predictor_8x64;   \
  p[TX_64X8] = aom_##type##_predictor_64x8;   \
  p[TX_4X64] = aom_##type##_predictor_4x64;   \
  p[TX_64X4] = aom_##type##_predictor_64x4;
#else
#define INIT_RECTANGULAR(p, type)             \
  p[TX_4X8] = aom_##type##_predictor_4x8;     \
  p[TX_8X4] = aom_##type##_predictor_8x4;     \
  p[TX_8X16] = aom_##type##_predictor_8x16;   \
  p[TX_16X8] = aom_##type##_predictor_16x8;   \
  p[TX_16X32] = aom_##type##_predictor_16x32; \
  p[TX_32X16] = aom_##type##_predictor_32x16; \
  p[TX_32X64] = aom_##type##_predictor_32x64; \
  p[TX_64X32] = aom_##type##_predictor_64x32; \
  p[TX_4X16] = aom_##type##_predictor_4x16;   \
  p[TX_16X4] = aom_##type##_predictor_16x4;   \
  p[TX_8X32] = aom_##type##_predictor_8x32;   \
  p[TX_32X8] = aom_##type##_predictor_32x8;   \
  p[TX_16X64] = aom_##type##_predictor_16x64; \
  p[TX_64X16] = aom_##type##_predictor_64x16;
#endif  // CONFIG_EXT_RECUR_PARTITIONS

#define INIT_NO_4X4(p, type)                  \
  p[TX_8X8] = aom_##type##_predictor_8x8;     \
  p[TX_16X16] = aom_##type##_predictor_16x16; \
  p[TX_32X32] = aom_##type##_predictor_32x32; \
  p[TX_64X64] = aom_##type##_predictor_64x64; \
  INIT_RECTANGULAR(p, type)

#define INIT_ALL_SIZES(p, type)           \
  p[TX_4X4] = aom_##type##_predictor_4x4; \
  INIT_NO_4X4(p, type)

  INIT_ALL_SIZES(pred_high[V_PRED], highbd_v);
  INIT_ALL_SIZES(pred_high[H_PRED], highbd_h);
  INIT_ALL_SIZES(pred_high[PAETH_PRED], highbd_paeth);
  INIT_ALL_SIZES(pred_high[SMOOTH_PRED], highbd_smooth);
  INIT_ALL_SIZES(pred_high[SMOOTH_V_PRED], highbd_smooth_v);
  INIT_ALL_SIZES(pred_high[SMOOTH_H_PRED], highbd_smooth_h);
  INIT_ALL_SIZES(dc_pred_high[0][0], highbd_dc_128);
  INIT_ALL_SIZES(dc_pred_high[0][1], highbd_dc_top);
  INIT_ALL_SIZES(dc_pred_high[1][0], highbd_dc_left);
  INIT_ALL_SIZES(dc_pred_high[1][1], highbd_dc);
#if CONFIG_IBP_DC
  INIT_ALL_SIZES(ibp_dc_pred_high[0][0], highbd_dc_128);
  INIT_ALL_SIZES(ibp_dc_pred_high[0][1], highbd_ibp_dc_top);
  INIT_ALL_SIZES(ibp_dc_pred_high[1][0], highbd_ibp_dc_left);
  INIT_ALL_SIZES(ibp_dc_pred_high[1][1], highbd_ibp_dc);
#endif
#undef intra_pred_allsizes
}

#if CONFIG_AIMC
// get the context for y_mode_idx
// the context of y_mode_idx depends on the count of directional neighboring
// modes
int get_y_mode_idx_ctx(MACROBLOCKD *const xd) {
  const PREDICTION_MODE above_joint_mode =
      av1_get_joint_mode(xd->above_right_mbmi);
  const PREDICTION_MODE left_joint_mode =
      av1_get_joint_mode(xd->bottom_left_mbmi);
  const int is_above_angular =
      above_joint_mode >= NON_DIRECTIONAL_MODES_COUNT ? 1 : 0;
  const int is_left_angular =
      left_joint_mode >= NON_DIRECTIONAL_MODES_COUNT ? 1 : 0;
  return is_above_angular + is_left_angular;
}
/*! \brief set the luma intra mode and delta angles for a given mode index.
 * \param[in]    mode_idx           mode index in intra mode decision
 *                                  process.
 * \param[in]    mbmi               Pointer to structure holding
 *                                  the mode info for the current macroblock.
 */
void set_y_mode_and_delta_angle(const int mode_idx, MB_MODE_INFO *const mbmi) {
  if (mode_idx < NON_DIRECTIONAL_MODES_COUNT) {
    mbmi->mode = mode_idx;
    mbmi->angle_delta[PLANE_TYPE_Y] = 0;
  } else {
    mbmi->mode =
        (mode_idx - NON_DIRECTIONAL_MODES_COUNT) / TOTAL_ANGLE_DELTA_COUNT +
        NON_DIRECTIONAL_MODES_COUNT;
    mbmi->angle_delta[PLANE_TYPE_Y] =
        (mode_idx - NON_DIRECTIONAL_MODES_COUNT) % TOTAL_ANGLE_DELTA_COUNT -
        MAX_ANGLE_DELTA;
  }
  mbmi->mode = reordered_y_mode[mbmi->mode];
}

// re-order the intra prediction modes for y component based
// on the neighboring intra prediction modes. The intra prediction
// mode list for 4x4, 4x8, and 8x4 blocks are fixed, and not dependent
// on the intra prediction modes of neighboring blocks
void get_y_intra_mode_set(MB_MODE_INFO *mi, MACROBLOCKD *const xd) {
  int neighbor_joint_modes[2];
  neighbor_joint_modes[0] = av1_get_joint_mode(xd->bottom_left_mbmi);
  neighbor_joint_modes[1] = av1_get_joint_mode(xd->above_right_mbmi);
  const int is_left_directional_mode =
      neighbor_joint_modes[0] >= NON_DIRECTIONAL_MODES_COUNT ? 1 : 0;
  const int is_above_directional_mode =
      neighbor_joint_modes[1] >= NON_DIRECTIONAL_MODES_COUNT ? 1 : 0;
  // To mark whether each intra prediction mode is added into intra mode list or
  // not
  int is_mode_selected_list[LUMA_MODE_COUNT];

#if CONFIG_SIMPLIFIED_AIMC
  const int block_width = block_size_wide[mi->sb_type[PLANE_TYPE_Y]];
  const int block_height = block_size_high[mi->sb_type[PLANE_TYPE_Y]];
  // Check whether the block area size is greater than 64 samples
  const int is_large_block = (block_width * block_height > 64);
#endif  // CONFIG_SIMPLIFIED_AIMC

  const int is_small_block = (mi->sb_type[PLANE_TYPE_Y] < BLOCK_8X8);

  int i, j;
  int mode_idx = 0;
  for (i = 0; i < LUMA_MODE_COUNT; i++) {
    is_mode_selected_list[i] = -1;
    mi->y_intra_mode_list[i] = -1;
  }

  // always put non-directional modes into the first positions of the mode list
  for (i = 0; i < NON_DIRECTIONAL_MODES_COUNT; ++i) {
    mi->y_intra_mode_list[mode_idx++] = i;
    is_mode_selected_list[i] = 1;
  }

  if (is_small_block == 0) {
    int directional_mode_cnt =
        is_above_directional_mode + is_left_directional_mode;
    if (directional_mode_cnt == 2 &&
        neighbor_joint_modes[0] == neighbor_joint_modes[1])
      directional_mode_cnt = 1;
    // copy above mode to left mode, if left mode is non-directiona mode and
    // above mode is directional mode
    if (directional_mode_cnt == 1 && is_left_directional_mode == 0) {
      neighbor_joint_modes[0] = neighbor_joint_modes[1];
    }
    for (i = 0; i < directional_mode_cnt; ++i) {
      mi->y_intra_mode_list[mode_idx++] = neighbor_joint_modes[i];
      is_mode_selected_list[neighbor_joint_modes[i]] = 1;
    }

    // Add offsets to derive the neighboring modes
#if CONFIG_SIMPLIFIED_AIMC
    if (is_large_block) {
#endif  // CONFIG_SIMPLIFIED_AIMC
      for (i = 0; i < 4; ++i) {
        for (j = 0; j < directional_mode_cnt; ++j) {
          int left_derived_mode = (neighbor_joint_modes[j] - i +
                                   (56 - NON_DIRECTIONAL_MODES_COUNT - 1)) %
                                      56 +
                                  NON_DIRECTIONAL_MODES_COUNT;
          int right_derived_mode = (neighbor_joint_modes[j] + i -
                                    (NON_DIRECTIONAL_MODES_COUNT - 1)) %
                                       56 +
                                   NON_DIRECTIONAL_MODES_COUNT;

          if (is_mode_selected_list[left_derived_mode] == -1) {
            mi->y_intra_mode_list[mode_idx++] = left_derived_mode;
            is_mode_selected_list[left_derived_mode] = 1;
          }
          if (is_mode_selected_list[right_derived_mode] == -1) {
            mi->y_intra_mode_list[mode_idx++] = right_derived_mode;
            is_mode_selected_list[right_derived_mode] = 1;
          }
        }
      }
#if CONFIG_SIMPLIFIED_AIMC
    }
#endif  // CONFIG_SIMPLIFIED_AIMC
  }

  // fill the remaining list with default modes
  for (i = 0; i < LUMA_MODE_COUNT - NON_DIRECTIONAL_MODES_COUNT &&
              mode_idx < LUMA_MODE_COUNT;
       ++i) {
    if (is_mode_selected_list[default_mode_list_y[i] +
                              NON_DIRECTIONAL_MODES_COUNT] == -1) {
      mi->y_intra_mode_list[mode_idx++] =
          default_mode_list_y[i] + NON_DIRECTIONAL_MODES_COUNT;
      is_mode_selected_list[default_mode_list_y[i] +
                            NON_DIRECTIONAL_MODES_COUNT] = 1;
    }
  }
}

// re-order the intra prediction mode of uv component based on the
// intra prediction mode of co-located y block
void get_uv_intra_mode_set(MB_MODE_INFO *mi) {
  int is_mode_selected_list[UV_INTRA_MODES - 1];
  int i;
  int mode_idx = 0;
  for (i = 0; i < UV_INTRA_MODES - 1; i++) {
    is_mode_selected_list[i] = -1;
    mi->uv_intra_mode_list[i] = -1;
  }
  // check whether co-located y mode is directional mode or not
  if (av1_is_directional_mode(mi->mode)) {
    mi->uv_intra_mode_list[mode_idx++] = mi->mode;
    is_mode_selected_list[mi->mode] = 1;
  }

  // put non-directional modes into the mode list
  mi->uv_intra_mode_list[mode_idx++] = UV_DC_PRED;
  is_mode_selected_list[UV_DC_PRED] = 1;
  mi->uv_intra_mode_list[mode_idx++] = UV_SMOOTH_PRED;
  is_mode_selected_list[UV_SMOOTH_PRED] = 1;
  mi->uv_intra_mode_list[mode_idx++] = UV_SMOOTH_V_PRED;
  is_mode_selected_list[UV_SMOOTH_V_PRED] = 1;
  mi->uv_intra_mode_list[mode_idx++] = UV_SMOOTH_H_PRED;
  is_mode_selected_list[UV_SMOOTH_H_PRED] = 1;
  mi->uv_intra_mode_list[mode_idx++] = UV_PAETH_PRED;
  is_mode_selected_list[UV_PAETH_PRED] = 1;

  // fill the remaining list with default modes
  const int directional_mode_count = DIR_MODE_END - DIR_MODE_START;
  for (i = 0; i < directional_mode_count; ++i) {
    if (is_mode_selected_list[default_mode_list_uv[i]] == -1) {
      mi->uv_intra_mode_list[mode_idx++] = default_mode_list_uv[i];
      is_mode_selected_list[default_mode_list_uv[i]] = 1;
    }
  }
}

int get_cfl_ctx(MACROBLOCKD *xd) {
  const int above_ctx =
      xd->chroma_above_mbmi ? xd->chroma_above_mbmi->uv_mode == UV_CFL_PRED : 0;
  const int left_ctx =
      xd->chroma_left_mbmi ? xd->chroma_left_mbmi->uv_mode == UV_CFL_PRED : 0;
  return above_ctx + left_ctx;
}
#endif  // CONFIG_AIMC

// Directional prediction, zone 1: 0 < angle < 90
void av1_highbd_dr_prediction_z1_c(uint16_t *dst, ptrdiff_t stride, int bw,
                                   int bh, const uint16_t *above,
                                   const uint16_t *left, int upsample_above,
                                   int dx, int dy, int bd, int mrl_index) {
  int r, c, x, base, shift, val;

  (void)left;
  (void)dy;
  (void)bd;
  assert(dy == 1);
  assert(dx > 0);

  const int max_base_x = ((bw + bh) - 1 + (mrl_index << 1)) << upsample_above;
  const int frac_bits = 6 - upsample_above;
  const int base_inc = 1 << upsample_above;
  x = dx * (1 + mrl_index);
  for (r = 0; r < bh; ++r, dst += stride, x += dx) {
    base = x >> frac_bits;
    shift = ((x << upsample_above) & 0x3F) >> 1;

    if (base >= max_base_x) {
      for (int i = r; i < bh; ++i) {
        aom_memset16(dst, above[max_base_x], bw);
        dst += stride;
      }
      return;
    }

    for (c = 0; c < bw; ++c, base += base_inc) {
      if (base < max_base_x) {
        val = above[base] * (32 - shift) + above[base + 1] * shift;
        dst[c] = ROUND_POWER_OF_TWO(val, 5);
      } else {
        dst[c] = above[max_base_x];
      }
    }
  }
}

// Directional prediction, zone 2: 90 < angle < 180
void av1_highbd_dr_prediction_z2_c(uint16_t *dst, ptrdiff_t stride, int bw,
                                   int bh, const uint16_t *above,
                                   const uint16_t *left, int upsample_above,
                                   int upsample_left, int dx, int dy, int bd,
                                   int mrl_index) {
  (void)bd;
  assert(dx > 0);
  assert(dy > 0);

  const int min_base_x = -(1 << upsample_above) - mrl_index;
  const int min_base_y = -(1 << upsample_left) - mrl_index;
  (void)min_base_y;
  const int frac_bits_x = 6 - upsample_above;
  const int frac_bits_y = 6 - upsample_left;

  for (int r = 0; r < bh; ++r) {
    for (int c = 0; c < bw; ++c) {
      int val;
      int y = r + 1;
      int x = (c << 6) - (y + mrl_index) * dx;
      const int base_x = x >> frac_bits_x;
      if (base_x >= min_base_x) {
        const int shift = ((x * (1 << upsample_above)) & 0x3F) >> 1;
        val = above[base_x] * (32 - shift) + above[base_x + 1] * shift;
        val = ROUND_POWER_OF_TWO(val, 5);
      } else {
        x = c + 1;
        y = (r << 6) - (x + mrl_index) * dy;
        const int base_y = y >> frac_bits_y;
        assert(base_y >= min_base_y);
        const int shift = ((y * (1 << upsample_left)) & 0x3F) >> 1;
        val = left[base_y] * (32 - shift) + left[base_y + 1] * shift;
        val = ROUND_POWER_OF_TWO(val, 5);
      }
      dst[c] = val;
    }
    dst += stride;
  }
}

// Directional prediction, zone 3: 180 < angle < 270
void av1_highbd_dr_prediction_z3_c(uint16_t *dst, ptrdiff_t stride, int bw,
                                   int bh, const uint16_t *above,
                                   const uint16_t *left, int upsample_left,
                                   int dx, int dy, int bd, int mrl_index) {
  int r, c, y, base, shift, val;

  (void)above;
  (void)dx;
  (void)bd;
  assert(dx == 1);
  assert(dy > 0);

  const int max_base_y = ((bw + bh - 1) << upsample_left) + (mrl_index << 1);
  const int frac_bits = 6 - upsample_left;
  const int base_inc = 1 << upsample_left;
  y = dy * (1 + mrl_index);
  for (c = 0; c < bw; ++c, y += dy) {
    base = y >> frac_bits;
    shift = ((y << upsample_left) & 0x3F) >> 1;

    for (r = 0; r < bh; ++r, base += base_inc) {
      if (base < max_base_y) {
        val = left[base] * (32 - shift) + left[base + 1] * shift;
        dst[r * stride + c] = ROUND_POWER_OF_TWO(val, 5);
      } else {
        for (; r < bh; ++r) dst[r * stride + c] = left[max_base_y];
        break;
      }
    }
  }
}

#if CONFIG_IDIF
// Directional prediction, zone 1: 0 < angle < 90 using IDIF
void av1_highbd_dr_prediction_z1_idif_c(uint16_t *dst, ptrdiff_t stride, int bw,
                                        int bh, const uint16_t *above,
                                        const uint16_t *left, int dx, int dy,
                                        int bd, int mrl_index) {
  int r, c, x, base, shift, val;

  uint16_t ref[4] = { 0 };

  (void)left;
  (void)dy;
  (void)bd;
  assert(dy == 1);
  assert(dx > 0);

  const int max_base_x = (bw + bh) - 1 + (mrl_index << 1);
  const int frac_bits = 6;
  const int base_inc = 1;

  x = dx * (1 + mrl_index);
  for (r = 0; r < bh; ++r, dst += stride, x += dx) {
    base = x >> frac_bits;
    shift = (x & 0x3F) >> 1;

    if (base > max_base_x) {
      for (int i = r; i < bh; ++i) {
        aom_memset16(dst, above[max_base_x], bw);
        dst += stride;
      }
      return;
    }

    for (c = 0; c < bw; ++c, base += base_inc) {
      if (base <= max_base_x) {
        // 4-tap filter
        ref[0] = above[base - 1];
        ref[1] = above[base];
        ref[2] = above[base + 1];
        ref[3] = above[base + 2];

        val = av1_dr_interp_filter[shift][0] * ref[0] +
              av1_dr_interp_filter[shift][1] * ref[1] +
              av1_dr_interp_filter[shift][2] * ref[2] +
              av1_dr_interp_filter[shift][3] * ref[3];

        dst[c] = clip_pixel_highbd(
            ROUND_POWER_OF_TWO(val, POWER_DR_INTERP_FILTER), bd);
      } else {
        dst[c] = above[max_base_x];
      }
    }
  }
}

// Directional prediction, zone 2: 90 < angle < 180 using IDIF
void av1_highbd_dr_prediction_z2_idif_c(uint16_t *dst, ptrdiff_t stride, int bw,
                                        int bh, const uint16_t *above,
                                        const uint16_t *left, int dx, int dy,
                                        int bd, int mrl_index) {
  (void)bd;
  assert(dx > 0);
  assert(dy > 0);

  const int min_base_x = -1 - mrl_index;
  const int min_base_y = -1 - mrl_index;

  (void)min_base_y;
  const int frac_bits_x = 6;
  const int frac_bits_y = 6;

  uint16_t ref[4] = { 0 };

  for (int r = 0; r < bh; ++r) {
    for (int c = 0; c < bw; ++c) {
      int val;
      int y = r + 1;
      int x = (c << 6) - (y + mrl_index) * dx;
      const int base_x = x >> frac_bits_x;
      if (base_x >= min_base_x) {
        const int shift = (x & 0x3F) >> 1;
        // 4-tap filter
        ref[0] = above[base_x - 1];
        ref[1] = above[base_x];
        ref[2] = above[base_x + 1];
        ref[3] = above[base_x + 2];

        val = av1_dr_interp_filter[shift][0] * ref[0] +
              av1_dr_interp_filter[shift][1] * ref[1] +
              av1_dr_interp_filter[shift][2] * ref[2] +
              av1_dr_interp_filter[shift][3] * ref[3];

        val = clip_pixel_highbd(ROUND_POWER_OF_TWO(val, POWER_DR_INTERP_FILTER),
                                bd);
      } else {
        x = c + 1;
        y = (r << 6) - (x + mrl_index) * dy;
        const int base_y = y >> frac_bits_y;
        assert(base_y >= min_base_y);
        const int shift = (y & 0x3F) >> 1;
        // 4-tap filter
        ref[0] = left[base_y - 1];
        ref[1] = left[base_y];
        ref[2] = left[base_y + 1];
        ref[3] = left[base_y + 2];

        val = av1_dr_interp_filter[shift][0] * ref[0] +
              av1_dr_interp_filter[shift][1] * ref[1] +
              av1_dr_interp_filter[shift][2] * ref[2] +
              av1_dr_interp_filter[shift][3] * ref[3];

        val = clip_pixel_highbd(ROUND_POWER_OF_TWO(val, POWER_DR_INTERP_FILTER),
                                bd);
      }
      dst[c] = val;
    }
    dst += stride;
  }
}

// Directional prediction, zone 3: 180 < angle < 270 using IDIF
void av1_highbd_dr_prediction_z3_idif_c(uint16_t *dst, ptrdiff_t stride, int bw,
                                        int bh, const uint16_t *above,
                                        const uint16_t *left, int dx, int dy,
                                        int bd, int mrl_index) {
  int r, c, y, base, shift, val;

  (void)above;
  (void)dx;
  (void)bd;
  assert(dx == 1);
  assert(dy > 0);

  uint16_t ref[4] = { 0 };

  const int max_base_y = (bw + bh) - 1 + (mrl_index << 1);
  const int frac_bits = 6;
  const int base_inc = 1;

  y = dy * (1 + mrl_index);
  for (c = 0; c < bw; ++c, y += dy) {
    base = y >> frac_bits;
    shift = (y & 0x3F) >> 1;

    for (r = 0; r < bh; ++r, base += base_inc) {
      if (base <= max_base_y) {
        // 4-tap filter
        ref[0] = left[base - 1];
        ref[1] = left[base];
        ref[2] = left[base + 1];
        ref[3] = left[base + 2];

        val = av1_dr_interp_filter[shift][0] * ref[0] +
              av1_dr_interp_filter[shift][1] * ref[1] +
              av1_dr_interp_filter[shift][2] * ref[2] +
              av1_dr_interp_filter[shift][3] * ref[3];

        dst[r * stride + c] = clip_pixel_highbd(
            ROUND_POWER_OF_TWO(val, POWER_DR_INTERP_FILTER), bd);
      } else {
        for (; r < bh; ++r) dst[r * stride + c] = left[max_base_y];
        break;
      }
    }
  }
}

static void highbd_dr_predictor_idif(uint16_t *dst, ptrdiff_t stride,
                                     TX_SIZE tx_size, uint16_t *above,
                                     uint16_t *left, int angle, int bd,
                                     int mrl_index) {
  const int dx = av1_get_dx(angle);
  const int dy = av1_get_dy(angle);
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];
  assert(angle > 0 && angle < 270);

  const int max_base_z1_z3 = (bw + bh) - 1 + (mrl_index << 1);
  const int max_base_z2_above = bw - 1;
  const int max_base_z2_left = bh - 1;
  const int min_base_z2 = -(1 + mrl_index);

  if (angle > 0 && angle < 90) {
    above[max_base_z1_z3 + 1] = above[max_base_z1_z3];
    above[max_base_z1_z3 + 2] = above[max_base_z1_z3];
    av1_highbd_dr_prediction_z1_idif(dst, stride, bw, bh, above, left, dx, dy,
                                     bd, mrl_index);

  } else if (angle > 90 && angle < 180) {
    above[min_base_z2 - 1] = above[min_base_z2];
    left[min_base_z2 - 1] = left[min_base_z2];
    if (mrl_index == 0) {
      above[max_base_z2_above + 1] = above[max_base_z2_above];
      left[max_base_z2_left + 1] = left[max_base_z2_left];
    }
    av1_highbd_dr_prediction_z2_idif(dst, stride, bw, bh, above, left, dx, dy,
                                     bd, mrl_index);

  } else if (angle > 180 && angle < 270) {
    left[max_base_z1_z3 + 1] = left[max_base_z1_z3];
    left[max_base_z1_z3 + 2] = left[max_base_z1_z3];
    av1_highbd_dr_prediction_z3_idif(dst, stride, bw, bh, above, left, dx, dy,
                                     bd, mrl_index);

  } else if (angle == 90) {
    pred_high[V_PRED][tx_size](dst, stride, above, left, bd);
  } else if (angle == 180) {
    pred_high[H_PRED][tx_size](dst, stride, above, left, bd);
  }
}
#endif  // CONFIG_IDIF

static void highbd_dr_predictor(uint16_t *dst, ptrdiff_t stride,
                                TX_SIZE tx_size, const uint16_t *above,
                                const uint16_t *left, int upsample_above,
                                int upsample_left, int angle, int bd,
                                int mrl_index) {
  const int dx = av1_get_dx(angle);
  const int dy = av1_get_dy(angle);
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];
  assert(angle > 0 && angle < 270);

  if (angle > 0 && angle < 90) {
    av1_highbd_dr_prediction_z1(dst, stride, bw, bh, above, left,
                                upsample_above, dx, dy, bd, mrl_index);
  } else if (angle > 90 && angle < 180) {
    av1_highbd_dr_prediction_z2(dst, stride, bw, bh, above, left,
                                upsample_above, upsample_left, dx, dy, bd,
                                mrl_index);
  } else if (angle > 180 && angle < 270) {
    av1_highbd_dr_prediction_z3(dst, stride, bw, bh, above, left, upsample_left,
                                dx, dy, bd, mrl_index);
  } else if (angle == 90) {
    pred_high[V_PRED][tx_size](dst, stride, above, left, bd);
  } else if (angle == 180) {
    pred_high[H_PRED][tx_size](dst, stride, above, left, bd);
  }
}

// Generate the second directional predictor for IBP
static void highbd_second_dr_predictor(uint16_t *dst, ptrdiff_t stride,
                                       TX_SIZE tx_size, const uint16_t *above,
                                       const uint16_t *left, int upsample_above,
                                       int upsample_left, int angle, int bd) {
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];

  if (angle > 0 && angle < 90) {
#if CONFIG_IMPROVED_INTRA_DIR_PRED
    int dy = dr_intra_derivative[90 - angle];
#else
    int dy = second_dr_intra_derivative[angle];
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
    int dx = 1;
    av1_highbd_dr_prediction_z3(dst, stride, bw, bh, above, left, upsample_left,
                                dx, dy, bd, 0);
  } else if (angle > 180 && angle < 270) {
#if CONFIG_IMPROVED_INTRA_DIR_PRED
    int dx = dr_intra_derivative[angle - 180];
#else
    int dx = second_dr_intra_derivative[270 - angle];
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
    int dy = 1;
    av1_highbd_dr_prediction_z1(dst, stride, bw, bh, above, left,
                                upsample_above, dx, dy, bd, 0);
  }
}

#if CONFIG_IDIF
// Generate the second directional predictor for IBP
static void highbd_second_dr_predictor_idif(uint16_t *dst, ptrdiff_t stride,
                                            TX_SIZE tx_size, uint16_t *above,
                                            uint16_t *left, int angle, int bd) {
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];

  const int max_base = ((bw + bh) - 1);

  if (angle > 0 && angle < 90) {
#if CONFIG_IMPROVED_INTRA_DIR_PRED
    int dy = dr_intra_derivative[90 - angle];
#else
    int dy = second_dr_intra_derivative[angle];
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
    int dx = 1;
    left[max_base + 1] = left[max_base];
    left[max_base + 2] = left[max_base];
    av1_highbd_dr_prediction_z3_idif(dst, stride, bw, bh, above, left, dx, dy,
                                     bd, 0);
  } else if (angle > 180 && angle < 270) {
#if CONFIG_IMPROVED_INTRA_DIR_PRED
    int dx = dr_intra_derivative[angle - 180];
#else
    int dx = second_dr_intra_derivative[270 - angle];
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
    int dy = 1;
    above[max_base + 1] = above[max_base];
    above[max_base + 2] = above[max_base];
    av1_highbd_dr_prediction_z1_idif(dst, stride, bw, bh, above, left, dx, dy,
                                     bd, 0);
  }
}
#endif  // CONFIG_IDIF

DECLARE_ALIGNED(16, const int8_t,
                av1_filter_intra_taps[FILTER_INTRA_MODES][8][8]) = {
  {
      { -6, 10, 0, 0, 0, 12, 0, 0 },
      { -5, 2, 10, 0, 0, 9, 0, 0 },
      { -3, 1, 1, 10, 0, 7, 0, 0 },
      { -3, 1, 1, 2, 10, 5, 0, 0 },
      { -4, 6, 0, 0, 0, 2, 12, 0 },
      { -3, 2, 6, 0, 0, 2, 9, 0 },
      { -3, 2, 2, 6, 0, 2, 7, 0 },
      { -3, 1, 2, 2, 6, 3, 5, 0 },
  },
  {
      { -10, 16, 0, 0, 0, 10, 0, 0 },
      { -6, 0, 16, 0, 0, 6, 0, 0 },
      { -4, 0, 0, 16, 0, 4, 0, 0 },
      { -2, 0, 0, 0, 16, 2, 0, 0 },
      { -10, 16, 0, 0, 0, 0, 10, 0 },
      { -6, 0, 16, 0, 0, 0, 6, 0 },
      { -4, 0, 0, 16, 0, 0, 4, 0 },
      { -2, 0, 0, 0, 16, 0, 2, 0 },
  },
  {
      { -8, 8, 0, 0, 0, 16, 0, 0 },
      { -8, 0, 8, 0, 0, 16, 0, 0 },
      { -8, 0, 0, 8, 0, 16, 0, 0 },
      { -8, 0, 0, 0, 8, 16, 0, 0 },
      { -4, 4, 0, 0, 0, 0, 16, 0 },
      { -4, 0, 4, 0, 0, 0, 16, 0 },
      { -4, 0, 0, 4, 0, 0, 16, 0 },
      { -4, 0, 0, 0, 4, 0, 16, 0 },
  },
  {
      { -2, 8, 0, 0, 0, 10, 0, 0 },
      { -1, 3, 8, 0, 0, 6, 0, 0 },
      { -1, 2, 3, 8, 0, 4, 0, 0 },
      { 0, 1, 2, 3, 8, 2, 0, 0 },
      { -1, 4, 0, 0, 0, 3, 10, 0 },
      { -1, 3, 4, 0, 0, 4, 6, 0 },
      { -1, 2, 3, 4, 0, 4, 4, 0 },
      { -1, 2, 2, 3, 4, 3, 3, 0 },
  },
  {
      { -12, 14, 0, 0, 0, 14, 0, 0 },
      { -10, 0, 14, 0, 0, 12, 0, 0 },
      { -9, 0, 0, 14, 0, 11, 0, 0 },
      { -8, 0, 0, 0, 14, 10, 0, 0 },
      { -10, 12, 0, 0, 0, 0, 14, 0 },
      { -9, 1, 12, 0, 0, 0, 12, 0 },
      { -8, 0, 0, 12, 0, 1, 11, 0 },
      { -7, 0, 0, 1, 12, 1, 9, 0 },
  },
};

void av1_filter_intra_predictor_c(uint8_t *dst, ptrdiff_t stride,
                                  TX_SIZE tx_size, const uint8_t *above,
                                  const uint8_t *left, int mode) {
  int r, c;
  uint8_t buffer[33][33];
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];

  assert(bw <= 32 && bh <= 32);

  // The initialization is just for silencing Jenkins static analysis warnings
  for (r = 0; r < bh + 1; ++r)
    memset(buffer[r], 0, (bw + 1) * sizeof(buffer[0][0]));

  for (r = 0; r < bh; ++r) buffer[r + 1][0] = left[r];
  memcpy(buffer[0], &above[-1], (bw + 1) * sizeof(uint8_t));

  for (r = 1; r < bh + 1; r += 2)
    for (c = 1; c < bw + 1; c += 4) {
      const uint8_t p0 = buffer[r - 1][c - 1];
      const uint8_t p1 = buffer[r - 1][c];
      const uint8_t p2 = buffer[r - 1][c + 1];
      const uint8_t p3 = buffer[r - 1][c + 2];
      const uint8_t p4 = buffer[r - 1][c + 3];
      const uint8_t p5 = buffer[r][c - 1];
      const uint8_t p6 = buffer[r + 1][c - 1];
      for (int k = 0; k < 8; ++k) {
        int r_offset = k >> 2;
        int c_offset = k & 0x03;
        buffer[r + r_offset][c + c_offset] =
            clip_pixel(ROUND_POWER_OF_TWO_SIGNED(
                av1_filter_intra_taps[mode][k][0] * p0 +
                    av1_filter_intra_taps[mode][k][1] * p1 +
                    av1_filter_intra_taps[mode][k][2] * p2 +
                    av1_filter_intra_taps[mode][k][3] * p3 +
                    av1_filter_intra_taps[mode][k][4] * p4 +
                    av1_filter_intra_taps[mode][k][5] * p5 +
                    av1_filter_intra_taps[mode][k][6] * p6,
                FILTER_INTRA_SCALE_BITS));
      }
    }

  for (r = 0; r < bh; ++r) {
    memcpy(dst, &buffer[r + 1][1], bw * sizeof(uint8_t));
    dst += stride;
  }
}

static void highbd_filter_intra_predictor(uint16_t *dst, ptrdiff_t stride,
                                          TX_SIZE tx_size,
                                          const uint16_t *above,
                                          const uint16_t *left, int mode,
                                          int bd) {
  int r, c;
  uint16_t buffer[33][33];
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];

  assert(bw <= 32 && bh <= 32);

  // The initialization is just for silencing Jenkins static analysis warnings
  for (r = 0; r < bh + 1; ++r)
    memset(buffer[r], 0, (bw + 1) * sizeof(buffer[0][0]));

  for (r = 0; r < bh; ++r) buffer[r + 1][0] = left[r];
  memcpy(buffer[0], &above[-1], (bw + 1) * sizeof(buffer[0][0]));

  for (r = 1; r < bh + 1; r += 2)
    for (c = 1; c < bw + 1; c += 4) {
      const uint16_t p0 = buffer[r - 1][c - 1];
      const uint16_t p1 = buffer[r - 1][c];
      const uint16_t p2 = buffer[r - 1][c + 1];
      const uint16_t p3 = buffer[r - 1][c + 2];
      const uint16_t p4 = buffer[r - 1][c + 3];
      const uint16_t p5 = buffer[r][c - 1];
      const uint16_t p6 = buffer[r + 1][c - 1];
      for (int k = 0; k < 8; ++k) {
        int r_offset = k >> 2;
        int c_offset = k & 0x03;
        buffer[r + r_offset][c + c_offset] =
            clip_pixel_highbd(ROUND_POWER_OF_TWO_SIGNED(
                                  av1_filter_intra_taps[mode][k][0] * p0 +
                                      av1_filter_intra_taps[mode][k][1] * p1 +
                                      av1_filter_intra_taps[mode][k][2] * p2 +
                                      av1_filter_intra_taps[mode][k][3] * p3 +
                                      av1_filter_intra_taps[mode][k][4] * p4 +
                                      av1_filter_intra_taps[mode][k][5] * p5 +
                                      av1_filter_intra_taps[mode][k][6] * p6,
                                  FILTER_INTRA_SCALE_BITS),
                              bd);
      }
    }

  for (r = 0; r < bh; ++r) {
    memcpy(dst, &buffer[r + 1][1], bw * sizeof(dst[0]));
    dst += stride;
  }
}

static int is_smooth(const MB_MODE_INFO *mbmi, int plane, TREE_TYPE tree_type) {
#if CONFIG_INTRA_SDP_LATENCY_FIX
  (void)tree_type;
#endif  // CONFIG_INTRA_SDP_LATENCY_FIX
  if (plane == 0) {
    const PREDICTION_MODE mode = mbmi->mode;
    return (mode == SMOOTH_PRED || mode == SMOOTH_V_PRED ||
            mode == SMOOTH_H_PRED);
  } else {
    // uv_mode is not set for inter blocks, so need to explicitly
    // detect that case.
#if CONFIG_INTRA_SDP_LATENCY_FIX
    if (is_inter_block(
            mbmi, mbmi->tree_type == SHARED_PART ? SHARED_PART : CHROMA_PART))
      return 0;
#else
    if (is_inter_block(mbmi, tree_type)) return 0;
#endif  // CONFIG_INTRA_SDP_LATENCY_FIX

    const UV_PREDICTION_MODE uv_mode = mbmi->uv_mode;
    return (uv_mode == UV_SMOOTH_PRED || uv_mode == UV_SMOOTH_V_PRED ||
            uv_mode == UV_SMOOTH_H_PRED);
  }
}

static int get_filt_type(const MACROBLOCKD *xd, int plane) {
  int ab_sm, le_sm;

  if (plane == 0) {
    const MB_MODE_INFO *ab = xd->above_mbmi;
    const MB_MODE_INFO *le = xd->left_mbmi;
    ab_sm = ab ? is_smooth(ab, plane, xd->tree_type) : 0;
    le_sm = le ? is_smooth(le, plane, xd->tree_type) : 0;
  } else {
    const MB_MODE_INFO *ab = xd->chroma_above_mbmi;
    const MB_MODE_INFO *le = xd->chroma_left_mbmi;
    ab_sm = ab ? is_smooth(ab, plane, xd->tree_type) : 0;
    le_sm = le ? is_smooth(le, plane, xd->tree_type) : 0;
  }

  return (ab_sm || le_sm) ? 1 : 0;
}

static int intra_edge_filter_strength(int bs0, int bs1, int delta, int type) {
  const int d = abs(delta);
  int strength = 0;

  const int blk_wh = bs0 + bs1;
  if (type == 0) {
    if (blk_wh <= 8) {
      if (d >= 56) strength = 1;
    } else if (blk_wh <= 12) {
      if (d >= 40) strength = 1;
    } else if (blk_wh <= 16) {
      if (d >= 40) strength = 1;
    } else if (blk_wh <= 24) {
      if (d >= 8) strength = 1;
      if (d >= 16) strength = 2;
      if (d >= 32) strength = 3;
    } else if (blk_wh <= 32) {
      if (d >= 1) strength = 1;
      if (d >= 4) strength = 2;
      if (d >= 32) strength = 3;
    } else {
      if (d >= 1) strength = 3;
    }
  } else {
    if (blk_wh <= 8) {
      if (d >= 40) strength = 1;
      if (d >= 64) strength = 2;
    } else if (blk_wh <= 16) {
      if (d >= 20) strength = 1;
      if (d >= 48) strength = 2;
    } else if (blk_wh <= 24) {
      if (d >= 4) strength = 3;
    } else {
      if (d >= 1) strength = 3;
    }
  }
  return strength;
}

void av1_filter_intra_edge_high_c(uint16_t *p, int sz, int strength) {
  if (!strength) return;

  const int kernel[INTRA_EDGE_FILT][INTRA_EDGE_TAPS] = { { 0, 4, 8, 4, 0 },
                                                         { 0, 5, 6, 5, 0 },
                                                         { 2, 4, 4, 4, 2 } };
  const int filt = strength - 1;
  uint16_t edge[129];

  memcpy(edge, p, sz * sizeof(*p));
  for (int i = 1; i < sz; i++) {
    int s = 0;
    for (int j = 0; j < INTRA_EDGE_TAPS; j++) {
      int k = i - 2 + j;
      k = (k < 0) ? 0 : k;
      k = (k > sz - 1) ? sz - 1 : k;
      s += edge[k] * kernel[filt][j];
    }
    s = (s + 8) >> 4;
    p[i] = s;
  }
}

static void filter_intra_edge_corner_high(uint16_t *p_above, uint16_t *p_left) {
  const int kernel[3] = { 5, 6, 5 };

  int s = (p_left[0] * kernel[0]) + (p_above[-1] * kernel[1]) +
          (p_above[0] * kernel[2]);
  s = (s + 8) >> 4;
  p_above[-1] = s;
  p_left[-1] = s;
}

void av1_upsample_intra_edge_high_c(uint16_t *p, int sz, int bd) {
  // interpolate half-sample positions
  assert(sz <= MAX_UPSAMPLE_SZ);

  uint16_t in[MAX_UPSAMPLE_SZ + 3];
  // copy p[-1..(sz-1)] and extend first and last samples
  in[0] = p[-1];
  in[1] = p[-1];
  for (int i = 0; i < sz; i++) {
    in[i + 2] = p[i];
  }
  in[sz + 2] = p[sz - 1];

  // interpolate half-sample edge positions
  p[-2] = in[0];
  for (int i = 0; i < sz; i++) {
    int s = -in[i] + (9 * in[i + 1]) + (9 * in[i + 2]) - in[i + 3];
    s = (s + 8) >> 4;
    s = clip_pixel_highbd(s, bd);
    p[2 * i - 1] = s;
    p[2 * i] = in[i + 2];
  }
}

#if CONFIG_IBP_WEIGHT
void av1_highbd_ibp_dr_prediction_z1_c(
    const IbpWeightsType weights[][IBP_WEIGHT_SIZE][DIR_MODES_0_90],
    int mode_idx, uint16_t *dst, ptrdiff_t stride, uint16_t *second_pred,
    ptrdiff_t second_stride, int bw, int bh) {
  const int col_shift = bw >> (IBP_WEIGHT_SIZE_LOG2 + 1);
  const int row_shift = bh >> (IBP_WEIGHT_SIZE_LOG2 + 1);
  int r, c;
  for (r = 0; r < bh; ++r) {
    const int row_idx = r >> row_shift;
    for (c = 0; c < bw; ++c) {
      const int col_idx = c >> col_shift;
      const uint8_t weight = weights[row_idx][col_idx][mode_idx];
      dst[c] = ROUND_POWER_OF_TWO(
          dst[c] * weight + second_pred[c] * (IBP_WEIGHT_MAX - weight),
          IBP_WEIGHT_SHIFT);
    }
    dst += stride;
    second_pred += second_stride;
  }
}

void av1_highbd_ibp_dr_prediction_z3_c(
    const IbpWeightsType weights[][IBP_WEIGHT_SIZE][DIR_MODES_0_90],
    int mode_idx, uint16_t *dst, ptrdiff_t stride, uint16_t *second_pred,
    ptrdiff_t second_stride, int bw, int bh) {
  const int col_shift = bw >> (IBP_WEIGHT_SIZE_LOG2 + 1);
  const int row_shift = bh >> (IBP_WEIGHT_SIZE_LOG2 + 1);
  int r, c;
  for (c = 0; c < bw; ++c) {
    const int col_idx = c >> col_shift;
    uint16_t *tmp_dst = dst + c;
    uint16_t *tmp_second = second_pred + c;
    for (r = 0; r < bh; ++r) {
      const int row_idx = r >> row_shift;
      const uint8_t weight = weights[col_idx][row_idx][mode_idx];
      tmp_dst[0] = ROUND_POWER_OF_TWO(
          tmp_dst[0] * weight + tmp_second[0] * (IBP_WEIGHT_MAX - weight),
          IBP_WEIGHT_SHIFT);
      tmp_dst += stride;
      tmp_second += second_stride;
    }
  }
}
#else
void av1_highbd_ibp_dr_prediction_z1_c(uint8_t *weights, uint16_t *dst,
                                       ptrdiff_t stride, uint16_t *second_pred,
                                       ptrdiff_t second_stride, int bw,
                                       int bh) {
  int r, c;
  for (r = 0; r < bh; ++r) {
    for (c = 0; c < bw; ++c) {
      dst[c] = ROUND_POWER_OF_TWO(
          dst[c] * weights[c] + second_pred[c] * (IBP_WEIGHT_MAX - weights[c]),
          IBP_WEIGHT_SHIFT);
    }
    weights += bw;
    dst += stride;
    second_pred += second_stride;
  }
}

void av1_highbd_ibp_dr_prediction_z3_c(uint8_t *weights, uint16_t *dst,
                                       ptrdiff_t stride, uint16_t *second_pred,
                                       ptrdiff_t second_stride, int bw,
                                       int bh) {
  int r, c;
  for (c = 0; c < bw; ++c) {
    uint16_t *tmp_dst = dst + c;
    uint16_t *tmp_second = second_pred + c;
    for (r = 0; r < bh; ++r) {
      tmp_dst[0] =
          ROUND_POWER_OF_TWO(tmp_dst[0] * weights[r] +
                                 tmp_second[0] * (IBP_WEIGHT_MAX - weights[r]),
                             IBP_WEIGHT_SHIFT);
      tmp_dst += stride;
      tmp_second += second_stride;
    }
    weights += bh;
  }
}
#endif  // CONFIG_IBP_WEIGHT

static void build_intra_predictors_high(
    const MACROBLOCKD *xd, const uint16_t *ref, int ref_stride, uint16_t *dst,
    int dst_stride, PREDICTION_MODE mode, int angle_delta,
    FILTER_INTRA_MODE filter_intra_mode, TX_SIZE tx_size,
    int disable_edge_filter, int n_top_px, int n_topright_px, int n_left_px,
    int n_bottomleft_px, int plane, int is_sb_boundary,
    const int seq_intra_pred_filter_flag, const int seq_ibp_flag,
#if CONFIG_IBP_WEIGHT
    const IbpWeightsType ibp_weights[][IBP_WEIGHT_SIZE][DIR_MODES_0_90]
#else
    uint8_t *const ibp_weights[TX_SIZES_ALL][DIR_MODES_0_90]
#endif  // CONFIG_IBP_WEIGHT
) {
  MB_MODE_INFO *const mbmi = xd->mi[0];
  int i;
#if CONFIG_MRLS_IMPROVE
  DECLARE_ALIGNED(16, uint16_t, left_data_1st[NUM_INTRA_NEIGHBOUR_PIXELS]);
  DECLARE_ALIGNED(16, uint16_t, above_data_1st[NUM_INTRA_NEIGHBOUR_PIXELS]);
  DECLARE_ALIGNED(16, uint16_t, left_data_2nd[NUM_INTRA_NEIGHBOUR_PIXELS]);
  DECLARE_ALIGNED(16, uint16_t, above_data_2nd[NUM_INTRA_NEIGHBOUR_PIXELS]);
#else
  DECLARE_ALIGNED(16, uint16_t, left_data[NUM_INTRA_NEIGHBOUR_PIXELS]);
  DECLARE_ALIGNED(16, uint16_t, above_data[NUM_INTRA_NEIGHBOUR_PIXELS]);
#endif  // CONFIG_MRLS_IMPROVE

  DECLARE_ALIGNED(16, uint16_t, second_pred_data[MAX_TX_SQUARE + 32]);

#if CONFIG_MRLS_IMPROVE
  DECLARE_ALIGNED(16, uint16_t, mrl_line_0_data[MAX_TX_SQUARE + 32]);
  uint16_t *const above_row_1st = above_data_1st + 32;
  uint16_t *const left_col_1st = left_data_1st + 32;
  uint16_t *const above_row_2nd = above_data_2nd + 32;
  uint16_t *const left_col_2nd = left_data_2nd + 32;
#else
  uint16_t *const above_row = above_data + 32;
  uint16_t *const left_col = left_data + 32;
#endif  // CONFIG_MRLS_IMPROVE

  uint16_t *const second_pred = second_pred_data + 16;
#if CONFIG_MRLS_IMPROVE
  uint16_t *dst_mrl_line_0 = mrl_line_0_data + 16;
#endif
  const int txwpx = tx_size_wide[tx_size];
  const int txhpx = tx_size_high[tx_size];
  int need_left = extend_modes[mode] & NEED_LEFT;
  int need_above = extend_modes[mode] & NEED_ABOVE;
  int need_above_left = extend_modes[mode] & NEED_ABOVELEFT;
  const uint8_t mrl_index =
      (plane == PLANE_TYPE_Y && is_inter_block(xd->mi[0], xd->tree_type) == 0)
          ? xd->mi[0]->mrl_index
          : 0;
  const int above_mrl_idx = is_sb_boundary ? 0 : mrl_index;
#if CONFIG_MRLS_IMPROVE
  const uint16_t *above_ref_1st = ref - ref_stride * (above_mrl_idx + 1);
  const uint16_t *left_ref_1st = ref - 1 - mrl_index;
  const uint16_t *above_ref_2nd = ref - ref_stride;
  const uint16_t *left_ref_2nd = ref - 1;
#else
  const uint16_t *above_ref = ref - ref_stride * (above_mrl_idx + 1);
  const uint16_t *left_ref = ref - 1 - mrl_index;
#endif  // CONFIG_MRLS_IMPROVE

  int p_angle = 0;
  const int is_dr_mode = av1_is_directional_mode(mode);
  const int use_filter_intra = filter_intra_mode != FILTER_INTRA_MODES;
#if CONFIG_DIP
  const int use_intra_dip = mbmi->use_intra_dip && plane == PLANE_TYPE_Y;
#endif  // CONFIG_DIP
  int base = 128 << (xd->bd - 8);
  // The left_data, above_data buffers must be zeroed to fix some intermittent
  // valgrind errors. Uninitialized reads in intra pred modules (e.g. width =
  // 4 path in av1_highbd_dr_prediction_z2_avx2()) from left_data, above_data
  // are seen to be the potential reason for this issue.
#if CONFIG_MRLS_IMPROVE
  aom_memset16(left_data_1st, base + 1, NUM_INTRA_NEIGHBOUR_PIXELS);
  aom_memset16(above_data_1st, base - 1, NUM_INTRA_NEIGHBOUR_PIXELS);
  aom_memset16(left_data_2nd, base + 1, NUM_INTRA_NEIGHBOUR_PIXELS);
  aom_memset16(above_data_2nd, base - 1, NUM_INTRA_NEIGHBOUR_PIXELS);
#else
  aom_memset16(left_data, base + 1, NUM_INTRA_NEIGHBOUR_PIXELS);
  aom_memset16(above_data, base - 1, NUM_INTRA_NEIGHBOUR_PIXELS);
#endif  // CONFIG_MRLS_IMPROVE

  // The default values if ref pixels are not available:
  // base   base-1 base-1 .. base-1 base-1 base-1 base-1 base-1 base-1
  // base+1   A      B  ..     Y      Z
  // base+1   C      D  ..     W      X
  // base+1   E      F  ..     U      V
  // base+1   G      H  ..     S      T      T      T      T      T

  int apply_sub_block_based_refinement_filter =
      seq_intra_pred_filter_flag && (mrl_index == 0);
#if CONFIG_DISABLE_4X4_IBP_ORIP
  const bool is_ibp_orip_allowed_blk_sz = tx_size != TX_4X4;
  apply_sub_block_based_refinement_filter &= is_ibp_orip_allowed_blk_sz;
  const int apply_ibp = seq_ibp_flag && is_ibp_orip_allowed_blk_sz;
#else
  const int apply_ibp = seq_ibp_flag;
#endif  // CONFIG_DISABLE_4X4_IBP_ORIP
#if CONFIG_WAIP
#if CONFIG_NEW_TX_PARTITION
  const int txb_idx = get_tx_partition_idx(xd->mi[0], plane);
  xd->mi[0]->is_wide_angle[plane > 0][txb_idx] = 0;
  xd->mi[0]->mapped_intra_mode[plane > 0][txb_idx] = DC_PRED;
#else
  xd->mi[0]->is_wide_angle[plane > 0] = 0;
  xd->mi[0]->mapped_intra_mode[plane > 0] = DC_PRED;
#endif  // CONFIG_NEW_TX_PARTITION
#endif  // CONFIG_WAIP
  if (is_dr_mode) {
    p_angle = mode_to_angle_map[mode] + angle_delta;
#if CONFIG_IMPROVED_INTRA_DIR_PRED
    const int mrl_index_to_delta[4] = { 0, 1, -1, 0 };
    p_angle += mrl_index_to_delta[mrl_index];
    assert(p_angle > 0 && p_angle < 270);
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
#if CONFIG_WAIP
    if (!is_inter_block(xd->mi[0], xd->tree_type)) {
      p_angle =
          wide_angle_mapping(xd->mi[0], angle_delta, tx_size, mode, plane);
    } else {
#if CONFIG_NEW_TX_PARTITION
      mbmi->is_wide_angle[plane > 0][txb_idx] = 0;
      mbmi->mapped_intra_mode[plane > 0][txb_idx] = DC_PRED;
#else
      mbmi->is_wide_angle[plane > 0] = 0;
      mbmi->mapped_intra_mode[plane > 0] = DC_PRED;
#endif  // CONFIG_NEW_TX_PARTITION
    }
#endif  // CONFIG_WAIP
    if (p_angle <= 90)
      need_above = 1, need_left = 0, need_above_left = 1;
    else if (p_angle < 180)
      need_above = 1, need_left = 1, need_above_left = 1;
    else
      need_above = 0, need_left = 1, need_above_left = 1;
    if (apply_ibp) {
      need_above = 1, need_left = 1, need_above_left = 1;
    }

#if !CONFIG_ORIP_NONDC_DISABLED
    if (apply_sub_block_based_refinement_filter &&
        (p_angle == 90 || p_angle == 180)) {
      need_above = 1;
      need_left = 1;
      need_above_left = 1;
    }
#endif
  }
  if (use_filter_intra) need_left = need_above = need_above_left = 1;
#if CONFIG_DIP
  if (use_intra_dip) need_left = need_above = need_above_left = 1;
#endif  // CONFIG_DIP
  assert(n_top_px >= 0);
  assert(n_topright_px >= 0);
  assert(n_left_px >= 0);
  assert(n_bottomleft_px >= 0);

  if (
#if CONFIG_MRLS_IMPROVE
      xd->mi[0]->multi_line_mrl == 0 &&
#endif
      ((!need_above && n_left_px == 0) || (!need_left && n_top_px == 0))) {
    int val;
    if (need_left) {
#if CONFIG_MRLS_IMPROVE
      val = (n_top_px > 0) ? above_ref_1st[0] : base + 1;
#else
      val = (n_top_px > 0) ? above_ref[0] : base + 1;
#endif
    } else {
#if CONFIG_MRLS_IMPROVE
      val = (n_left_px > 0) ? left_ref_1st[0] : base - 1;
#else
      val = (n_left_px > 0) ? left_ref[0] : base - 1;
#endif
    }
    for (i = 0; i < txhpx; ++i) {
      aom_memset16(dst, val, txwpx);
      dst += dst_stride;
    }
    return;
  }

  // NEED_LEFT
  if (need_left) {
    int need_bottom = extend_modes[mode] & NEED_BOTTOMLEFT;
    if (use_filter_intra) need_bottom = 0;
#if CONFIG_DIP
    if (use_intra_dip) need_bottom = 1;
#endif  // CONFIG_DIP
    if (is_dr_mode)
      need_bottom =
          apply_ibp ? (p_angle < 90) || (p_angle > 180) : p_angle > 180;
    int num_left_pixels_needed =
        txhpx + (need_bottom ? txwpx : 3) + (mrl_index << 1);
#if CONFIG_DIP
    if (use_intra_dip) {
      // DIP mode requires left edge + 1/4 tx height for overhang feature.
      num_left_pixels_needed = txhpx + (txhpx >> 2);
    }
#endif  // CONFIG_DIP
    i = 0;
    if (n_left_px > 0) {
      for (; i < n_left_px; i++) {
#if CONFIG_MRLS_IMPROVE
        left_col_1st[i] = left_ref_1st[i * ref_stride];
        left_col_2nd[i] = left_ref_2nd[i * ref_stride];
#else
        left_col[i] = left_ref[i * ref_stride];
#endif  // CONFIG_MRLS_IMPROVE
      }
      if (need_bottom && n_bottomleft_px > 0) {
        assert(i == txhpx);
        for (; i < txhpx + n_bottomleft_px; i++) {
#if CONFIG_MRLS_IMPROVE
          left_col_1st[i] = left_ref_1st[i * ref_stride];
          left_col_2nd[i] = left_ref_2nd[i * ref_stride];
#else
          left_col[i] = left_ref[i * ref_stride];
#endif  // CONFIG_MRLS_IMPROVE
        }
      }
      if (i < num_left_pixels_needed) {
#if CONFIG_MRLS_IMPROVE
        aom_memset16(&left_col_1st[i], left_col_1st[i - 1],
                     num_left_pixels_needed - i);
        aom_memset16(&left_col_2nd[i], left_col_2nd[i - 1],
                     num_left_pixels_needed - i);
#else
        aom_memset16(&left_col[i], left_col[i - 1], num_left_pixels_needed - i);
#endif  // CONFIG_MRLS_IMPROVE
      }
    } else if (n_top_px > 0) {
#if CONFIG_MRLS_IMPROVE
      aom_memset16(left_col_1st, above_ref_1st[0], num_left_pixels_needed);
      aom_memset16(left_col_2nd, above_ref_2nd[0], num_left_pixels_needed);
#else
      aom_memset16(left_col, above_ref[0], num_left_pixels_needed);
#endif  // CONFIG_MRLS_IMPROVE
    }
  }

  // NEED_ABOVE
  if (need_above) {
    int need_right = extend_modes[mode] & NEED_ABOVERIGHT;
    if (use_filter_intra) need_right = 0;
#if CONFIG_DIP
    if (use_intra_dip) need_right = 1;
#endif  // CONFIG_DIP
    if (is_dr_mode)
      need_right = apply_ibp ? (p_angle < 90) || (p_angle > 180) : p_angle < 90;
    int num_top_pixels_needed =
        txwpx + (need_right ? txhpx : 0) + (mrl_index << 1);
#if CONFIG_DIP
    if (use_intra_dip) {
      // DIP mode requires above line + 1/4 tx width for overhang feature.
      num_top_pixels_needed = txwpx + (txwpx >> 2);
    }
#endif  // CONFIG_DIP
    if (n_top_px > 0) {
#if CONFIG_MRLS_IMPROVE
      memcpy(above_row_1st, above_ref_1st, n_top_px * sizeof(above_ref_1st[0]));
      memcpy(above_row_2nd, above_ref_2nd, n_top_px * sizeof(above_ref_2nd[0]));
#else
      memcpy(above_row, above_ref, n_top_px * sizeof(above_ref[0]));
#endif  // CONFIG_MRLS_IMPROVE
      i = n_top_px;
      if (need_right && n_topright_px > 0) {
        assert(n_top_px == txwpx);
#if CONFIG_MRLS_IMPROVE
        memcpy(above_row_1st + txwpx, above_ref_1st + txwpx,
               n_topright_px * sizeof(above_ref_1st[0]));
        memcpy(above_row_2nd + txwpx, above_ref_2nd + txwpx,
               n_topright_px * sizeof(above_ref_2nd[0]));
#else
        memcpy(above_row + txwpx, above_ref + txwpx,
               n_topright_px * sizeof(above_ref[0]));
#endif  // CONFIG_MRLS_IMPROVE
        i += n_topright_px;
      }
      if (i < num_top_pixels_needed) {
#if CONFIG_MRLS_IMPROVE
        aom_memset16(&above_row_1st[i], above_row_1st[i - 1],
                     num_top_pixels_needed - i);
        aom_memset16(&above_row_2nd[i], above_row_2nd[i - 1],
                     num_top_pixels_needed - i);
#else
        aom_memset16(&above_row[i], above_row[i - 1],
                     num_top_pixels_needed - i);
#endif  // CONFIG_MRLS_IMPROVE
      }
    } else if (n_left_px > 0) {
#if CONFIG_MRLS_IMPROVE
      aom_memset16(above_row_1st, left_ref_1st[0], num_top_pixels_needed);
      aom_memset16(above_row_2nd, left_ref_2nd[0], num_top_pixels_needed);
#else
      aom_memset16(above_row, left_ref[0], num_top_pixels_needed);
#endif  // CONFIG_MRLS_IMPROVE
    }
  }

  if (need_above_left) {
    for (i = 1; i <= mrl_index + 1; i++) {
#if CONFIG_MRLS_IMPROVE
      if (n_top_px > 0 && n_left_px > 0) {
        above_row_1st[-i] = above_ref_1st[-i];
        above_row_2nd[-i] = above_ref_2nd[-i];
        if (is_sb_boundary) {
          left_col_1st[-i] = left_ref_1st[-ref_stride];
          left_col_2nd[-i] = left_ref_2nd[-ref_stride];
        } else {
          left_col_1st[-i] = left_ref_1st[-i * ref_stride];
          left_col_2nd[-i] = left_ref_2nd[-i * ref_stride];
        }
      } else if (n_top_px > 0) {
        above_row_1st[-i] = left_col_1st[-i] = above_ref_1st[0];
        above_row_2nd[-i] = left_col_2nd[-i] = above_ref_2nd[0];
      } else if (n_left_px > 0) {
        above_row_1st[-i] = left_col_1st[-i] = left_ref_1st[0];
        above_row_2nd[-i] = left_col_2nd[-i] = left_ref_2nd[0];
      } else {
        above_row_1st[-i] = left_col_1st[-i] = base;
        above_row_2nd[-i] = left_col_2nd[-i] = base;
      }
#else
      if (n_top_px > 0 && n_left_px > 0) {
        above_row[-i] = above_ref[-i];
        if (is_sb_boundary)
          left_col[-i] = left_ref[-ref_stride];
        else
          left_col[-i] = left_ref[-i * ref_stride];

      } else if (n_top_px > 0) {
        above_row[-i] = left_col[-i] = above_ref[0];
      } else if (n_left_px > 0) {
        above_row[-i] = left_col[-i] = left_ref[0];
      } else {
        above_row[-i] = left_col[-i] = base;
      }
#endif  // CONFIG_MRLS_IMPROVE
    }
  }

  if (use_filter_intra) {
#if CONFIG_MRLS_IMPROVE
    highbd_filter_intra_predictor(dst, dst_stride, tx_size, above_row_1st,
                                  left_col_1st, filter_intra_mode, xd->bd);
#else
    highbd_filter_intra_predictor(dst, dst_stride, tx_size, above_row, left_col,
                                  filter_intra_mode, xd->bd);
#endif  // CONFIG_MRLS_IMPROVE
    return;
  }

#if CONFIG_DIP
  if (use_intra_dip) {
    av1_highbd_intra_dip_predictor(mbmi->intra_dip_mode, dst, dst_stride,
#if CONFIG_MRLS_IMPROVE
                                   above_row_1st, left_col_1st,
#else
                                   above_row, left_col,
#endif
                                   tx_size, xd->bd
#if CONFIG_DIP_EXT_PRUNING
                                   ,
                                   mbmi->intra_dip_features
#endif  // CONFIG_DIP_EXT_PRUNING
    );
    return;
  }
#endif  // CONFIG_DIP

  if (is_dr_mode) {
    int upsample_above = 0;
    int upsample_left = 0;
    if (!disable_edge_filter && mrl_index == 0) {
      int need_right = p_angle < 90;
      int need_bottom = p_angle > 180;
      int filt_type_above = get_filt_type(xd, plane);
      int filt_type_left = filt_type_above;
      int angle_above = p_angle - 90;
      int angle_left = p_angle - 180;
      if (apply_ibp) {
        need_right |= p_angle > 180;
        need_bottom |= p_angle < 90;
        const MB_MODE_INFO *ab =
            (plane == 0) ? xd->above_mbmi : xd->chroma_above_mbmi;
        const MB_MODE_INFO *le =
            (plane == 0) ? xd->left_mbmi : xd->chroma_left_mbmi;
        filt_type_above = ab ? is_smooth(ab, plane, xd->tree_type) : 0;
        filt_type_left = le ? is_smooth(le, plane, xd->tree_type) : 0;
        angle_above = p_angle > 180 ? (p_angle - 180 - 90) : angle_above;
        angle_left = p_angle < 90 ? p_angle : angle_left;
      }

      if (p_angle != 90 && p_angle != 180) {
        const int ab_le = need_above_left ? 1 : 0;
        if (need_above && need_left && (txwpx + txhpx >= 24)) {
#if CONFIG_MRLS_IMPROVE
          filter_intra_edge_corner_high(above_row_1st, left_col_1st);
#else
          filter_intra_edge_corner_high(above_row, left_col);
#endif  // CONFIG_MRLS_IMPROVE
        }
        if (need_above && n_top_px > 0) {
          const int strength = intra_edge_filter_strength(
              txwpx, txhpx, angle_above, filt_type_above);
          const int n_px = n_top_px + ab_le + (need_right ? txhpx : 0);
#if CONFIG_MRLS_IMPROVE
          av1_filter_intra_edge_high(above_row_1st - ab_le, n_px, strength);
#else
          av1_filter_intra_edge_high(above_row - ab_le, n_px, strength);
#endif  // CONFIG_MRLS_IMPROVE
        }
        if (need_left && n_left_px > 0) {
          const int strength = intra_edge_filter_strength(
              txhpx, txwpx, angle_left, filt_type_left);
          const int n_px = n_left_px + ab_le + (need_bottom ? txwpx : 0);
#if CONFIG_MRLS_IMPROVE
          av1_filter_intra_edge_high(left_col_1st - ab_le, n_px, strength);
#else
          av1_filter_intra_edge_high(left_col - ab_le, n_px, strength);
#endif  // CONFIG_MRLS_IMPROVE
        }
      }
#if !CONFIG_IDIF
      upsample_above = av1_use_intra_edge_upsample(txwpx, txhpx, angle_above,
                                                   filt_type_above);
      if (need_above && upsample_above) {
        const int n_px = txwpx + (need_right ? txhpx : 0);
#if CONFIG_MRLS_IMPROVE
        av1_upsample_intra_edge_high(above_row_1st, n_px, xd->bd);
#else
        av1_upsample_intra_edge_high(above_row, n_px, xd->bd);
#endif  // CONFIG_MRLS_IMPROVE
      }
      upsample_left =
          av1_use_intra_edge_upsample(txhpx, txwpx, angle_left, filt_type_left);
      if (need_left && upsample_left) {
        const int n_px = txhpx + (need_bottom ? txwpx : 0);
#if CONFIG_MRLS_IMPROVE
        av1_upsample_intra_edge_high(left_col_1st, n_px, xd->bd);
#else
        av1_upsample_intra_edge_high(left_col, n_px, xd->bd);
#endif  // CONFIG_MRLS_IMPROVE
      }
#endif  // !CONFIG_IDIF
    }
#if CONFIG_MRLS_IMPROVE
    const int is_multi_line_mrls_allowed_blk_sz = (tx_size == TX_4X4) ? 0 : 1;
#endif
#if CONFIG_IDIF
    if (plane == AOM_PLANE_Y) {
#if CONFIG_MRLS_IMPROVE
      highbd_dr_predictor_idif(dst, dst_stride, tx_size, above_row_1st,
                               left_col_1st, p_angle, xd->bd, mrl_index);

      if (xd->mi[0]->multi_line_mrl && mrl_index &&
          is_multi_line_mrls_allowed_blk_sz) {
        highbd_dr_predictor_idif(dst_mrl_line_0, txwpx, tx_size, above_row_2nd,
                                 left_col_2nd, p_angle, xd->bd, 0);

        int r, c;
        for (r = 0; r < txhpx; ++r) {
          for (c = 0; c < txwpx; ++c) {
            dst[r * dst_stride + c] =
                (dst[r * dst_stride + c] + dst_mrl_line_0[r * txwpx + c]) / 2;
          }
        }
      }
#else
      highbd_dr_predictor_idif(dst, dst_stride, tx_size, above_row, left_col,
                               p_angle, xd->bd, mrl_index);
#endif  // CONFIG_MRLS_IMPROVE
    } else {
#if CONFIG_MRLS_IMPROVE
      highbd_dr_predictor(dst, dst_stride, tx_size, above_row_1st, left_col_1st,
                          upsample_above, upsample_left, p_angle, xd->bd,
                          mrl_index);
      if (xd->mi[0]->multi_line_mrl && mrl_index &&
          is_multi_line_mrls_allowed_blk_sz) {
        highbd_dr_predictor(dst_mrl_line_0, txwpx, tx_size, above_row_2nd,
                            left_col_2nd, upsample_above, upsample_left,
                            p_angle, xd->bd, 0);

        int r, c;
        for (r = 0; r < txhpx; ++r) {
          for (c = 0; c < txwpx; ++c) {
            dst[r * dst_stride + c] =
                (dst[r * dst_stride + c] + dst_mrl_line_0[r * txwpx + c]) / 2;
          }
        }
      }
#else
      highbd_dr_predictor(dst, dst_stride, tx_size, above_row, left_col,
                          upsample_above, upsample_left, p_angle, xd->bd,
                          mrl_index);
#endif  // CONFIG_MRLS_IMPROVE
    }
#else
    highbd_dr_predictor(dst, dst_stride, tx_size, above_row, left_col,
                        upsample_above, upsample_left, p_angle, xd->bd,
                        mrl_index);
#endif  // CONFIG_IDIF
    if (apply_ibp) {
      if (mrl_index == 0
#if CONFIG_IMPROVED_INTRA_DIR_PRED
          && (angle_delta % 2 == 0) && plane == PLANE_TYPE_Y
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
      ) {
        if (p_angle > 0 && p_angle < 90) {
          int mode_index = angle_to_mode_index[p_angle];
#if CONFIG_IBP_WEIGHT
          if (is_ibp_enabled[mode_index]) {
#else
          uint8_t *weights = ibp_weights[tx_size][mode_index];
#endif  // !CONFIG_IBP_WEIGHT
#if CONFIG_IDIF
            if (plane == AOM_PLANE_Y) {
              highbd_second_dr_predictor_idif(second_pred, txwpx, tx_size,
#if CONFIG_MRLS_IMPROVE
                                              above_row_1st, left_col_1st,
#else
                                              above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                              p_angle, xd->bd);
            } else {
              highbd_second_dr_predictor(second_pred, txwpx, tx_size,
#if CONFIG_MRLS_IMPROVE
                                         above_row_1st, left_col_1st,
#else
                                         above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                         upsample_above, upsample_left, p_angle,
                                         xd->bd);
            }
#else
          highbd_second_dr_predictor(second_pred, txwpx, tx_size, above_row,
                                     left_col, upsample_above, upsample_left,
                                     p_angle, xd->bd);
#endif  // CONFIG_IDIF
            av1_highbd_ibp_dr_prediction_z1_c(
#if CONFIG_IBP_WEIGHT
                ibp_weights, mode_index
#else
              weights
#endif  // CONFIG_IBP_WEIGHT
                ,
                dst, dst_stride, second_pred, txwpx, txwpx, txhpx);
#if CONFIG_IBP_WEIGHT
          }
#endif  // CONFIG_IBP_WEIGHT
        }
        if (p_angle > 180 && p_angle < 270) {
          int mode_index = angle_to_mode_index[270 - p_angle];
#if CONFIG_IBP_WEIGHT
          if (is_ibp_enabled[mode_index]) {
#else
          int transpose_tsize = transpose_tx_size[tx_size];
          uint8_t *weights = ibp_weights[transpose_tsize][mode_index];
#endif  // !CONFIG_IBP_WEIGHT
#if CONFIG_IDIF
            if (plane == AOM_PLANE_Y) {
              highbd_second_dr_predictor_idif(second_pred, txwpx, tx_size,
#if CONFIG_MRLS_IMPROVE
                                              above_row_1st, left_col_1st,
#else
                                              above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                              p_angle, xd->bd);
            } else {
              highbd_second_dr_predictor(second_pred, txwpx, tx_size,
#if CONFIG_MRLS_IMPROVE
                                         above_row_1st, left_col_1st,
#else
                                         above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                         upsample_above, upsample_left, p_angle,
                                         xd->bd);
            }
#else
          highbd_second_dr_predictor(second_pred, txwpx, tx_size, above_row,
                                     left_col, upsample_above, upsample_left,
                                     p_angle, xd->bd);
#endif  // CONFIG_IDIF
            av1_highbd_ibp_dr_prediction_z3_c(
#if CONFIG_IBP_WEIGHT
                ibp_weights, mode_index
#else
              weights
#endif  // CONFIG_IBP_WEIGHT
                ,
                dst, dst_stride, second_pred, txwpx, txwpx, txhpx);
#if CONFIG_IBP_WEIGHT
          }
#endif  // CONFIG_IBP_WEIGHT
        }
      }
    }

#if !CONFIG_ORIP_NONDC_DISABLED
    // Apply sub-block based filter for horizontal/vertical intra mode
    if (apply_sub_block_based_refinement_filter &&
#if DF_RESTRICT_ORIP
        av1_allow_orip_dir(p_angle, tx_size)) {
#else
        av1_allow_orip_dir(p_angle)) {
#endif
      av1_apply_orip_4x4subblock_hbd(dst, dst_stride, tx_size,
#if CONFIG_MRLS_IMPROVE
                                     above_row_1st, left_col_1st,
#else
                                     above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                     mode, xd->bd);
    }
#endif
    return;
  }
  // predict
  if (mode == DC_PRED) {
    dc_pred_high[n_left_px > 0][n_top_px > 0][tx_size](dst, dst_stride,
#if CONFIG_MRLS_IMPROVE
                                                       above_row_1st,
                                                       left_col_1st,
#else
                                                       above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                                       xd->bd);
#if CONFIG_IBP_DC
    if (apply_ibp && ((plane == 0) || (xd->mi[0]->uv_mode != UV_CFL_PRED)) &&
        ((n_left_px > 0) || (n_top_px > 0))) {
      ibp_dc_pred_high[n_left_px > 0][n_top_px > 0][tx_size](dst, dst_stride,
#if CONFIG_MRLS_IMPROVE
                                                             above_row_1st,
                                                             left_col_1st,
#else
                                                             above_row,
                                                             left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                                             xd->bd);
    }
#endif
  } else {
    pred_high[mode][tx_size](dst, dst_stride,
#if CONFIG_MRLS_IMPROVE
                             above_row_1st, left_col_1st,
#else
                             above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                             xd->bd);
  }

  // Apply sub-block based filter for DC/smooth intra mode
  apply_sub_block_based_refinement_filter &=
#if DF_RESTRICT_ORIP
      av1_allow_orip_smooth_dc(mode, plane, tx_size);
#else
      av1_allow_orip_smooth_dc(mode, plane);
#endif
  if (apply_sub_block_based_refinement_filter) {
    av1_apply_orip_4x4subblock_hbd(dst, dst_stride, tx_size,
#if CONFIG_MRLS_IMPROVE
                                   above_row_1st, left_col_1st,
#else
                                   above_row, left_col,
#endif  // CONFIG_MRLS_IMPROVE
                                   mode, xd->bd);
  }
}

#define ARITHMETIC_LEFT_SHIFT(x, shift) \
  (((x) >= 0) ? ((x) << (shift)) : (-((-(x)) << (shift))))

void av1_predict_intra_block(
    const AV1_COMMON *cm, const MACROBLOCKD *xd, int wpx, int hpx,
    TX_SIZE tx_size, PREDICTION_MODE mode, int angle_delta, int use_palette,
    FILTER_INTRA_MODE filter_intra_mode, const uint16_t *ref, int ref_stride,
    uint16_t *dst, int dst_stride, int col_off, int row_off, int plane) {
  const MB_MODE_INFO *const mbmi = xd->mi[0];
  const int txwpx = tx_size_wide[tx_size];
  const int txhpx = tx_size_high[tx_size];
  const int x = col_off << MI_SIZE_LOG2;
  const int y = row_off << MI_SIZE_LOG2;

  if (use_palette) {
    int r, c;
    const uint8_t *const map = xd->plane[plane != 0].color_index_map +
                               xd->color_index_map_offset[plane != 0];
    const uint16_t *const palette =
        mbmi->palette_mode_info.palette_colors + plane * PALETTE_MAX_SIZE;
    for (r = 0; r < txhpx; ++r) {
      for (c = 0; c < txwpx; ++c) {
        dst[r * dst_stride + c] = palette[map[(r + y) * wpx + c + x]];
      }
    }
    return;
  }

  const struct macroblockd_plane *const pd = &xd->plane[plane];
  const int txw = tx_size_wide_unit[tx_size];
  const int txh = tx_size_high_unit[tx_size];
  const int ss_x = pd->subsampling_x;
  const int ss_y = pd->subsampling_y;
#if CONFIG_EXT_RECUR_PARTITIONS
  int have_top = 0, have_left = 0;
  set_have_top_and_left(&have_top, &have_left, xd, row_off, col_off, plane);
#else
  const int have_top =
      row_off || (ss_y ? xd->chroma_up_available : xd->up_available);
  const int have_left =
      col_off || (ss_x ? xd->chroma_left_available : xd->left_available);
#endif  // CONFIG_EXT_RECUR_PARTITIONS
  const int mi_row = plane ? xd->mi[0]->chroma_ref_info.mi_row_chroma_base
                           : -xd->mb_to_top_edge >> MI_SUBPEL_SIZE_LOG2;
  const int mi_col = plane ? xd->mi[0]->chroma_ref_info.mi_col_chroma_base
                           : -xd->mb_to_left_edge >> MI_SUBPEL_SIZE_LOG2;
  BLOCK_SIZE bsize = mbmi->sb_type[plane > 0];
  const BLOCK_SIZE init_bsize = bsize;
  // force 4x4 chroma component block size.
  if (ss_x || ss_y) {
    bsize = mbmi->chroma_ref_info.bsize_base;
  }
  const int mi_wide = mi_size_wide[bsize];
  const int mi_high = mi_size_high[bsize];

  // Distance between the right edge of this prediction block to
  // the tile right edge
  const int xr =
      ARITHMETIC_LEFT_SHIFT(xd->tile.mi_col_end - mi_col - mi_wide, 2 - ss_x) +
      wpx - x - txwpx;
  // Distance between the bottom edge of this prediction block to
  // the tile bottom edge
  const int yd =
      ARITHMETIC_LEFT_SHIFT(xd->tile.mi_row_end - mi_row - mi_high, 2 - ss_y) +
      hpx - y - txhpx;
  const int right_available =
      mi_col + ((col_off + txw) << ss_x) < xd->tile.mi_col_end;
  const int bottom_available =
      (yd > 0) && (mi_row + ((row_off + txh) << ss_y) < xd->tile.mi_row_end);

#if CONFIG_EXT_RECUR_PARTITIONS
  int px_top_right = 0;
  const int have_top_right = has_top_right(
      cm, xd, bsize, mi_row, mi_col, have_top, right_available, tx_size,
#if CONFIG_NEW_TX_PARTITION
      plane,
#endif  // CONFIG_NEW_TX_PARTITION
      row_off, col_off, ss_x, ss_y, xr, &px_top_right, bsize != init_bsize);
#else
  const PARTITION_TYPE partition = mbmi->partition;
  const int have_top_right =
      has_top_right(cm, bsize, mi_row, mi_col, have_top, right_available,
                    partition, tx_size, row_off, col_off, ss_x, ss_y);
#endif

  int px_bottom_left = 0;
  const int have_bottom_left = has_bottom_left(
      cm, xd, bsize, mi_row, mi_col, bottom_available, have_left, tx_size,
#if CONFIG_NEW_TX_PARTITION
      plane,
#endif  // CONFIG_NEW_TX_PARTITION
      row_off, col_off, ss_x, ss_y, yd, &px_bottom_left, bsize != init_bsize);

  const int disable_edge_filter = !cm->seq_params.enable_intra_edge_filter;

  const int is_sb_boundary =
      (mi_row % cm->mib_size == 0 && row_off == 0) ? 1 : 0;

  build_intra_predictors_high(
      xd, ref, ref_stride, dst, dst_stride, mode, angle_delta,
      filter_intra_mode, tx_size, disable_edge_filter,
      have_top ? AOMMIN(txwpx, xr + txwpx) : 0,
#if CONFIG_EXT_RECUR_PARTITIONS
      have_top_right ? px_top_right : 0,
#else
      have_top_right ? AOMMIN(txwpx, xr) : 0,
#endif
      have_left ? AOMMIN(txhpx, yd + txhpx) : 0,
      have_bottom_left ? px_bottom_left : 0, plane, is_sb_boundary,
      cm->seq_params.enable_orip, cm->seq_params.enable_ibp,
      cm->ibp_directional_weights);
  return;
}
#if CONFIG_ENABLE_MHCCP
void mhccp_implicit_fetch_neighbor_luma(const AV1_COMMON *cm,
                                        MACROBLOCKD *const xd, int row, int col,
                                        TX_SIZE tx_size, int *above_lines,
                                        int *left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
                                        int is_top_sb_boundary,
#endif
                                        int *ref_width, int *ref_height) {
  CFL_CTX *const cfl = &xd->cfl;
  struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y];
  const MB_MODE_INFO *const mbmi = xd->mi[0];

  int input_stride = pd->dst.stride;
  uint16_t *dst = &pd->dst.buf[(row * pd->dst.stride + col) << MI_SIZE_LOG2];

  const int sub_x = cfl->subsampling_x;
  const int sub_y = cfl->subsampling_y;
  int width = tx_size_wide[tx_size] << sub_x;
  int height = tx_size_high[tx_size] << sub_y;
#if CONFIG_EXT_RECUR_PARTITIONS
  int have_top = 0, have_left = 0;
  set_have_top_and_left(&have_top, &have_left, xd, row, col, 1);
#else
  const int have_top =
      row || (sub_y ? xd->chroma_up_available : xd->up_available);
  const int have_left =
      col || (sub_x ? xd->chroma_left_available : xd->left_available);
#endif
  const int mi_row = -xd->mb_to_top_edge >> MI_SUBPEL_SIZE_LOG2;
  const int mi_col = -xd->mb_to_left_edge >> MI_SUBPEL_SIZE_LOG2;
  BLOCK_SIZE bsize = mbmi->sb_type[1];
  const int mi_wide = mi_size_wide[bsize];
  const int mi_high = mi_size_high[bsize];

  const int row_offset = mi_row - xd->mi[0]->chroma_ref_info.mi_row_chroma_base;
  const int col_offset = mi_col - xd->mi[0]->chroma_ref_info.mi_col_chroma_base;
  *above_lines =
      have_top ? (((int)((xd->mi_row - row_offset) -
                         (int)((LINE_NUM + 1) >> (MI_SIZE_LOG2 >> sub_y))) <
                   xd->tile.mi_row_start)
                      ? ((xd->mi_row - row_offset - xd->tile.mi_row_start)
                         << MI_SIZE_LOG2)
                      : ((LINE_NUM + 1) << sub_y))
               : 0;  // This is luma line num
  *left_lines =
      have_left ? (((int)((xd->mi_col - col_offset) -
                          (int)((LINE_NUM + 1) >> (MI_SIZE_LOG2 >> sub_x))) <
                    xd->tile.mi_col_start)
                       ? ((xd->mi_col - col_offset - xd->tile.mi_col_start)
                          << MI_SIZE_LOG2)
                       : ((LINE_NUM + 1) << sub_x))
                : 0;
  // Distance between the bottom edge of this prediction block to
  // the frame bottom edge
  // txw,txh width/height in samples of transform block
  // wpx,hpx width/height in pixels of chroma block
  // width,height width height in pixels of transform block
  // wpx - x - width is pixels to right of transform block to edge of chroma
  // block tx_mi_col/tx_mi_row is mi location of transform block

  const BLOCK_SIZE init_bsize = bsize;
  // force 4x4 chroma component block size.
  if (sub_x || sub_y) {
    bsize = mbmi->chroma_ref_info.bsize_base;
  }
  const int hpx = block_size_high[bsize];
  const int wpx = block_size_wide[bsize];
  const int tx_mi_col = xd->mi[0]->chroma_ref_info.mi_col_chroma_base + col;
  const int tx_mi_row = xd->mi[0]->chroma_ref_info.mi_row_chroma_base + row;

  const int x = col << MI_SIZE_LOG2;
  const int xr =
      ARITHMETIC_LEFT_SHIFT(xd->tile.mi_col_end - mi_col - mi_wide, 2 - sub_x) +
      ((wpx - x - width) >> sub_x);

  const int y = row << MI_SIZE_LOG2;
  const int yd =
      ARITHMETIC_LEFT_SHIFT(xd->tile.mi_row_end - mi_row - mi_high, 2 - sub_y) +
      ((hpx - y - height) >> sub_y);

  const int right_available =
      tx_mi_col + (width >> MI_SIZE_LOG2) < xd->tile.mi_col_end;
  const int bottom_available =
      (yd > 0) && (tx_mi_row + (height >> MI_SIZE_LOG2)) < xd->tile.mi_row_end;

#if CONFIG_EXT_RECUR_PARTITIONS
  int px_top_right = 0;
  const int have_top_right = has_top_right(
      cm, xd, bsize, mi_row - row_offset, mi_col - col_offset, have_top,
      right_available, tx_size,
#if CONFIG_NEW_TX_PARTITION
      0,
#endif  // CONFIG_NEW_TX_PARTITION
      row, col, sub_x, sub_y, xr, &px_top_right, bsize != init_bsize);
#else
  const int have_top_right = has_top_right(
      cm, bsize, xd->mi_row, xd->mi_col, have_top, right_available,
      mbmi->partition, tx_size, row, col, sub_x, sub_y);
#endif
  int px_bottom_left = 0;
#if CONFIG_EXT_RECUR_PARTITIONS
  const int have_bottom_left = has_bottom_left(
      cm, xd, bsize, mi_row - row_offset, mi_col - col_offset, bottom_available,
      have_left, tx_size,
#if CONFIG_NEW_TX_PARTITION
      0,
#endif  // CONFIG_NEW_TX_PARTITION
      row, col, sub_x, sub_y, yd, &px_bottom_left, bsize != init_bsize);
#else
  const int have_bottom_left =
      has_bottom_left(cm, xd, bsize, xd->mi_row, xd->mi_col, bottom_available,
                      have_left, tx_size, row, col, sub_x, sub_y, yd,
                      &px_bottom_left, bsize != init_bsize);
#endif

  *ref_width = AOMMIN(128, *left_lines + width +
                               (have_top_right && width > 4
                                    ? AOMMIN((px_top_right << sub_x), width)
                                    : 0));

  if ((((tx_mi_col) << MI_SIZE_LOG2) + width +
       (have_top_right && width > 4 ? AOMMIN((px_top_right << sub_x), width)
                                    : 0)) >=
      (int)(xd->tile.mi_col_end << MI_SIZE_LOG2)) {
    *ref_width = (xd->tile.mi_col_end << MI_SIZE_LOG2) -
                 ((tx_mi_col) << MI_SIZE_LOG2) + *left_lines - 1;
  }

  *ref_height = AOMMIN(128, *above_lines + height +
                                (have_bottom_left && height > 4
                                     ? AOMMIN((px_bottom_left << sub_y), height)
                                     : 0));

  if ((((tx_mi_row) << MI_SIZE_LOG2) + height +
       (have_bottom_left && height > 4
            ? AOMMIN((px_bottom_left << sub_y), height)
            : 0)) >= (int)(xd->tile.mi_row_end << MI_SIZE_LOG2)) {
    *ref_height = *above_lines + (xd->tile.mi_row_end << MI_SIZE_LOG2) -
                  ((tx_mi_row) << MI_SIZE_LOG2) - 1;
  }

  *ref_width = AOMMIN(*ref_width, 128);
  *ref_height = AOMMIN(*ref_height, 128);

  memset(cfl->mhccp_ref_buf_q3[0], 0, sizeof(cfl->mhccp_ref_buf_q3[0]));

  uint16_t *output_q3 = cfl->mhccp_ref_buf_q3[0];
  int output_stride = CFL_BUF_LINE * 2;
  uint16_t *input = dst;
  if (row_offset > 0)
    input = input - (row_offset << MI_SIZE_LOG2) * input_stride;
  if (col_offset > 0) input = input - (col_offset << MI_SIZE_LOG2);
  input = input - (*above_lines) * input_stride - *left_lines;
  if ((*above_lines) || (*left_lines)) {
    if (sub_x && sub_y) {
      for (int h = 0; h < (*ref_height); h += 2) {
        for (int w = 0; w < (*ref_width); w += 2) {
          const int bot = w + input_stride;
          if ((h >= *above_lines && w >= *left_lines + width) ||
              (h >= *above_lines + height && w >= *left_lines))
            continue;
          // For blocks at the superblock top boundary, we only have one line
          // above available, therefore we need to offset values for above
          // region Proposal E229 (for 4:2:0 case) propose to use only 4 lines
          // and 2 padding lines for the luma reference region, and 2 lines and
          // 1 padding line for the chroma reference region. Therefore, for
          // these 2 padding lines above and to the left, we need to offset the
          // reference region for the top and left boundaries ref_h_t_off is the
          // position offset value of the top pixel in cfl_ds_filter_index == 2
          // for both padding and superblock top boundary
          int ref_h_t_off = 0;
          // ref_h_c_off is the position offset value of the pixel in the same
          // horizontal line of the center pixel for both padding and superblock
          // top boundary
          int ref_h_c_off = 0;
          // ref_h_b_off is the position offset value of the bottom pixel in
          // downsample filtering for both padding and superblock top boundary
          int ref_h_b_off = 0;
          // ref_w_off is the position offset value for padding only in the left
          // and right directions
          int ref_w_off = 0;
#if CONFIG_MHCCP_SB_BOUNDARY
          // Preparing the vertical position offset values for superblock top
          // boundary and padding
          if (*above_lines == ((LINE_NUM + 1) << sub_y)) {
            if (is_top_sb_boundary && (h < *above_lines)) {
              // For the top boundary of the superblock, we need to offset the
              // reference region
              ref_h_t_off = h != 0 ? ((LINE_NUM + 1) << sub_y) - h
                                   : ((LINE_NUM + 1) << sub_y) - (h + 1);
              ref_h_c_off = ((LINE_NUM + 1) << sub_y) - (h + 1);
              ref_h_b_off = ((LINE_NUM + 1) << sub_y) - (h + 2);
            } else {
              // For the 2 padding lines above, we need to offset the reference
              // region
              if (h == 0) {
                ref_h_t_off = 2;
                ref_h_c_off = 2;
                ref_h_b_off = 2;
              }
            }
          }
          // For the 2 padding lines left, we need to offset the reference
          // region
          if (*left_lines == ((LINE_NUM + 1) << sub_x) && (w == 0)) {
            ref_w_off = 2;
          }
#endif
          if (cm->seq_params.cfl_ds_filter_index == 1) {
            output_q3[w >> 1] =
                input[AOMMAX(0, w - 1) + ref_w_off +
                      ref_h_c_off * input_stride] +
                2 * input[w + ref_w_off + ref_h_c_off * input_stride] +
                input[w + 1 + ref_w_off + ref_h_c_off * input_stride] +
                input[bot + AOMMAX(-1, -w) + ref_w_off +
                      ref_h_b_off * input_stride] +
                2 * input[bot + ref_w_off + ref_h_b_off * input_stride] +
                input[bot + 1 + ref_w_off + ref_h_b_off * input_stride];
          } else if (cm->seq_params.cfl_ds_filter_index == 2) {
            const int top = h != 0 ? w - input_stride : w;
            output_q3[w >> 1] =
                input[AOMMAX(0, w - 1) + ref_w_off +
                      ref_h_c_off * input_stride] +
                4 * input[w + ref_w_off + ref_h_c_off * input_stride] +
                input[w + 1 + ref_w_off + ref_h_c_off * input_stride] +
                input[top + ref_w_off + ref_h_t_off * input_stride] +
                input[bot + ref_w_off + ref_h_b_off * input_stride];
          } else {
            output_q3[w >> 1] =
                (input[w + ref_w_off + ref_h_c_off * input_stride] +
                 input[w + 1 + ref_w_off + ref_h_c_off * input_stride] +
                 input[bot + ref_w_off + ref_h_b_off * input_stride] +
                 input[bot + 1 + ref_w_off + ref_h_b_off * input_stride])
                << 1;
          }
        }
        output_q3 += output_stride;
        input += (input_stride << 1);
      }

    } else if (sub_x) {
      for (int h = 0; h < (*ref_height); h++) {
        for (int i = 0; i < (*ref_width); i += 2) {
          const int filter_type = cm->seq_params.cfl_ds_filter_index;
          int ref_h_c_off = 0;
          int ref_w_off = 0;
#if CONFIG_MHCCP_SB_BOUNDARY
          if (*above_lines == (LINE_NUM + 1)) {
            if (is_top_sb_boundary && (h < *above_lines)) {
              // For the top boundary of the superblock, we need to offset the
              // reference region
              ref_h_c_off = (LINE_NUM + 1) - (h + 1);
            } else {
              if (h == 0) {
                // For the 1 padding lines above, we need to offset the
                // reference region
                ref_h_c_off = 1;
              }
            }
          }
          // For the 2 padding lines left, we need to offset the reference
          // region
          if (*left_lines == ((LINE_NUM + 1) << sub_x) && (i == 0)) {
            ref_w_off = 2;
          }
#endif
          if (filter_type == 1) {
            output_q3[i >> 1] =
                (input[AOMMAX(0, i - 1) + ref_w_off +
                       ref_h_c_off * input_stride] +
                 2 * input[i + ref_w_off + ref_h_c_off * input_stride] +
                 input[i + 1 + ref_w_off + ref_h_c_off * input_stride])
                << 1;
          } else if (filter_type == 2) {
            output_q3[i >> 1] =
                input[i + ref_w_off + ref_h_c_off * input_stride] << 3;
          } else {
            output_q3[i >> 1] =
                (input[i + ref_w_off + ref_h_c_off * input_stride] +
                 input[i + 1 + ref_w_off + ref_h_c_off * input_stride])
                << 2;
          }
        }
        output_q3 += output_stride;
        input += input_stride;
      }
    } else if (sub_y) {
      for (int h = 0; h < (*ref_height); h += 2) {
        for (int i = 0; i < (*ref_width); ++i) {
          const int bot = i + input_stride;
          int ref_h_c_off = 0;
          int ref_h_b_off = 0;
          int ref_w_off = 0;
#if CONFIG_MHCCP_SB_BOUNDARY
          if (*above_lines == ((LINE_NUM + 1) << sub_y)) {
            if (is_top_sb_boundary && (h < *above_lines)) {
              // For the top boundary of the superblock, we need to offset the
              // reference region
              ref_h_c_off = ((LINE_NUM + 1) << sub_y) - (h + 1);
              ref_h_b_off = ((LINE_NUM + 1) << sub_y) - (h + 2);
            } else {
              // For the 2 padding lines above, we need to offset the reference
              // region
              if (h == 0) {
                ref_h_c_off = 2;
                ref_h_b_off = 2;
              }
            }
          }
          // For the 1 padding lines left, we need to offset the reference
          // region
          if (*left_lines == (LINE_NUM + 1) && (i == 0)) {
            ref_w_off = 1;
          }
#endif
          output_q3[i] = (input[i + ref_w_off + ref_h_c_off * input_stride] +
                          input[bot + ref_w_off + ref_h_b_off * input_stride])
                         << 2;
        }
        output_q3 += output_stride;
        input += input_stride * 2;
      }
    } else {
      for (int h = 0; h < (*ref_height); h++) {
        for (int i = 0; i < (*ref_width); ++i) {
          int ref_h_c_off = 0;
          int ref_w_off = 0;
#if CONFIG_MHCCP_SB_BOUNDARY
          // For the top boundary of the superblock, we need to offset the
          // reference region
          if (*above_lines == (LINE_NUM + 1)) {
            if (is_top_sb_boundary && (h < *above_lines)) {
              ref_h_c_off = (LINE_NUM + 1) - (h + 1);
            } else {
              if (h == 0) {
                // For the 1 padding lines above, we need to offset the
                // reference region
                ref_h_c_off = 1;
              }
            }
          }
          // For the 1 padding lines left, we need to offset the reference
          // region
          if (*left_lines == (LINE_NUM + 1) && (i == 0)) {
            ref_w_off = 1;
          }
#endif
          output_q3[i] = input[i + ref_w_off + ref_h_c_off * input_stride] << 3;
        }
        output_q3 += output_stride;
        input += input_stride;
      }
    }
  }
}

void mhccp_implicit_fetch_neighbor_chroma(MACROBLOCKD *const xd, int plane,
                                          int row, int col, TX_SIZE tx_size,
                                          int above_lines, int left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
                                          int is_top_sb_boundary,
#endif
                                          int ref_width, int ref_height) {
  CFL_CTX *const cfl = &xd->cfl;
  struct macroblockd_plane *const pd = &xd->plane[plane];
  int input_stride = pd->dst.stride;
  uint16_t *dst = &pd->dst.buf[(row * pd->dst.stride + col) << MI_SIZE_LOG2];

  const int width = tx_size_wide[tx_size];
  const int height = tx_size_high[tx_size];

  memset(cfl->mhccp_ref_buf_q3[plane], 0, sizeof(cfl->mhccp_ref_buf_q3[plane]));

  uint16_t *output_q3 = cfl->mhccp_ref_buf_q3[plane];
  int output_stride = CFL_BUF_LINE * 2;
  uint16_t *input = dst - above_lines * input_stride - left_lines;
  if (above_lines || left_lines) {
    for (int h = 0; h < ref_height; ++h) {
      for (int w = 0; w < ref_width; ++w) {
        if ((h >= above_lines && w >= left_lines + width) ||
            (h >= above_lines + height && w >= left_lines))
          continue;
#if CONFIG_MHCCP_SB_BOUNDARY
        int ref_h_offset = 0, ref_w_offset = 0;
        if (above_lines == (LINE_NUM + 1)) {
          if (is_top_sb_boundary && (h < above_lines)) {
            ref_h_offset = (LINE_NUM + 1) - (h + 1);
          } else {
            if (h == 0) {
              ref_h_offset = 1;
            }
          }
        }
        if (left_lines == (LINE_NUM + 1) && (w == 0)) {
          ref_w_offset = 1;
        }
        output_q3[w] = input[w + ref_w_offset + ref_h_offset * input_stride];
#else   // CONFIG_MHCCP_SB_BOUNDARY
        output_q3[w] = input[w];
#endif  // CONFIG_MHCCP_SB_BOUNDARY
      }
      output_q3 += output_stride;
      input += input_stride;
    }
  }
}
#undef ARITHMETIC_LEFT_SHIFT
#endif  // CONFIG_ENABLE_MHCCP
void av1_predict_intra_block_facade(const AV1_COMMON *cm, MACROBLOCKD *xd,
                                    int plane, int blk_col, int blk_row,
                                    TX_SIZE tx_size) {
#if CONFIG_NEW_TX_PARTITION
  MB_MODE_INFO *const mbmi = xd->mi[0];
#else
  const MB_MODE_INFO *const mbmi = xd->mi[0];
#endif  // CONFIG_NEW_TX_PARTITION
  struct macroblockd_plane *const pd = &xd->plane[plane];
  const int dst_stride = pd->dst.stride;
  uint16_t *dst =
      &pd->dst.buf[(blk_row * dst_stride + blk_col) << MI_SIZE_LOG2];
  const PREDICTION_MODE mode =
      (plane == AOM_PLANE_Y) ? mbmi->mode : get_uv_mode(mbmi->uv_mode);
  const int use_palette = mbmi->palette_mode_info.palette_size[plane != 0] > 0;
  const FILTER_INTRA_MODE filter_intra_mode =
      (plane == AOM_PLANE_Y && mbmi->filter_intra_mode_info.use_filter_intra)
          ? mbmi->filter_intra_mode_info.filter_intra_mode
          : FILTER_INTRA_MODES;

  const int angle_delta = mbmi->angle_delta[plane != AOM_PLANE_Y] * ANGLE_STEP;

#if CONFIG_NEW_TX_PARTITION
  if (plane != AOM_PLANE_Y) mbmi->txb_idx = 0;
#endif  // CONFIG_NEW_TX_PARTITION

  if (plane != AOM_PLANE_Y && mbmi->uv_mode == UV_CFL_PRED) {
#if CONFIG_DEBUG
    assert(is_cfl_allowed(xd));
#if CONFIG_EXT_RECUR_PARTITIONS
    const BLOCK_SIZE plane_bsize = get_mb_plane_block_size(
        xd, mbmi, plane, pd->subsampling_x, pd->subsampling_y);
#else
    const BLOCK_SIZE plane_bsize =
        get_plane_block_size(mbmi->sb_type[xd->tree_type == CHROMA_PART],
                             pd->subsampling_x, pd->subsampling_y);
#endif  // CONFIG_EXT_RECUR_PARTITIONS
    (void)plane_bsize;
    assert(plane_bsize < BLOCK_SIZES_ALL);
    if (!xd->lossless[mbmi->segment_id]) {
      assert(blk_col == 0);
      assert(blk_row == 0);
      assert(block_size_wide[plane_bsize] == tx_size_wide[tx_size]);
      assert(block_size_high[plane_bsize] == tx_size_high[tx_size]);
    }
#endif
    // chroma_bsize is the size in units of 4x4 luma samples of the chroma block
    // represented as a BLOCK_SIZE
    const BLOCK_SIZE chroma_bsize = get_bsize_base(xd, mbmi, PLANE_TYPE_UV);
    // chroma_tx_size is the size in units of 4x4 luma samples of the chroma
    // block represented as a TX_SIZE
    const TX_SIZE chroma_tx_size = max_txsize_rect_lookup[chroma_bsize];
    CFL_CTX *const cfl = &xd->cfl;
    const int mi_row = -xd->mb_to_top_edge >> MI_SUBPEL_SIZE_LOG2;
    const int mi_col = -xd->mb_to_left_edge >> MI_SUBPEL_SIZE_LOG2;
    const int row_offset =
        mi_row - xd->mi[0]->chroma_ref_info.mi_row_chroma_base;
    const int col_offset =
        mi_col - xd->mi[0]->chroma_ref_info.mi_col_chroma_base;
    struct macroblockd_plane *const luma_pd = &xd->plane[AOM_PLANE_Y];
    // luma_dst points to the top-left luma sample corresponding to the top-left
    // chroma sample of the chroma block
    uint16_t *luma_dst = &luma_pd->dst.buf[-(
        (row_offset * luma_pd->dst.stride + col_offset) << MI_SIZE_LOG2)];
    cfl_store(xd, cfl, luma_dst, luma_pd->dst.stride, 0, 0, chroma_tx_size,
              cm->seq_params.cfl_ds_filter_index);

    CFL_PRED_TYPE pred_plane = get_cfl_pred_type(plane);
    if (mbmi->cfl_idx == CFL_DERIVED_ALPHA) {
      cfl->dc_pred_is_cached[pred_plane] = 0;
      cfl->use_dc_pred_cache = 0;
    }
    if (cfl->dc_pred_is_cached[pred_plane] == 0) {
      av1_predict_intra_block(cm, xd, pd->width, pd->height, tx_size, mode,
                              angle_delta, use_palette, filter_intra_mode, dst,
                              dst_stride, dst, dst_stride, blk_col, blk_row,
                              plane);
      if (cfl->use_dc_pred_cache) {
        cfl_store_dc_pred(xd, dst, pred_plane, tx_size_wide[tx_size]);
        cfl->dc_pred_is_cached[pred_plane] = 1;
      }
    } else {
      cfl_load_dc_pred(xd, dst, dst_stride, tx_size, pred_plane);
    }
#if CONFIG_ENABLE_MHCCP
    const int sub_x = cfl->subsampling_x;
    const int sub_y = cfl->subsampling_y;
    int above_lines = 0, left_lines = 0, ref_width = 0, ref_height = 0;
#endif  // CONFIG_ENABLE_MHCCP
    {
#if CONFIG_CFL_SIMPLIFICATION
      const int row_start = ((xd->mi[0]->chroma_ref_info.mi_row_chroma_base +
                              (blk_row << cfl->subsampling_y))
                             << MI_SIZE_LOG2);
      const int sb_height = block_size_high[cm->sb_size];
      const int is_top_sb_boundary = !(row_start % sb_height);
#endif  // CONFIG_CFL_SIMPLIFICATION

#if CONFIG_ENABLE_MHCCP
      if (mbmi->cfl_idx < CFL_MULTI_PARAM_V) {
#else
      {
#endif  // CONFIG_ENABLE_MHCCP
        cfl_implicit_fetch_neighbor_luma(cm, xd, blk_row << cfl->subsampling_y,
                                         blk_col << cfl->subsampling_x,
#if CONFIG_CFL_SIMPLIFICATION
                                         is_top_sb_boundary,
#endif  // CONFIG_CFL_SIMPLIFICATION
                                         chroma_tx_size);
        cfl_calc_luma_dc(xd, blk_row, blk_col, tx_size);
      }
#if CONFIG_ENABLE_MHCCP
      if (mbmi->cfl_idx == CFL_DERIVED_ALPHA) {
        cfl_implicit_fetch_neighbor_chroma(cm, xd, plane, blk_row, blk_col,
                                           tx_size);
        cfl_derive_implicit_scaling_factor(xd, plane, blk_row, blk_col,
                                           tx_size);
      }
#if MHCCP_3_PARAMETERS
      else if (mbmi->cfl_idx == CFL_MULTI_PARAM_V) {
        mhccp_implicit_fetch_neighbor_luma(
            cm, xd, blk_row << cfl->subsampling_y,
            blk_col << cfl->subsampling_x, tx_size, &above_lines, &left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
            is_top_sb_boundary,
#endif  // CONFIG_MHCCP_SB_BOUNDARY
            &ref_width, &ref_height);

        above_lines >>= sub_y;
        left_lines >>= sub_x;
        ref_width >>= sub_x;
        ref_height >>= sub_y;
        mhccp_implicit_fetch_neighbor_chroma(xd, plane, blk_row, blk_col,
                                             tx_size, above_lines, left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
                                             is_top_sb_boundary,
#endif  // CONFIG_MHCCP_SB_BOUNDARY
                                             ref_width, ref_height);
        mhccp_derive_multi_param_hv(xd, plane, above_lines, left_lines,
                                    ref_width, ref_height, mbmi->mh_dir
#if CONFIG_MHCCP_SB_BOUNDARY
                                    ,
                                    is_top_sb_boundary
#endif  // CONFIG_MHCCP_SB_BOUNDARY
        );
      }
#else  // MHCCP_3_PARAMETERS
      else if (mbmi->cfl_idx == CFL_MULTI_PARAM_V && mbmi->mh_dir == 0) {
        mhccp_implicit_fetch_neighbor_luma(
            cm, xd, blk_row << cfl->subsampling_y,
            blk_col << cfl->subsampling_x, tx_size, &above_lines, &left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
            is_top_sb_boundary,
#endif  // CONFIG_MHCCP_SB_BOUNDARY
            &ref_width, &ref_height);

        above_lines >>= sub_y;
        left_lines >>= sub_x;
        ref_width >>= sub_x;
        ref_height >>= sub_y;
        mhccp_implicit_fetch_neighbor_chroma(xd, plane, blk_row, blk_col,
                                             tx_size, above_lines, left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
                                             is_top_sb_boundary,
#endif  // CONFIG_MHCCP_SB_BOUNDARY
                                             ref_width, ref_height);
        mhccp_derive_multi_param_hv(xd, plane, above_lines, left_lines,
                                    ref_width, ref_height, 0
#if CONFIG_MHCCP_SB_BOUNDARY
                                    ,
                                    is_top_sb_boundary
#endif  // CONFIG_MHCCP_SB_BOUNDARY
        );
      } else if (mbmi->cfl_idx == CFL_MULTI_PARAM_V && mbmi->mh_dir == 1) {
        mhccp_implicit_fetch_neighbor_luma(
            cm, xd, blk_row << cfl->subsampling_y,
            blk_col << cfl->subsampling_x, tx_size, &above_lines, &left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
            is_top_sb_boundary,
#endif  // CONFIG_MHCCP_SB_BOUNDARY
            &ref_width, &ref_height);
        above_lines >>= sub_y;
        left_lines >>= sub_x;
        ref_width >>= sub_x;
        ref_height >>= sub_y;
        mhccp_implicit_fetch_neighbor_chroma(xd, plane, blk_row, blk_col,
                                             tx_size, above_lines, left_lines,
#if CONFIG_MHCCP_SB_BOUNDARY
                                             is_top_sb_boundary,
#endif  // CONFIG_MHCCP_SB_BOUNDARY
                                             ref_width, ref_height);
        mhccp_derive_multi_param_hv(xd, plane, above_lines, left_lines,
                                    ref_width, ref_height, 1
#if CONFIG_MHCCP_SB_BOUNDARY
                                    ,
                                    is_top_sb_boundary
#endif  // CONFIG_MHCCP_SB_BOUNDARY
        );
      }
#endif  // MHCCP_3_PARAMETERS
#else
      if (mbmi->cfl_idx == CFL_DERIVED_ALPHA) {
        cfl_implicit_fetch_neighbor_chroma(cm, xd, plane, blk_row, blk_col,
                                           tx_size);
        cfl_derive_implicit_scaling_factor(xd, plane, blk_row, blk_col,
                                           tx_size);
      }
#endif  // CONFIG_ENABLE_MHCCP
    }
#if CONFIG_ENABLE_MHCCP
    cfl_predict_block(xd, dst, dst_stride, tx_size, plane, above_lines > 0,
                      left_lines > 0, above_lines, left_lines);

#else
    cfl_predict_block(xd, dst, dst_stride, tx_size, plane);
#endif
    return;
  }

  av1_predict_intra_block(cm, xd, pd->width, pd->height, tx_size, mode,
                          angle_delta, use_palette, filter_intra_mode, dst,
                          dst_stride, dst, dst_stride, blk_col, blk_row, plane);
}

void av1_init_intra_predictors(void) {
  aom_once(init_intra_predictors_internal);
}

DECLARE_ALIGNED(16, const int8_t,
                av1_sub_block_filter_intra_taps_4x4[16][9]) = {
  { 4, 16, 4, 0, 0, 16, 4, 0, 0 }, { 2, 4, 16, 4, 0, 8, 2, 0, 0 },
  { 1, 0, 4, 16, 4, 4, 1, 0, 0 },  { 0, 0, 2, 4, 16, 2, 0, 0, 0 },

  { 2, 8, 2, 0, 0, 4, 16, 4, 0 },  { 0, 2, 8, 2, 0, 2, 8, 2, 0 },
  { 0, 0, 2, 8, 2, 1, 4, 1, 0 },   { 0, 0, 0, 2, 8, 1, 2, 0, 0 },

  { 0, 4, 0, 0, 0, 0, 4, 16, 4 },  { 0, 0, 4, 0, 0, 0, 2, 8, 2 },
  { 0, 0, 1, 4, 1, 0, 1, 4, 1 },   { 0, 0, 0, 2, 4, 0, 0, 4, 0 },

  { 0, 0, 1, 0, 0, 0, 2, 4, 16 },  { 0, 0, 0, 1, 0, 0, 1, 2, 8 },
  { 0, 0, 1, 2, 1, 0, 0, 1, 4 },   { 0, 0, 0, 1, 2, 0, 0, 1, 2 },
};

void av1_apply_orip_4x4subblock_hbd(uint16_t *dst, ptrdiff_t stride,
                                    TX_SIZE tx_size, const uint16_t *above,
                                    const uint16_t *left, PREDICTION_MODE mode,
                                    int bd) {
  const int bw = tx_size_wide[tx_size];
  const int bh = tx_size_high[tx_size];

  // initialize references for the first row
  uint16_t ref_samples_sb_row[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  uint16_t left_ref_tmp_for_next_sb[5] = { 0, 0, 0, 0, 0 };
  uint16_t ref_samples_sb_col[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  uint16_t top_ref_tmp_for_next_sb[5] = { 0, 0, 0, 0, 0 };

  const int num_vertical_sb = (bh >> 2);
  const int num_top_ref = 5;
  const int num_left_ref = 4;

  uint8_t widthThreshold = (mode == H_PRED) ? 0 : AOMMIN((bw >> 2), 4);
  uint8_t heightThreshold = (mode == V_PRED) ? 0 : AOMMIN((bh >> 2), 4);

  memcpy(&ref_samples_sb_row[0], &above[-1],
         num_top_ref * sizeof(uint16_t));  // copy top reference
  memcpy(&ref_samples_sb_row[num_top_ref], &left[0],
         num_left_ref * sizeof(uint16_t));  // copy left reference

  // initialize references for the column
  if (num_vertical_sb > 1) {
    ref_samples_sb_col[0] = left[3];
    memcpy(&ref_samples_sb_col[1], &dst[3 * stride],
           (num_top_ref - 1) * sizeof(uint16_t));  // copy top reference
    memcpy(&ref_samples_sb_col[5], &left[4],
           num_left_ref * sizeof(uint16_t));  // copy left reference
  }

  // loop to process first row of sub-blocks
  for (int n = 0; n < (bw >> 2); n++) {
    int r_sb = 0;
    int c_sb = (n << 2);
    memcpy(&ref_samples_sb_row[0], &above[c_sb - 1],
           num_top_ref * sizeof(uint16_t));  // copy top reference

    // copy left reference for the next sub-blocks
    for (int q = 0; q < 4; q++)
      left_ref_tmp_for_next_sb[q] = dst[(r_sb + q) * stride + c_sb + 3];
    for (int k = 0; k < 16; ++k) {
      int r_pos = r_sb + (k >> 2);
      int c_pos = c_sb + (k & 0x03);
      if (!(c_pos >= widthThreshold && r_pos >= heightThreshold)) {
        int predvalue = (int)dst[stride * r_pos + c_pos];
        int offset = 0;
        for (int tap = 0; tap < 9; tap++) {
          int diff = (int)ref_samples_sb_row[tap] - predvalue;
          offset += av1_sub_block_filter_intra_taps_4x4[k][tap] * diff;
        }
        offset = (offset + 32) >> 6;
        int filteredpixelValue = predvalue + offset;
        dst[stride * r_pos + c_pos] = clip_pixel_highbd(filteredpixelValue, bd);
      }
    }  // End of the subblock
    memcpy(&ref_samples_sb_row[num_top_ref], &left_ref_tmp_for_next_sb[0],
           num_left_ref *
               sizeof(uint16_t));  // copy left reference for the next sub-block
  }

  // process first column
  // loop to process first column of sub-blocks
  if (num_vertical_sb > 1) {
    for (int m = 1; m < num_vertical_sb; m++) {
      int r_sb = (m << 2);
      int c_sb = 0;

      ref_samples_sb_col[0] = left[r_sb - 1];
      memcpy(&ref_samples_sb_col[5], &left[r_sb],
             (num_top_ref - 1) * sizeof(uint16_t));  // copy left reference
      memcpy(&top_ref_tmp_for_next_sb[0], &dst[(r_sb + 3) * stride],
             num_left_ref * sizeof(uint16_t));  // copy top reference

      for (int k = 0; k < 16; ++k) {
        int r_pos = r_sb + (k >> 2);
        int c_pos = c_sb + (k & 0x03);
        if (!(c_pos >= widthThreshold && r_pos >= heightThreshold)) {
          int predvalue = (int)dst[stride * r_pos + c_pos];
          int offset = 0;
          for (int tap = 0; tap < 9; tap++) {
            int diff = (int)ref_samples_sb_col[tap] - predvalue;
            offset += av1_sub_block_filter_intra_taps_4x4[k][tap] * diff;
          }
          offset = (offset + 32) >> 6;
          int filteredpixelValue = predvalue + offset;
          dst[stride * r_pos + c_pos] =
              clip_pixel_highbd(filteredpixelValue, bd);
        }
      }  // End of the subblock
      memcpy(
          &ref_samples_sb_col[1], &top_ref_tmp_for_next_sb[0],
          (num_top_ref - 1) *
              sizeof(uint16_t));  // copy top reference for the next sub-block
    }
  }
}
