/*
 * Copyright (c) 2022, Alliance for Open Media. All rights reserved.
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. 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 www.aomedia.org/license/patent.
 */

#include <arm_neon.h>

#include "config/aom_config.h"
#include "config/av1_rtcd.h"
#include "av1/encoder/encoder.h"
#include "av1/encoder/temporal_filter.h"
#include "aom_dsp/mathutils.h"
#include "aom_dsp/arm/mem_neon.h"
#include "aom_dsp/arm/sum_neon.h"

// For the squared error buffer, add padding for 4 samples.
#define SSE_STRIDE (BW + 4)

// When using vld1q_u16_x4 compilers may insert an alignment hint of 256 bits.
DECLARE_ALIGNED(32, static const uint16_t, kSlidingWindowMask[]) = {
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000,
  0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000,
  0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000,
  0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
};

static INLINE void get_squared_error(
    const uint8_t *frame1, const uint32_t stride1, const uint8_t *frame2,
    const uint32_t stride2, const uint32_t block_width,
    const uint32_t block_height, uint16_t *frame_sse,
    const unsigned int dst_stride) {
  uint16_t *dst = frame_sse;

  uint32_t i = 0;
  do {
    uint32_t j = 0;
    do {
      uint8x16_t s = vld1q_u8(frame1 + i * stride1 + j);
      uint8x16_t r = vld1q_u8(frame2 + i * stride2 + j);

      uint8x16_t abs_diff = vabdq_u8(s, r);
      uint16x8_t sse_lo =
          vmull_u8(vget_low_u8(abs_diff), vget_low_u8(abs_diff));
      uint16x8_t sse_hi =
          vmull_u8(vget_high_u8(abs_diff), vget_high_u8(abs_diff));

      vst1q_u16(dst + j + 2, sse_lo);
      vst1q_u16(dst + j + 10, sse_hi);

      j += 16;
    } while (j < block_width);

    dst += dst_stride;
  } while (++i < block_height);
}

static INLINE uint16x8_t load_and_pad(const uint16_t *src, const uint32_t col,
                                      const uint32_t block_width) {
  uint16x8_t s = vld1q_u16(src);

  if (col == 0) {
    const uint16_t lane2 = vgetq_lane_u16(s, 2);
    s = vsetq_lane_u16(lane2, s, 0);
    s = vsetq_lane_u16(lane2, s, 1);
  } else if (col >= block_width - 4) {
    const uint16_t lane5 = vgetq_lane_u16(s, 5);
    s = vsetq_lane_u16(lane5, s, 6);
    s = vsetq_lane_u16(lane5, s, 7);
  }
  return s;
}

static void apply_temporal_filter(
    const uint8_t *frame, const unsigned int stride, const uint32_t block_width,
    const uint32_t block_height, const int *subblock_mses,
    unsigned int *accumulator, uint16_t *count, const uint16_t *frame_sse,
    const uint32_t *luma_sse_sum, const double inv_num_ref_pixels,
    const double decay_factor, const double inv_factor,
    const double weight_factor, const double *d_factor, int tf_wgt_calc_lvl) {
  assert(((block_width == 16) || (block_width == 32)) &&
         ((block_height == 16) || (block_height == 32)));

  uint32_t acc_5x5_neon[BH][BW];
  const uint16x8x4_t vmask = vld1q_u16_x4(kSlidingWindowMask);

  // Traverse 4 columns at a time - first and last two columns need padding.
  for (uint32_t col = 0; col < block_width; col += 4) {
    uint16x8_t vsrc[5];
    const uint16_t *src = frame_sse + col;

    // Load and pad (for first and last two columns) 3 rows from the top.
    for (int i = 2; i < 5; i++) {
      vsrc[i] = load_and_pad(src, col, block_width);
      src += SSE_STRIDE;
    }

    // Pad the top 2 rows.
    vsrc[0] = vsrc[2];
    vsrc[1] = vsrc[2];

    for (unsigned int row = 0; row < block_height; row++) {
      for (int i = 0; i < 4; i++) {
        uint32x4_t vsum = vdupq_n_u32(0);
        for (int j = 0; j < 5; j++) {
          vsum = vpadalq_u16(vsum, vandq_u16(vsrc[j], vmask.val[i]));
        }
        acc_5x5_neon[row][col + i] = horizontal_add_u32x4(vsum);
      }

      // Push all rows in the sliding window up one.
      for (int i = 0; i < 4; i++) {
        vsrc[i] = vsrc[i + 1];
      }

      if (row <= block_height - 4) {
        // Load next row into the bottom of the sliding window.
        vsrc[4] = load_and_pad(src, col, block_width);
        src += SSE_STRIDE;
      } else {
        // Pad the bottom 2 rows.
        vsrc[4] = vsrc[3];
      }
    }
  }

  // Perform filtering.
  if (tf_wgt_calc_lvl == 0) {
    for (unsigned int i = 0, k = 0; i < block_height; i++) {
      for (unsigned int j = 0; j < block_width; j++, k++) {
        const int pixel_value = frame[i * stride + j];
        const uint32_t diff_sse = acc_5x5_neon[i][j] + luma_sse_sum[i * BW + j];

        const double window_error = diff_sse * inv_num_ref_pixels;
        const int subblock_idx =
            (i >= block_height / 2) * 2 + (j >= block_width / 2);
        const double block_error = (double)subblock_mses[subblock_idx];
        const double combined_error =
            weight_factor * window_error + block_error * inv_factor;
        // Compute filter weight.
        double scaled_error =
            combined_error * d_factor[subblock_idx] * decay_factor;
        scaled_error = AOMMIN(scaled_error, 7);
        const int weight = (int)(exp(-scaled_error) * TF_WEIGHT_SCALE);
        accumulator[k] += weight * pixel_value;
        count[k] += weight;
      }
    }
  } else {
    for (unsigned int i = 0, k = 0; i < block_height; i++) {
      for (unsigned int j = 0; j < block_width; j++, k++) {
        const int pixel_value = frame[i * stride + j];
        const uint32_t diff_sse = acc_5x5_neon[i][j] + luma_sse_sum[i * BW + j];

        const double window_error = diff_sse * inv_num_ref_pixels;
        const int subblock_idx =
            (i >= block_height / 2) * 2 + (j >= block_width / 2);
        const double block_error = (double)subblock_mses[subblock_idx];
        const double combined_error =
            weight_factor * window_error + block_error * inv_factor;
        // Compute filter weight.
        double scaled_error =
            combined_error * d_factor[subblock_idx] * decay_factor;
        scaled_error = AOMMIN(scaled_error, 7);
        const float fweight =
            approx_exp((float)-scaled_error) * TF_WEIGHT_SCALE;
        const int weight = iroundpf(fweight);
        accumulator[k] += weight * pixel_value;
        count[k] += weight;
      }
    }
  }
}

void av1_apply_temporal_filter_neon(
    const YV12_BUFFER_CONFIG *frame_to_filter, const MACROBLOCKD *mbd,
    const BLOCK_SIZE block_size, const int mb_row, const int mb_col,
    const int num_planes, const double *noise_levels, const MV *subblock_mvs,
    const int *subblock_mses, const int q_factor, const int filter_strength,
    int tf_wgt_calc_lvl, const uint8_t *pred, uint32_t *accum,
    uint16_t *count) {
  const int is_high_bitdepth = frame_to_filter->flags & YV12_FLAG_HIGHBITDEPTH;
  assert(block_size == BLOCK_32X32 && "Only support 32x32 block with Neon!");
  assert(TF_WINDOW_LENGTH == 5 && "Only support window length 5 with Neon!");
  assert(!is_high_bitdepth && "Only support low bit-depth with Neon!");
  assert(num_planes >= 1 && num_planes <= MAX_MB_PLANE);
  (void)is_high_bitdepth;

  // Block information.
  const int mb_height = block_size_high[block_size];
  const int mb_width = block_size_wide[block_size];
  // Frame information.
  const int frame_height = frame_to_filter->y_crop_height;
  const int frame_width = frame_to_filter->y_crop_width;
  const int min_frame_size = AOMMIN(frame_height, frame_width);
  // Variables to simplify combined error calculation.
  const double inv_factor = 1.0 / ((TF_WINDOW_BLOCK_BALANCE_WEIGHT + 1) *
                                   TF_SEARCH_ERROR_NORM_WEIGHT);
  const double weight_factor =
      (double)TF_WINDOW_BLOCK_BALANCE_WEIGHT * inv_factor;
  // Adjust filtering based on q.
  // Larger q -> stronger filtering -> larger weight.
  // Smaller q -> weaker filtering -> smaller weight.
  double q_decay = pow((double)q_factor / TF_Q_DECAY_THRESHOLD, 2);
  q_decay = CLIP(q_decay, 1e-5, 1);
  if (q_factor >= TF_QINDEX_CUTOFF) {
    // Max q_factor is 255, therefore the upper bound of q_decay is 8.
    // We do not need a clip here.
    q_decay = 0.5 * pow((double)q_factor / 64, 2);
  }
  // Smaller strength -> smaller filtering weight.
  double s_decay = pow((double)filter_strength / TF_STRENGTH_THRESHOLD, 2);
  s_decay = CLIP(s_decay, 1e-5, 1);
  double d_factor[4] = { 0 };
  uint16_t frame_sse[SSE_STRIDE * BH] = { 0 };
  uint32_t luma_sse_sum[BW * BH] = { 0 };

  for (int subblock_idx = 0; subblock_idx < 4; subblock_idx++) {
    // Larger motion vector -> smaller filtering weight.
    const MV mv = subblock_mvs[subblock_idx];
    const double distance = sqrt(pow(mv.row, 2) + pow(mv.col, 2));
    double distance_threshold = min_frame_size * TF_SEARCH_DISTANCE_THRESHOLD;
    distance_threshold = AOMMAX(distance_threshold, 1);
    d_factor[subblock_idx] = distance / distance_threshold;
    d_factor[subblock_idx] = AOMMAX(d_factor[subblock_idx], 1);
  }

  // Handle planes in sequence.
  int plane_offset = 0;
  for (int plane = 0; plane < num_planes; ++plane) {
    const uint32_t plane_h = mb_height >> mbd->plane[plane].subsampling_y;
    const uint32_t plane_w = mb_width >> mbd->plane[plane].subsampling_x;
    const uint32_t frame_stride =
        frame_to_filter->strides[plane == AOM_PLANE_Y ? 0 : 1];
    const int frame_offset = mb_row * plane_h * frame_stride + mb_col * plane_w;

    const uint8_t *ref = frame_to_filter->buffers[plane] + frame_offset;
    const int ss_x_shift =
        mbd->plane[plane].subsampling_x - mbd->plane[AOM_PLANE_Y].subsampling_x;
    const int ss_y_shift =
        mbd->plane[plane].subsampling_y - mbd->plane[AOM_PLANE_Y].subsampling_y;
    const int num_ref_pixels = TF_WINDOW_LENGTH * TF_WINDOW_LENGTH +
                               ((plane) ? (1 << (ss_x_shift + ss_y_shift)) : 0);
    const double inv_num_ref_pixels = 1.0 / num_ref_pixels;
    // Larger noise -> larger filtering weight.
    const double n_decay = 0.5 + log(2 * noise_levels[plane] + 5.0);
    // Decay factors for non-local mean approach.
    const double decay_factor = 1 / (n_decay * q_decay * s_decay);

    // Filter U-plane and V-plane using Y-plane. This is because motion
    // search is only done on Y-plane, so the information from Y-plane
    // will be more accurate. The luma sse sum is reused in both chroma
    // planes.
    if (plane == AOM_PLANE_U) {
      for (unsigned int i = 0; i < plane_h; i++) {
        for (unsigned int j = 0; j < plane_w; j++) {
          for (int ii = 0; ii < (1 << ss_y_shift); ++ii) {
            for (int jj = 0; jj < (1 << ss_x_shift); ++jj) {
              const int yy = (i << ss_y_shift) + ii;  // Y-coord on Y-plane.
              const int xx = (j << ss_x_shift) + jj;  // X-coord on Y-plane.
              luma_sse_sum[i * BW + j] += frame_sse[yy * SSE_STRIDE + xx + 2];
            }
          }
        }
      }
    }

    get_squared_error(ref, frame_stride, pred + plane_offset, plane_w, plane_w,
                      plane_h, frame_sse, SSE_STRIDE);

    apply_temporal_filter(pred + plane_offset, plane_w, plane_w, plane_h,
                          subblock_mses, accum + plane_offset,
                          count + plane_offset, frame_sse, luma_sse_sum,
                          inv_num_ref_pixels, decay_factor, inv_factor,
                          weight_factor, d_factor, tf_wgt_calc_lvl);

    plane_offset += plane_h * plane_w;
  }
}

// TODO(aomedia:349450845): enable for armv7 after SIGBUS is fixed.
#if AOM_ARCH_AARCH64
double av1_estimate_noise_from_single_plane_neon(const uint8_t *src, int height,
                                                 int width, int stride,
                                                 int edge_thresh) {
  uint16x8_t thresh = vdupq_n_u16(edge_thresh);
  uint32x4_t acc = vdupq_n_u32(0);
  // Count is in theory positive as it counts the number of times we're under
  // the threshold, but it will be counted negatively in order to make best use
  // of the vclt instruction, which sets every bit of a lane to 1 when the
  // condition is true.
  int32x4_t count = vdupq_n_s32(0);
  int final_count = 0;
  int64_t final_acc = 0;
  const uint8_t *src_start = src + stride + 1;
  int h = 1;

  do {
    int w = 1;
    const uint8_t *src_ptr = src_start;

    while (w <= (width - 1) - 16) {
      uint8x16_t mat[3][3];
      mat[0][0] = vld1q_u8(src_ptr - stride - 1);
      mat[0][1] = vld1q_u8(src_ptr - stride);
      mat[0][2] = vld1q_u8(src_ptr - stride + 1);
      mat[1][0] = vld1q_u8(src_ptr - 1);
      mat[1][1] = vld1q_u8(src_ptr);
      mat[1][2] = vld1q_u8(src_ptr + 1);
      mat[2][0] = vld1q_u8(src_ptr + stride - 1);
      mat[2][1] = vld1q_u8(src_ptr + stride);
      mat[2][2] = vld1q_u8(src_ptr + stride + 1);

      // Compute Sobel gradients.
      uint16x8_t gxa_lo =
          vaddl_u8(vget_low_u8(mat[0][0]), vget_low_u8(mat[2][0]));
      uint16x8_t gxa_hi =
          vaddl_u8(vget_high_u8(mat[0][0]), vget_high_u8(mat[2][0]));
      uint16x8_t gxb_lo =
          vaddl_u8(vget_low_u8(mat[0][2]), vget_low_u8(mat[2][2]));
      uint16x8_t gxb_hi =
          vaddl_u8(vget_high_u8(mat[0][2]), vget_high_u8(mat[2][2]));
      gxa_lo = vaddq_u16(
          gxa_lo, vaddl_u8(vget_low_u8(mat[1][0]), vget_low_u8(mat[1][0])));
      gxa_hi = vaddq_u16(
          gxa_hi, vaddl_u8(vget_high_u8(mat[1][0]), vget_high_u8(mat[1][0])));
      gxb_lo = vaddq_u16(
          gxb_lo, vaddl_u8(vget_low_u8(mat[1][2]), vget_low_u8(mat[1][2])));
      gxb_hi = vaddq_u16(
          gxb_hi, vaddl_u8(vget_high_u8(mat[1][2]), vget_high_u8(mat[1][2])));

      uint16x8_t gya_lo =
          vaddl_u8(vget_low_u8(mat[0][0]), vget_low_u8(mat[0][2]));
      uint16x8_t gya_hi =
          vaddl_u8(vget_high_u8(mat[0][0]), vget_high_u8(mat[0][2]));
      uint16x8_t gyb_lo =
          vaddl_u8(vget_low_u8(mat[2][0]), vget_low_u8(mat[2][2]));
      uint16x8_t gyb_hi =
          vaddl_u8(vget_high_u8(mat[2][0]), vget_high_u8(mat[2][2]));
      gya_lo = vaddq_u16(
          gya_lo, vaddl_u8(vget_low_u8(mat[0][1]), vget_low_u8(mat[0][1])));
      gya_hi = vaddq_u16(
          gya_hi, vaddl_u8(vget_high_u8(mat[0][1]), vget_high_u8(mat[0][1])));
      gyb_lo = vaddq_u16(
          gyb_lo, vaddl_u8(vget_low_u8(mat[2][1]), vget_low_u8(mat[2][1])));
      gyb_hi = vaddq_u16(
          gyb_hi, vaddl_u8(vget_high_u8(mat[2][1]), vget_high_u8(mat[2][1])));

      uint16x8_t ga_lo = vabaq_u16(vabdq_u16(gxa_lo, gxb_lo), gya_lo, gyb_lo);
      uint16x8_t ga_hi = vabaq_u16(vabdq_u16(gxa_hi, gxb_hi), gya_hi, gyb_hi);

      // Check which vector elements are under the threshold. The Laplacian is
      // then unconditionally computed and we accumulate zeros if we're not
      // under the threshold. This is much faster than using an if statement.
      uint16x8_t thresh_u16_lo = vcltq_u16(ga_lo, thresh);
      uint16x8_t thresh_u16_hi = vcltq_u16(ga_hi, thresh);

      uint16x8_t center_lo = vshll_n_u8(vget_low_u8(mat[1][1]), 2);
      uint16x8_t center_hi = vshll_n_u8(vget_high_u8(mat[1][1]), 2);

      uint16x8_t adj0_lo =
          vaddl_u8(vget_low_u8(mat[0][1]), vget_low_u8(mat[2][1]));
      uint16x8_t adj0_hi =
          vaddl_u8(vget_high_u8(mat[0][1]), vget_high_u8(mat[2][1]));
      uint16x8_t adj1_lo =
          vaddl_u8(vget_low_u8(mat[1][0]), vget_low_u8(mat[1][2]));
      uint16x8_t adj1_hi =
          vaddl_u8(vget_high_u8(mat[1][0]), vget_high_u8(mat[1][2]));
      uint16x8_t adj_lo = vaddq_u16(adj0_lo, adj1_lo);
      adj_lo = vaddq_u16(adj_lo, adj_lo);
      uint16x8_t adj_hi = vaddq_u16(adj0_hi, adj1_hi);
      adj_hi = vaddq_u16(adj_hi, adj_hi);

      uint16x8_t diag0_lo =
          vaddl_u8(vget_low_u8(mat[0][0]), vget_low_u8(mat[0][2]));
      uint16x8_t diag0_hi =
          vaddl_u8(vget_high_u8(mat[0][0]), vget_high_u8(mat[0][2]));
      uint16x8_t diag1_lo =
          vaddl_u8(vget_low_u8(mat[2][0]), vget_low_u8(mat[2][2]));
      uint16x8_t diag1_hi =
          vaddl_u8(vget_high_u8(mat[2][0]), vget_high_u8(mat[2][2]));
      uint16x8_t diag_lo = vaddq_u16(diag0_lo, diag1_lo);
      uint16x8_t diag_hi = vaddq_u16(diag0_hi, diag1_hi);

      uint16x8_t v_lo = vaddq_u16(center_lo, diag_lo);
      v_lo = vabdq_u16(v_lo, adj_lo);
      uint16x8_t v_hi = vaddq_u16(center_hi, diag_hi);
      v_hi = vabdq_u16(v_hi, adj_hi);

      acc = vpadalq_u16(acc, vandq_u16(v_lo, thresh_u16_lo));
      acc = vpadalq_u16(acc, vandq_u16(v_hi, thresh_u16_hi));

      // Add -1 for each lane where the gradient is under the threshold.
      count = vpadalq_s16(count, vreinterpretq_s16_u16(thresh_u16_lo));
      count = vpadalq_s16(count, vreinterpretq_s16_u16(thresh_u16_hi));

      w += 16;
      src_ptr += 16;
    }

    if (w <= (width - 1) - 8) {
      uint8x8_t mat[3][3];
      mat[0][0] = vld1_u8(src_ptr - stride - 1);
      mat[0][1] = vld1_u8(src_ptr - stride);
      mat[0][2] = vld1_u8(src_ptr - stride + 1);
      mat[1][0] = vld1_u8(src_ptr - 1);
      mat[1][1] = vld1_u8(src_ptr);
      mat[1][2] = vld1_u8(src_ptr + 1);
      mat[2][0] = vld1_u8(src_ptr + stride - 1);
      mat[2][1] = vld1_u8(src_ptr + stride);
      mat[2][2] = vld1_u8(src_ptr + stride + 1);

      // Compute Sobel gradients.
      uint16x8_t gxa = vaddl_u8(mat[0][0], mat[2][0]);
      uint16x8_t gxb = vaddl_u8(mat[0][2], mat[2][2]);
      gxa = vaddq_u16(gxa, vaddl_u8(mat[1][0], mat[1][0]));
      gxb = vaddq_u16(gxb, vaddl_u8(mat[1][2], mat[1][2]));

      uint16x8_t gya = vaddl_u8(mat[0][0], mat[0][2]);
      uint16x8_t gyb = vaddl_u8(mat[2][0], mat[2][2]);
      gya = vaddq_u16(gya, vaddl_u8(mat[0][1], mat[0][1]));
      gyb = vaddq_u16(gyb, vaddl_u8(mat[2][1], mat[2][1]));

      uint16x8_t ga = vabaq_u16(vabdq_u16(gxa, gxb), gya, gyb);

      // Check which vector elements are under the threshold. The Laplacian is
      // then unconditionally computed and we accumulate zeros if we're not
      // under the threshold. This is much faster than using an if statement.
      uint16x8_t thresh_u16 = vcltq_u16(ga, thresh);

      uint16x8_t center = vshll_n_u8(mat[1][1], 2);

      uint16x8_t adj0 = vaddl_u8(mat[0][1], mat[2][1]);
      uint16x8_t adj1 = vaddl_u8(mat[1][0], mat[1][2]);
      uint16x8_t adj = vaddq_u16(adj0, adj1);
      adj = vaddq_u16(adj, adj);

      uint16x8_t diag0 = vaddl_u8(mat[0][0], mat[0][2]);
      uint16x8_t diag1 = vaddl_u8(mat[2][0], mat[2][2]);
      uint16x8_t diag = vaddq_u16(diag0, diag1);

      uint16x8_t v = vaddq_u16(center, diag);
      v = vabdq_u16(v, adj);

      acc = vpadalq_u16(acc, vandq_u16(v, thresh_u16));
      // Add -1 for each lane where the gradient is under the threshold.
      count = vpadalq_s16(count, vreinterpretq_s16_u16(thresh_u16));

      w += 8;
      src_ptr += 8;
    }

    if (w <= (width - 1) - 4) {
      uint16x8_t mask = vcombine_u16(vdup_n_u16(65535), vdup_n_u16(0));
      uint8x8_t mat[3][3];
      mat[0][0] = load_u8_4x1(src_ptr - stride - 1);
      mat[0][1] = load_u8_4x1(src_ptr - stride);
      mat[0][2] = load_u8_4x1(src_ptr - stride + 1);
      mat[1][0] = load_u8_4x1(src_ptr - 1);
      mat[1][1] = load_u8_4x1(src_ptr);
      mat[1][2] = load_u8_4x1(src_ptr + 1);
      mat[2][0] = load_u8_4x1(src_ptr + stride - 1);
      mat[2][1] = load_u8_4x1(src_ptr + stride);
      mat[2][2] = load_u8_4x1(src_ptr + stride + 1);

      // Compute Sobel gradients.
      uint16x8_t gxa = vaddl_u8(mat[0][0], mat[2][0]);
      uint16x8_t gxb = vaddl_u8(mat[0][2], mat[2][2]);
      gxa = vaddq_u16(gxa, vaddl_u8(mat[1][0], mat[1][0]));
      gxb = vaddq_u16(gxb, vaddl_u8(mat[1][2], mat[1][2]));

      uint16x8_t gya = vaddl_u8(mat[0][0], mat[0][2]);
      uint16x8_t gyb = vaddl_u8(mat[2][0], mat[2][2]);
      gya = vaddq_u16(gya, vaddl_u8(mat[0][1], mat[0][1]));
      gyb = vaddq_u16(gyb, vaddl_u8(mat[2][1], mat[2][1]));

      uint16x8_t ga = vabaq_u16(vabdq_u16(gxa, gxb), gya, gyb);

      // Check which vector elements are under the threshold. The Laplacian is
      // then unconditionally computed and we accumulate zeros if we're not
      // under the threshold. This is much faster than using an if statement.
      uint16x8_t thresh_u16 = vandq_u16(vcltq_u16(ga, thresh), mask);

      uint16x8_t center = vshll_n_u8(mat[1][1], 2);

      uint16x8_t adj0 = vaddl_u8(mat[0][1], mat[2][1]);
      uint16x8_t adj1 = vaddl_u8(mat[1][0], mat[1][2]);
      uint16x8_t adj = vaddq_u16(adj0, adj1);
      adj = vaddq_u16(adj, adj);

      uint16x8_t diag0 = vaddl_u8(mat[0][0], mat[0][2]);
      uint16x8_t diag1 = vaddl_u8(mat[2][0], mat[2][2]);
      uint16x8_t diag = vaddq_u16(diag0, diag1);

      uint16x8_t v = vaddq_u16(center, diag);
      v = vabdq_u16(v, adj);

      acc = vpadalq_u16(acc, vandq_u16(v, thresh_u16));
      // Add -1 for each lane where the gradient is under the threshold.
      count = vpadalq_s16(count, vreinterpretq_s16_u16(thresh_u16));

      w += 4;
      src_ptr += 4;
    }

    while (w < width - 1) {
      int mat[3][3];
      mat[0][0] = *(src_ptr - stride - 1);
      mat[0][1] = *(src_ptr - stride);
      mat[0][2] = *(src_ptr - stride + 1);
      mat[1][0] = *(src_ptr - 1);
      mat[1][1] = *(src_ptr);
      mat[1][2] = *(src_ptr + 1);
      mat[2][0] = *(src_ptr + stride - 1);
      mat[2][1] = *(src_ptr + stride);
      mat[2][2] = *(src_ptr + stride + 1);

      // Compute Sobel gradients.
      const int gx = (mat[0][0] - mat[0][2]) + (mat[2][0] - mat[2][2]) +
                     2 * (mat[1][0] - mat[1][2]);
      const int gy = (mat[0][0] - mat[2][0]) + (mat[0][2] - mat[2][2]) +
                     2 * (mat[0][1] - mat[2][1]);
      const int ga = abs(gx) + abs(gy);

      // Accumulate Laplacian.
      const int is_under = ga < edge_thresh;
      const int v = 4 * mat[1][1] -
                    2 * (mat[0][1] + mat[2][1] + mat[1][0] + mat[1][2]) +
                    (mat[0][0] + mat[0][2] + mat[2][0] + mat[2][2]);
      final_acc += abs(v) * is_under;
      final_count += is_under;

      src_ptr++;
      w++;
    }
    src_start += stride;
  } while (++h < height - 1);

  // We counted negatively, so subtract to get the final value.
  final_count -= horizontal_add_s32x4(count);
  final_acc += horizontal_long_add_u32x4(acc);
  return (final_count < 16)
             ? -1.0
             : (double)final_acc / (6 * final_count) * SQRT_PI_BY_2;
}
#endif  // AOM_ARCH_AARCH64
