/*
 * 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 <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <assert.h>
#include <stdbool.h>

#include "config/av1_rtcd.h"

#include "av1/common/warped_motion.h"
#include "av1/common/scale.h"
#include "av1/common/mvref_common.h"

// For warping, we use 8/6/4/2-tap filters, but we do blocks of 8 pixels
// at a time. The zoom/rotation/shear in the model are applied to the
// "fractional" position of each pixel, which therefore varies within
// [-3, 4) * WARPEDPIXEL_PREC_SHIFTS.
// We need an extra 2-6 taps to fit this in, for a total of 8 taps.
/* clang-format off */
const int16_t av1_warped_filter[WARPEDPIXEL_PREC_SHIFTS * 7 + 1][8] = {
#if WARPEDPIXEL_PREC_BITS == 6
  // [-3, -2)
  { 127,   1, 0, 0, 0, 0, 0, 0 }, { 126,   2, 0, 0, 0, 0, 0, 0 },
  { 124,   4, 0, 0, 0, 0, 0, 0 }, { 122,   6, 0, 0, 0, 0, 0, 0 },
  { 120,   8, 0, 0, 0, 0, 0, 0 }, { 118,  10, 0, 0, 0, 0, 0, 0 },
  { 116,  12, 0, 0, 0, 0, 0, 0 }, { 114,  14, 0, 0, 0, 0, 0, 0 },
  { 112,  16, 0, 0, 0, 0, 0, 0 }, { 110,  18, 0, 0, 0, 0, 0, 0 },
  { 108,  20, 0, 0, 0, 0, 0, 0 }, { 106,  22, 0, 0, 0, 0, 0, 0 },
  { 104,  24, 0, 0, 0, 0, 0, 0 }, { 102,  26, 0, 0, 0, 0, 0, 0 },
  { 100,  28, 0, 0, 0, 0, 0, 0 }, {  98,  30, 0, 0, 0, 0, 0, 0 },
  {  96,  32, 0, 0, 0, 0, 0, 0 }, {  94,  34, 0, 0, 0, 0, 0, 0 },
  {  92,  36, 0, 0, 0, 0, 0, 0 }, {  90,  38, 0, 0, 0, 0, 0, 0 },
  {  88,  40, 0, 0, 0, 0, 0, 0 }, {  86,  42, 0, 0, 0, 0, 0, 0 },
  {  84,  44, 0, 0, 0, 0, 0, 0 }, {  82,  46, 0, 0, 0, 0, 0, 0 },
  {  80,  48, 0, 0, 0, 0, 0, 0 }, {  78,  50, 0, 0, 0, 0, 0, 0 },
  {  76,  52, 0, 0, 0, 0, 0, 0 }, {  74,  54, 0, 0, 0, 0, 0, 0 },
  {  72,  56, 0, 0, 0, 0, 0, 0 }, {  70,  58, 0, 0, 0, 0, 0, 0 },
  {  68,  60, 0, 0, 0, 0, 0, 0 }, {  66,  62, 0, 0, 0, 0, 0, 0 },
  {  64,  64, 0, 0, 0, 0, 0, 0 }, {  62,  66, 0, 0, 0, 0, 0, 0 },
  {  60,  68, 0, 0, 0, 0, 0, 0 }, {  58,  70, 0, 0, 0, 0, 0, 0 },
  {  56,  72, 0, 0, 0, 0, 0, 0 }, {  54,  74, 0, 0, 0, 0, 0, 0 },
  {  52,  76, 0, 0, 0, 0, 0, 0 }, {  50,  78, 0, 0, 0, 0, 0, 0 },
  {  48,  80, 0, 0, 0, 0, 0, 0 }, {  46,  82, 0, 0, 0, 0, 0, 0 },
  {  44,  84, 0, 0, 0, 0, 0, 0 }, {  42,  86, 0, 0, 0, 0, 0, 0 },
  {  40,  88, 0, 0, 0, 0, 0, 0 }, {  38,  90, 0, 0, 0, 0, 0, 0 },
  {  36,  92, 0, 0, 0, 0, 0, 0 }, {  34,  94, 0, 0, 0, 0, 0, 0 },
  {  32,  96, 0, 0, 0, 0, 0, 0 }, {  30,  98, 0, 0, 0, 0, 0, 0 },
  {  28, 100, 0, 0, 0, 0, 0, 0 }, {  26, 102, 0, 0, 0, 0, 0, 0 },
  {  24, 104, 0, 0, 0, 0, 0, 0 }, {  22, 106, 0, 0, 0, 0, 0, 0 },
  {  20, 108, 0, 0, 0, 0, 0, 0 }, {  18, 110, 0, 0, 0, 0, 0, 0 },
  {  16, 112, 0, 0, 0, 0, 0, 0 }, {  14, 114, 0, 0, 0, 0, 0, 0 },
  {  12, 116, 0, 0, 0, 0, 0, 0 }, {  10, 118, 0, 0, 0, 0, 0, 0 },
  {   8, 120, 0, 0, 0, 0, 0, 0 }, {   6, 122, 0, 0, 0, 0, 0, 0 },
  {   4, 124, 0, 0, 0, 0, 0, 0 }, {   2, 126, 0, 0, 0, 0, 0, 0 },

  // [-2, -1)
  {   0, 127,   1,   0, 0, 0, 0, 0 }, { - 1, 127,   2,   0, 0, 0, 0, 0 },
  { - 2, 127,   4,  -1, 0, 0, 0, 0 }, { - 3, 126,   6, - 1, 0, 0, 0, 0 },
  { - 3, 125,   8,  -2, 0, 0, 0, 0 }, { - 4, 124,  11, - 3, 0, 0, 0, 0 },
  { - 5, 123,  13,  -3, 0, 0, 0, 0 }, { - 5, 121,  15, - 3, 0, 0, 0, 0 },
  { - 6, 120,  18,  -4, 0, 0, 0, 0 }, { - 7, 119,  20, - 4, 0, 0, 0, 0 },
  { - 7, 118,  22,  -5, 0, 0, 0, 0 }, { - 8, 116,  25, - 5, 0, 0, 0, 0 },
  { - 8, 115,  27,  -6, 0, 0, 0, 0 }, { - 9, 113,  30, - 6, 0, 0, 0, 0 },
  { - 9, 112,  32,  -7, 0, 0, 0, 0 }, { - 9, 110,  34, - 7, 0, 0, 0, 0 },
  { -10, 108,  37,  -7, 0, 0, 0, 0 }, { -10, 107,  39, - 8, 0, 0, 0, 0 },
  { -10, 105,  41,  -8, 0, 0, 0, 0 }, { -11, 103,  44, - 8, 0, 0, 0, 0 },
  { -11, 101,  47,  -9, 0, 0, 0, 0 }, { -11,  99,  49, - 9, 0, 0, 0, 0 },
  { -11,  97,  51,  -9, 0, 0, 0, 0 }, { -11,  95,  54, -10, 0, 0, 0, 0 },
  { -11,  93,  56, -10, 0, 0, 0, 0 }, { -12,  91,  59, -10, 0, 0, 0, 0 },
  { -12,  89,  61, -10, 0, 0, 0, 0 }, { -12,  87,  64, -11, 0, 0, 0, 0 },
  { -12,  85,  66, -11, 0, 0, 0, 0 }, { -12,  82,  69, -11, 0, 0, 0, 0 },
  { -12,  80,  71, -11, 0, 0, 0, 0 }, { -12,  78,  73, -11, 0, 0, 0, 0 },
  { -11,  75,  75, -11, 0, 0, 0, 0 }, { -11,  73,  78, -12, 0, 0, 0, 0 },
  { -11,  71,  80, -12, 0, 0, 0, 0 }, { -11,  69,  82, -12, 0, 0, 0, 0 },
  { -11,  66,  85, -12, 0, 0, 0, 0 }, { -11,  64,  87, -12, 0, 0, 0, 0 },
  { -10,  61,  89, -12, 0, 0, 0, 0 }, { -10,  59,  91, -12, 0, 0, 0, 0 },
  { -10,  56,  93, -11, 0, 0, 0, 0 }, { -10,  54,  95, -11, 0, 0, 0, 0 },
  { - 9,  51,  97, -11, 0, 0, 0, 0 }, { - 9,  49,  99, -11, 0, 0, 0, 0 },
  { - 9,  47, 101, -11, 0, 0, 0, 0 }, { - 8,  44, 103, -11, 0, 0, 0, 0 },
  { - 8,  41, 105, -10, 0, 0, 0, 0 }, { - 8,  39, 107, -10, 0, 0, 0, 0 },
  { - 7,  37, 108, -10, 0, 0, 0, 0 }, { - 7,  34, 110, - 9, 0, 0, 0, 0 },
  { - 7,  32, 112, - 9, 0, 0, 0, 0 }, { - 6,  30, 113, - 9, 0, 0, 0, 0 },
  { - 6,  27, 115, - 8, 0, 0, 0, 0 }, { - 5,  25, 116, - 8, 0, 0, 0, 0 },
  { - 5,  22, 118, - 7, 0, 0, 0, 0 }, { - 4,  20, 119, - 7, 0, 0, 0, 0 },
  { - 4,  18, 120, - 6, 0, 0, 0, 0 }, { - 3,  15, 121, - 5, 0, 0, 0, 0 },
  { - 3,  13, 123, - 5, 0, 0, 0, 0 }, { - 3,  11, 124, - 4, 0, 0, 0, 0 },
  { - 2,   8, 125, - 3, 0, 0, 0, 0 }, { - 1,   6, 126, - 3, 0, 0, 0, 0 },
  { - 1,   4, 127, - 2, 0, 0, 0, 0 }, {   0,   2, 127, - 1, 0, 0, 0, 0 },
  // [-1, 0)
  { 0,   0, 127,   1,   0, 0, 0, 0 }, { 0, - 1, 127,   2,   0, 0, 0, 0 },
  { 1, - 3, 127,   4, - 1, 0, 0, 0 }, { 1, - 4, 126,   6, - 2, 1, 0, 0 },
  { 1, - 5, 126,   8, - 3, 1, 0, 0 }, { 1, - 6, 125,  11, - 4, 1, 0, 0 },
  { 1, - 7, 124,  13, - 4, 1, 0, 0 }, { 2, - 8, 123,  15, - 5, 1, 0, 0 },
  { 2, - 9, 122,  18, - 6, 1, 0, 0 }, { 2, -10, 121,  20, - 6, 1, 0, 0 },
  { 2, -11, 120,  22, - 7, 2, 0, 0 }, { 2, -12, 119,  25, - 8, 2, 0, 0 },
  { 3, -13, 117,  27, - 8, 2, 0, 0 }, { 3, -13, 116,  29, - 9, 2, 0, 0 },
  { 3, -14, 114,  32, -10, 3, 0, 0 }, { 3, -15, 113,  35, -10, 2, 0, 0 },
  { 3, -15, 111,  37, -11, 3, 0, 0 }, { 3, -16, 109,  40, -11, 3, 0, 0 },
  { 3, -16, 108,  42, -12, 3, 0, 0 }, { 4, -17, 106,  45, -13, 3, 0, 0 },
  { 4, -17, 104,  47, -13, 3, 0, 0 }, { 4, -17, 102,  50, -14, 3, 0, 0 },
  { 4, -17, 100,  52, -14, 3, 0, 0 }, { 4, -18,  98,  55, -15, 4, 0, 0 },
  { 4, -18,  96,  58, -15, 3, 0, 0 }, { 4, -18,  94,  60, -16, 4, 0, 0 },
  { 4, -18,  91,  63, -16, 4, 0, 0 }, { 4, -18,  89,  65, -16, 4, 0, 0 },
  { 4, -18,  87,  68, -17, 4, 0, 0 }, { 4, -18,  85,  70, -17, 4, 0, 0 },
  { 4, -18,  82,  73, -17, 4, 0, 0 }, { 4, -18,  80,  75, -17, 4, 0, 0 },
  { 4, -18,  78,  78, -18, 4, 0, 0 }, { 4, -17,  75,  80, -18, 4, 0, 0 },
  { 4, -17,  73,  82, -18, 4, 0, 0 }, { 4, -17,  70,  85, -18, 4, 0, 0 },
  { 4, -17,  68,  87, -18, 4, 0, 0 }, { 4, -16,  65,  89, -18, 4, 0, 0 },
  { 4, -16,  63,  91, -18, 4, 0, 0 }, { 4, -16,  60,  94, -18, 4, 0, 0 },
  { 3, -15,  58,  96, -18, 4, 0, 0 }, { 4, -15,  55,  98, -18, 4, 0, 0 },
  { 3, -14,  52, 100, -17, 4, 0, 0 }, { 3, -14,  50, 102, -17, 4, 0, 0 },
  { 3, -13,  47, 104, -17, 4, 0, 0 }, { 3, -13,  45, 106, -17, 4, 0, 0 },
  { 3, -12,  42, 108, -16, 3, 0, 0 }, { 3, -11,  40, 109, -16, 3, 0, 0 },
  { 3, -11,  37, 111, -15, 3, 0, 0 }, { 2, -10,  35, 113, -15, 3, 0, 0 },
  { 3, -10,  32, 114, -14, 3, 0, 0 }, { 2, - 9,  29, 116, -13, 3, 0, 0 },
  { 2, - 8,  27, 117, -13, 3, 0, 0 }, { 2, - 8,  25, 119, -12, 2, 0, 0 },
  { 2, - 7,  22, 120, -11, 2, 0, 0 }, { 1, - 6,  20, 121, -10, 2, 0, 0 },
  { 1, - 6,  18, 122, - 9, 2, 0, 0 }, { 1, - 5,  15, 123, - 8, 2, 0, 0 },
  { 1, - 4,  13, 124, - 7, 1, 0, 0 }, { 1, - 4,  11, 125, - 6, 1, 0, 0 },
  { 1, - 3,   8, 126, - 5, 1, 0, 0 }, { 1, - 2,   6, 126, - 4, 1, 0, 0 },
  { 0, - 1,   4, 127, - 3, 1, 0, 0 }, { 0,   0,   2, 127, - 1, 0, 0, 0 },

  // [0, 1)
  { 0,  0,   0, 127,   1,   0,  0,  0}, { 0,  0,  -1, 127,   2,   0,  0,  0},
  { 0,  1,  -3, 127,   4,  -2,  1,  0}, { 0,  1,  -5, 127,   6,  -2,  1,  0},
  { 0,  2,  -6, 126,   8,  -3,  1,  0}, {-1,  2,  -7, 126,  11,  -4,  2, -1},
  {-1,  3,  -8, 125,  13,  -5,  2, -1}, {-1,  3, -10, 124,  16,  -6,  3, -1},
  {-1,  4, -11, 123,  18,  -7,  3, -1}, {-1,  4, -12, 122,  20,  -7,  3, -1},
  {-1,  4, -13, 121,  23,  -8,  3, -1}, {-2,  5, -14, 120,  25,  -9,  4, -1},
  {-1,  5, -15, 119,  27, -10,  4, -1}, {-1,  5, -16, 118,  30, -11,  4, -1},
  {-2,  6, -17, 116,  33, -12,  5, -1}, {-2,  6, -17, 114,  35, -12,  5, -1},
  {-2,  6, -18, 113,  38, -13,  5, -1}, {-2,  7, -19, 111,  41, -14,  6, -2},
  {-2,  7, -19, 110,  43, -15,  6, -2}, {-2,  7, -20, 108,  46, -15,  6, -2},
  {-2,  7, -20, 106,  49, -16,  6, -2}, {-2,  7, -21, 104,  51, -16,  7, -2},
  {-2,  7, -21, 102,  54, -17,  7, -2}, {-2,  8, -21, 100,  56, -18,  7, -2},
  {-2,  8, -22,  98,  59, -18,  7, -2}, {-2,  8, -22,  96,  62, -19,  7, -2},
  {-2,  8, -22,  94,  64, -19,  7, -2}, {-2,  8, -22,  91,  67, -20,  8, -2},
  {-2,  8, -22,  89,  69, -20,  8, -2}, {-2,  8, -22,  87,  72, -21,  8, -2},
  {-2,  8, -21,  84,  74, -21,  8, -2}, {-2,  8, -22,  82,  77, -21,  8, -2},
  {-2,  8, -21,  79,  79, -21,  8, -2}, {-2,  8, -21,  77,  82, -22,  8, -2},
  {-2,  8, -21,  74,  84, -21,  8, -2}, {-2,  8, -21,  72,  87, -22,  8, -2},
  {-2,  8, -20,  69,  89, -22,  8, -2}, {-2,  8, -20,  67,  91, -22,  8, -2},
  {-2,  7, -19,  64,  94, -22,  8, -2}, {-2,  7, -19,  62,  96, -22,  8, -2},
  {-2,  7, -18,  59,  98, -22,  8, -2}, {-2,  7, -18,  56, 100, -21,  8, -2},
  {-2,  7, -17,  54, 102, -21,  7, -2}, {-2,  7, -16,  51, 104, -21,  7, -2},
  {-2,  6, -16,  49, 106, -20,  7, -2}, {-2,  6, -15,  46, 108, -20,  7, -2},
  {-2,  6, -15,  43, 110, -19,  7, -2}, {-2,  6, -14,  41, 111, -19,  7, -2},
  {-1,  5, -13,  38, 113, -18,  6, -2}, {-1,  5, -12,  35, 114, -17,  6, -2},
  {-1,  5, -12,  33, 116, -17,  6, -2}, {-1,  4, -11,  30, 118, -16,  5, -1},
  {-1,  4, -10,  27, 119, -15,  5, -1}, {-1,  4,  -9,  25, 120, -14,  5, -2},
  {-1,  3,  -8,  23, 121, -13,  4, -1}, {-1,  3,  -7,  20, 122, -12,  4, -1},
  {-1,  3,  -7,  18, 123, -11,  4, -1}, {-1,  3,  -6,  16, 124, -10,  3, -1},
  {-1,  2,  -5,  13, 125,  -8,  3, -1}, {-1,  2,  -4,  11, 126,  -7,  2, -1},
  { 0,  1,  -3,   8, 126,  -6,  2,  0}, { 0,  1,  -2,   6, 127,  -5,  1,  0},
  { 0,  1,  -2,   4, 127,  -3,  1,  0}, { 0,  0,   0,   2, 127,  -1,  0,  0},

  // [1, 2)
  { 0, 0, 0,   1, 127,   0,   0, 0 }, { 0, 0, 0, - 1, 127,   2,   0, 0 },
  { 0, 0, 1, - 3, 127,   4, - 1, 0 }, { 0, 0, 1, - 4, 126,   6, - 2, 1 },
  { 0, 0, 1, - 5, 126,   8, - 3, 1 }, { 0, 0, 1, - 6, 125,  11, - 4, 1 },
  { 0, 0, 1, - 7, 124,  13, - 4, 1 }, { 0, 0, 2, - 8, 123,  15, - 5, 1 },
  { 0, 0, 2, - 9, 122,  18, - 6, 1 }, { 0, 0, 2, -10, 121,  20, - 6, 1 },
  { 0, 0, 2, -11, 120,  22, - 7, 2 }, { 0, 0, 2, -12, 119,  25, - 8, 2 },
  { 0, 0, 3, -13, 117,  27, - 8, 2 }, { 0, 0, 3, -13, 116,  29, - 9, 2 },
  { 0, 0, 3, -14, 114,  32, -10, 3 }, { 0, 0, 3, -15, 113,  35, -10, 2 },
  { 0, 0, 3, -15, 111,  37, -11, 3 }, { 0, 0, 3, -16, 109,  40, -11, 3 },
  { 0, 0, 3, -16, 108,  42, -12, 3 }, { 0, 0, 4, -17, 106,  45, -13, 3 },
  { 0, 0, 4, -17, 104,  47, -13, 3 }, { 0, 0, 4, -17, 102,  50, -14, 3 },
  { 0, 0, 4, -17, 100,  52, -14, 3 }, { 0, 0, 4, -18,  98,  55, -15, 4 },
  { 0, 0, 4, -18,  96,  58, -15, 3 }, { 0, 0, 4, -18,  94,  60, -16, 4 },
  { 0, 0, 4, -18,  91,  63, -16, 4 }, { 0, 0, 4, -18,  89,  65, -16, 4 },
  { 0, 0, 4, -18,  87,  68, -17, 4 }, { 0, 0, 4, -18,  85,  70, -17, 4 },
  { 0, 0, 4, -18,  82,  73, -17, 4 }, { 0, 0, 4, -18,  80,  75, -17, 4 },
  { 0, 0, 4, -18,  78,  78, -18, 4 }, { 0, 0, 4, -17,  75,  80, -18, 4 },
  { 0, 0, 4, -17,  73,  82, -18, 4 }, { 0, 0, 4, -17,  70,  85, -18, 4 },
  { 0, 0, 4, -17,  68,  87, -18, 4 }, { 0, 0, 4, -16,  65,  89, -18, 4 },
  { 0, 0, 4, -16,  63,  91, -18, 4 }, { 0, 0, 4, -16,  60,  94, -18, 4 },
  { 0, 0, 3, -15,  58,  96, -18, 4 }, { 0, 0, 4, -15,  55,  98, -18, 4 },
  { 0, 0, 3, -14,  52, 100, -17, 4 }, { 0, 0, 3, -14,  50, 102, -17, 4 },
  { 0, 0, 3, -13,  47, 104, -17, 4 }, { 0, 0, 3, -13,  45, 106, -17, 4 },
  { 0, 0, 3, -12,  42, 108, -16, 3 }, { 0, 0, 3, -11,  40, 109, -16, 3 },
  { 0, 0, 3, -11,  37, 111, -15, 3 }, { 0, 0, 2, -10,  35, 113, -15, 3 },
  { 0, 0, 3, -10,  32, 114, -14, 3 }, { 0, 0, 2, - 9,  29, 116, -13, 3 },
  { 0, 0, 2, - 8,  27, 117, -13, 3 }, { 0, 0, 2, - 8,  25, 119, -12, 2 },
  { 0, 0, 2, - 7,  22, 120, -11, 2 }, { 0, 0, 1, - 6,  20, 121, -10, 2 },
  { 0, 0, 1, - 6,  18, 122, - 9, 2 }, { 0, 0, 1, - 5,  15, 123, - 8, 2 },
  { 0, 0, 1, - 4,  13, 124, - 7, 1 }, { 0, 0, 1, - 4,  11, 125, - 6, 1 },
  { 0, 0, 1, - 3,   8, 126, - 5, 1 }, { 0, 0, 1, - 2,   6, 126, - 4, 1 },
  { 0, 0, 0, - 1,   4, 127, - 3, 1 }, { 0, 0, 0,   0,   2, 127, - 1, 0 },

  // [2, 3)
  { 0, 0, 0, 0,   0, 127,   1,   0 }, { 0, 0, 0, 0, - 1, 127,   2,   0 },
  { 0, 0, 0, 0, - 2, 127,   4, - 1 }, { 0, 0, 0, 0, - 3, 126,   6, - 1 },
  { 0, 0, 0, 0, - 3, 125,   8, - 2 }, { 0, 0, 0, 0, - 4, 124,  11, - 3 },
  { 0, 0, 0, 0, - 5, 123,  13, - 3 }, { 0, 0, 0, 0, - 5, 121,  15, - 3 },
  { 0, 0, 0, 0, - 6, 120,  18, - 4 }, { 0, 0, 0, 0, - 7, 119,  20, - 4 },
  { 0, 0, 0, 0, - 7, 118,  22, - 5 }, { 0, 0, 0, 0, - 8, 116,  25, - 5 },
  { 0, 0, 0, 0, - 8, 115,  27, - 6 }, { 0, 0, 0, 0, - 9, 113,  30, - 6 },
  { 0, 0, 0, 0, - 9, 112,  32, - 7 }, { 0, 0, 0, 0, - 9, 110,  34, - 7 },
  { 0, 0, 0, 0, -10, 108,  37, - 7 }, { 0, 0, 0, 0, -10, 107,  39, - 8 },
  { 0, 0, 0, 0, -10, 105,  41, - 8 }, { 0, 0, 0, 0, -11, 103,  44, - 8 },
  { 0, 0, 0, 0, -11, 101,  47, - 9 }, { 0, 0, 0, 0, -11,  99,  49, - 9 },
  { 0, 0, 0, 0, -11,  97,  51, - 9 }, { 0, 0, 0, 0, -11,  95,  54, -10 },
  { 0, 0, 0, 0, -11,  93,  56, -10 }, { 0, 0, 0, 0, -12,  91,  59, -10 },
  { 0, 0, 0, 0, -12,  89,  61, -10 }, { 0, 0, 0, 0, -12,  87,  64, -11 },
  { 0, 0, 0, 0, -12,  85,  66, -11 }, { 0, 0, 0, 0, -12,  82,  69, -11 },
  { 0, 0, 0, 0, -12,  80,  71, -11 }, { 0, 0, 0, 0, -12,  78,  73, -11 },
  { 0, 0, 0, 0, -11,  75,  75, -11 }, { 0, 0, 0, 0, -11,  73,  78, -12 },
  { 0, 0, 0, 0, -11,  71,  80, -12 }, { 0, 0, 0, 0, -11,  69,  82, -12 },
  { 0, 0, 0, 0, -11,  66,  85, -12 }, { 0, 0, 0, 0, -11,  64,  87, -12 },
  { 0, 0, 0, 0, -10,  61,  89, -12 }, { 0, 0, 0, 0, -10,  59,  91, -12 },
  { 0, 0, 0, 0, -10,  56,  93, -11 }, { 0, 0, 0, 0, -10,  54,  95, -11 },
  { 0, 0, 0, 0, - 9,  51,  97, -11 }, { 0, 0, 0, 0, - 9,  49,  99, -11 },
  { 0, 0, 0, 0, - 9,  47, 101, -11 }, { 0, 0, 0, 0, - 8,  44, 103, -11 },
  { 0, 0, 0, 0, - 8,  41, 105, -10 }, { 0, 0, 0, 0, - 8,  39, 107, -10 },
  { 0, 0, 0, 0, - 7,  37, 108, -10 }, { 0, 0, 0, 0, - 7,  34, 110, - 9 },
  { 0, 0, 0, 0, - 7,  32, 112, - 9 }, { 0, 0, 0, 0, - 6,  30, 113, - 9 },
  { 0, 0, 0, 0, - 6,  27, 115, - 8 }, { 0, 0, 0, 0, - 5,  25, 116, - 8 },
  { 0, 0, 0, 0, - 5,  22, 118, - 7 }, { 0, 0, 0, 0, - 4,  20, 119, - 7 },
  { 0, 0, 0, 0, - 4,  18, 120, - 6 }, { 0, 0, 0, 0, - 3,  15, 121, - 5 },
  { 0, 0, 0, 0, - 3,  13, 123, - 5 }, { 0, 0, 0, 0, - 3,  11, 124, - 4 },
  { 0, 0, 0, 0, - 2,   8, 125, - 3 }, { 0, 0, 0, 0, - 1,   6, 126, - 3 },
  { 0, 0, 0, 0, - 1,   4, 127, - 2 }, { 0, 0, 0, 0,   0,   2, 127, - 1 },

  // [3, 4)
  {0, 0, 0, 0, 0, 0, 127,   1 }, {0, 0, 0, 0, 0, 0, 126,   2 },
  {0, 0, 0, 0, 0, 0, 124,   4 }, {0, 0, 0, 0, 0, 0, 122,   6 },
  {0, 0, 0, 0, 0, 0, 120,   8 }, {0, 0, 0, 0, 0, 0, 118,  10 },
  {0, 0, 0, 0, 0, 0, 116,  12 }, {0, 0, 0, 0, 0, 0, 114,  14 },
  {0, 0, 0, 0, 0, 0, 112,  16 }, {0, 0, 0, 0, 0, 0, 110,  18 },
  {0, 0, 0, 0, 0, 0, 108,  20 }, {0, 0, 0, 0, 0, 0, 106,  22 },
  {0, 0, 0, 0, 0, 0, 104,  24 }, {0, 0, 0, 0, 0, 0, 102,  26 },
  {0, 0, 0, 0, 0, 0, 100,  28 }, {0, 0, 0, 0, 0, 0,  98,  30 },
  {0, 0, 0, 0, 0, 0,  96,  32 }, {0, 0, 0, 0, 0, 0,  94,  34 },
  {0, 0, 0, 0, 0, 0,  92,  36 }, {0, 0, 0, 0, 0, 0,  90,  38 },
  {0, 0, 0, 0, 0, 0,  88,  40 }, {0, 0, 0, 0, 0, 0,  86,  42 },
  {0, 0, 0, 0, 0, 0,  84,  44 }, {0, 0, 0, 0, 0, 0,  82,  46 },
  {0, 0, 0, 0, 0, 0,  80,  48 }, {0, 0, 0, 0, 0, 0,  78,  50 },
  {0, 0, 0, 0, 0, 0,  76,  52 }, {0, 0, 0, 0, 0, 0,  74,  54 },
  {0, 0, 0, 0, 0, 0,  72,  56 }, {0, 0, 0, 0, 0, 0,  70,  58 },
  {0, 0, 0, 0, 0, 0,  68,  60 }, {0, 0, 0, 0, 0, 0,  66,  62 },
  {0, 0, 0, 0, 0, 0,  64,  64 }, {0, 0, 0, 0, 0, 0,  62,  66 },
  {0, 0, 0, 0, 0, 0,  60,  68 }, {0, 0, 0, 0, 0, 0,  58,  70 },
  {0, 0, 0, 0, 0, 0,  56,  72 }, {0, 0, 0, 0, 0, 0,  54,  74 },
  {0, 0, 0, 0, 0, 0,  52,  76 }, {0, 0, 0, 0, 0, 0,  50,  78 },
  {0, 0, 0, 0, 0, 0,  48,  80 }, {0, 0, 0, 0, 0, 0,  46,  82 },
  {0, 0, 0, 0, 0, 0,  44,  84 }, {0, 0, 0, 0, 0, 0,  42,  86 },
  {0, 0, 0, 0, 0, 0,  40,  88 }, {0, 0, 0, 0, 0, 0,  38,  90 },
  {0, 0, 0, 0, 0, 0,  36,  92 }, {0, 0, 0, 0, 0, 0,  34,  94 },
  {0, 0, 0, 0, 0, 0,  32,  96 }, {0, 0, 0, 0, 0, 0,  30,  98 },
  {0, 0, 0, 0, 0, 0,  28, 100 }, {0, 0, 0, 0, 0, 0,  26, 102 },
  {0, 0, 0, 0, 0, 0,  24, 104 }, {0, 0, 0, 0, 0, 0,  22, 106 },
  {0, 0, 0, 0, 0, 0,  20, 108 }, {0, 0, 0, 0, 0, 0,  18, 110 },
  {0, 0, 0, 0, 0, 0,  16, 112 }, {0, 0, 0, 0, 0, 0,  14, 114 },
  {0, 0, 0, 0, 0, 0,  12, 116 }, {0, 0, 0, 0, 0, 0,  10, 118 },
  {0, 0, 0, 0, 0, 0,   8, 120 }, {0, 0, 0, 0, 0, 0,   6, 122 },
  {0, 0, 0, 0, 0, 0,   4, 124 }, {0, 0, 0, 0, 0, 0,   2, 126 },

  // dummy (replicate row index 447)
  { 0, 0, 0, 0, 0, 0,  2, 126 },
#elif WARPEDPIXEL_PREC_BITS == 5
  // The filters added below are taken from WARPEDPIXEL_PREC_BITS=6 case by
  // skipping alternate filters and the codec is not validated for this case.
  // [-3, -2)
  { 127,   1, 0, 0, 0, 0, 0, 0 }, { 124,   4, 0, 0, 0, 0, 0, 0 },
  { 120,   8, 0, 0, 0, 0, 0, 0 }, { 116,  12, 0, 0, 0, 0, 0, 0 },
  { 112,  16, 0, 0, 0, 0, 0, 0 }, { 108,  20, 0, 0, 0, 0, 0, 0 },
  { 104,  24, 0, 0, 0, 0, 0, 0 }, { 100,  28, 0, 0, 0, 0, 0, 0 },
  {  96,  32, 0, 0, 0, 0, 0, 0 }, {  92,  36, 0, 0, 0, 0, 0, 0 },
  {  88,  40, 0, 0, 0, 0, 0, 0 }, {  84,  44, 0, 0, 0, 0, 0, 0 },
  {  80,  48, 0, 0, 0, 0, 0, 0 }, {  76,  52, 0, 0, 0, 0, 0, 0 },
  {  72,  56, 0, 0, 0, 0, 0, 0 }, {  68,  60, 0, 0, 0, 0, 0, 0 },
  {  64,  64, 0, 0, 0, 0, 0, 0 }, {  60,  68, 0, 0, 0, 0, 0, 0 },
  {  56,  72, 0, 0, 0, 0, 0, 0 }, {  52,  76, 0, 0, 0, 0, 0, 0 },
  {  48,  80, 0, 0, 0, 0, 0, 0 }, {  44,  84, 0, 0, 0, 0, 0, 0 },
  {  40,  88, 0, 0, 0, 0, 0, 0 }, {  36,  92, 0, 0, 0, 0, 0, 0 },
  {  32,  96, 0, 0, 0, 0, 0, 0 }, {  28, 100, 0, 0, 0, 0, 0, 0 },
  {  24, 104, 0, 0, 0, 0, 0, 0 }, {  20, 108, 0, 0, 0, 0, 0, 0 },
  {  16, 112, 0, 0, 0, 0, 0, 0 }, {  12, 116, 0, 0, 0, 0, 0, 0 },
  {   8, 120, 0, 0, 0, 0, 0, 0 }, {   4, 124, 0, 0, 0, 0, 0, 0 },
  // [-2, -1)
  {   0, 127,   1,   0, 0, 0, 0, 0 }, { - 2, 127,   4,  -1, 0, 0, 0, 0 },
  { - 3, 125,   8,  -2, 0, 0, 0, 0 }, { - 5, 123,  13,  -3, 0, 0, 0, 0 },
  { - 6, 120,  18,  -4, 0, 0, 0, 0 }, { - 7, 118,  22,  -5, 0, 0, 0, 0 },
  { - 8, 115,  27,  -6, 0, 0, 0, 0 }, { - 9, 112,  32,  -7, 0, 0, 0, 0 },
  { -10, 108,  37,  -7, 0, 0, 0, 0 }, { -10, 105,  41,  -8, 0, 0, 0, 0 },
  { -11, 101,  47,  -9, 0, 0, 0, 0 }, { -11,  97,  51,  -9, 0, 0, 0, 0 },
  { -11,  93,  56, -10, 0, 0, 0, 0 }, { -12,  89,  61, -10, 0, 0, 0, 0 },
  { -12,  85,  66, -11, 0, 0, 0, 0 }, { -12,  80,  71, -11, 0, 0, 0, 0 },
  { -11,  75,  75, -11, 0, 0, 0, 0 }, { -11,  71,  80, -12, 0, 0, 0, 0 },
  { -11,  66,  85, -12, 0, 0, 0, 0 }, { -10,  61,  89, -12, 0, 0, 0, 0 },
  { -10,  56,  93, -11, 0, 0, 0, 0 }, { - 9,  51,  97, -11, 0, 0, 0, 0 },
  { - 9,  47, 101, -11, 0, 0, 0, 0 }, { - 8,  41, 105, -10, 0, 0, 0, 0 },
  { - 7,  37, 108, -10, 0, 0, 0, 0 }, { - 7,  32, 112, - 9, 0, 0, 0, 0 },
  { - 6,  27, 115, - 8, 0, 0, 0, 0 }, { - 5,  22, 118, - 7, 0, 0, 0, 0 },
  { - 4,  18, 120, - 6, 0, 0, 0, 0 }, { - 3,  13, 123, - 5, 0, 0, 0, 0 },
  { - 2,   8, 125, - 3, 0, 0, 0, 0 }, { - 1,   4, 127, - 2, 0, 0, 0, 0 },
  // [-1, 0)
  {0,   0, 127,   1,   0, 0, 0, 0}, {1,  -3, 127,   4,  -1, 0, 0, 0},
  {1,  -5, 126,   8,  -3, 1, 0, 0}, {1,  -7, 124,  13,  -4, 1, 0, 0},
  {2,  -9, 122,  18,  -6, 1, 0, 0}, {2, -11, 120,  22,  -7, 2, 0, 0},
  {3, -13, 117,  27,  -8, 2, 0, 0}, {3, -14, 114,  32, -10, 3, 0, 0},
  {3, -15, 111,  37, -11, 3, 0, 0}, {3, -16, 108,  42, -12, 3, 0, 0},
  {4, -17, 104,  47, -13, 3, 0, 0}, {4, -17, 100,  52, -14, 3, 0, 0},
  {4, -18,  96,  58, -15, 3, 0, 0}, {4, -18,  91,  63, -16, 4, 0, 0},
  {4, -18,  87,  68, -17, 4, 0, 0}, {4, -18,  82,  73, -17, 4, 0, 0},
  {4, -18,  78,  78, -18, 4, 0, 0}, {4, -17,  73,  82, -18, 4, 0, 0},
  {4, -17,  68,  87, -18, 4, 0, 0}, {4, -16,  63,  91, -18, 4, 0, 0},
  {3, -15,  58,  96, -18, 4, 0, 0}, {3, -14,  52, 100, -17, 4, 0, 0},
  {3, -13,  47, 104, -17, 4, 0, 0}, {3, -12,  42, 108, -16, 3, 0, 0},
  {3, -11,  37, 111, -15, 3, 0, 0}, {3, -10,  32, 114, -14, 3, 0, 0},
  {2,  -8,  27, 117, -13, 3, 0, 0}, {2,  -7,  22, 120, -11, 2, 0, 0},
  {1,  -6,  18, 122,  -9, 2, 0, 0}, {1,  -4,  13, 124,  -7, 1, 0, 0},
  {1,  -3,   8, 126,  -5, 1, 0, 0}, {0,  -1,   4, 127,  -3, 1, 0, 0},
  // [0, 1)
  { 0,  0,   0, 127,   1,   0,   0,  0}, { 0,  1,  -3, 127,   4,  -2,   1,  0},
  { 0,  2,  -6, 126,   8,  -3,   1,  0}, {-1,  3,  -8, 125,  13,  -5,   2, -1},
  {-1,  4, -11, 123,  18,  -7,   3, -1}, {-1,  4, -13, 121,  23,  -8,   3, -1},
  {-1,  5, -15, 119,  27, -10,   4, -1}, {-2,  6, -17, 116,  33, -12,   5, -1},
  {-2,  6, -18, 113,  38, -13,   5, -1}, {-2,  7, -19, 110,  43, -15,   6, -2},
  {-2,  7, -20, 106,  49, -16,   6, -2}, {-2,  7, -21, 102,  54, -17,   7, -2},
  {-2,  8, -22,  98,  59, -18,   7, -2}, {-2,  8, -22,  94,  64, -19,   7, -2},
  {-2,  8, -22,  89,  69, -20,   8, -2}, {-2,  8, -21,  84,  74, -21,   8, -2},
  {-2,  8, -21,  79,  79, -21,   8, -2}, {-2,  8, -21,  74,  84, -21,   8, -2},
  {-2,  8, -20,  69,  89, -22,   8, -2}, {-2,  7, -19,  64,  94, -22,   8, -2},
  {-2,  7, -18,  59,  98, -22,   8, -2}, {-2,  7, -17,  54, 102, -21,   7, -2},
  {-2,  6, -16,  49, 106, -20,   7, -2}, {-2,  6, -15,  43, 110, -19,   7, -2},
  {-1,  5, -13,  38, 113, -18,   6, -2}, {-1,  5, -12,  33, 116, -17,   6, -2},
  {-1,  4, -10,  27, 119, -15,   5, -1}, {-1,  3,  -8,  23, 121, -13,   4, -1},
  {-1,  3,  -7,  18, 123, -11,   4, -1}, {-1,  2,  -5,  13, 125,  -8,   3, -1},
  { 0,  1,  -3,   8, 126,  -6,   2,  0}, { 0,  1,  -2,   4, 127,  -3,   1,  0},
  // [1, 2)
  {0, 0, 0,   1, 127,   0,   0, 0}, {0, 0, 1,  -3, 127,   4,  -1, 0},
  {0, 0, 1,  -5, 126,   8,  -3, 1}, {0, 0, 1,  -7, 124,  13,  -4, 1},
  {0, 0, 2,  -9, 122,  18,  -6, 1}, {0, 0, 2, -11, 120,  22,  -7, 2},
  {0, 0, 3, -13, 117,  27,  -8, 2}, {0, 0, 3, -14, 114,  32, -10, 3},
  {0, 0, 3, -15, 111,  37, -11, 3}, {0, 0, 3, -16, 108,  42, -12, 3},
  {0, 0, 4, -17, 104,  47, -13, 3}, {0, 0, 4, -17, 100,  52, -14, 3},
  {0, 0, 4, -18,  96,  58, -15, 3}, {0, 0, 4, -18,  91,  63, -16, 4},
  {0, 0, 4, -18,  87,  68, -17, 4}, {0, 0, 4, -18,  82,  73, -17, 4},
  {0, 0, 4, -18,  78,  78, -18, 4}, {0, 0, 4, -17,  73,  82, -18, 4},
  {0, 0, 4, -17,  68,  87, -18, 4}, {0, 0, 4, -16,  63,  91, -18, 4},
  {0, 0, 3, -15,  58,  96, -18, 4}, {0, 0, 3, -14,  52, 100, -17, 4},
  {0, 0, 3, -13,  47, 104, -17, 4}, {0, 0, 3, -12,  42, 108, -16, 3},
  {0, 0, 3, -11,  37, 111, -15, 3}, {0, 0, 3, -10,  32, 114, -14, 3},
  {0, 0, 2,  -8,  27, 117, -13, 3}, {0, 0, 2,  -7,  22, 120, -11, 2},
  {0, 0, 1,  -6,  18, 122,  -9, 2}, {0, 0, 1,  -4,  13, 124,  -7, 1},
  {0, 0, 1,  -3,   8, 126,  -5, 1}, {0, 0, 0,  -1,   4, 127,  -3, 1},
  // [2, 3)
  { 0, 0, 0, 0,   0, 127,   1,   0 }, { 0, 0, 0, 0, - 2, 127,   4, - 1 },
  { 0, 0, 0, 0, - 3, 125,   8, - 2 }, { 0, 0, 0, 0, - 5, 123,  13, - 3 },
  { 0, 0, 0, 0, - 6, 120,  18, - 4 }, { 0, 0, 0, 0, - 7, 118,  22, - 5 },
  { 0, 0, 0, 0, - 8, 115,  27, - 6 }, { 0, 0, 0, 0, - 9, 112,  32, - 7 },
  { 0, 0, 0, 0, -10, 108,  37, - 7 }, { 0, 0, 0, 0, -10, 105,  41, - 8 },
  { 0, 0, 0, 0, -11, 101,  47, - 9 }, { 0, 0, 0, 0, -11,  97,  51, - 9 },
  { 0, 0, 0, 0, -11,  93,  56, -10 }, { 0, 0, 0, 0, -12,  89,  61, -10 },
  { 0, 0, 0, 0, -12,  85,  66, -11 }, { 0, 0, 0, 0, -12,  80,  71, -11 },
  { 0, 0, 0, 0, -11,  75,  75, -11 }, { 0, 0, 0, 0, -11,  71,  80, -12 },
  { 0, 0, 0, 0, -11,  66,  85, -12 }, { 0, 0, 0, 0, -10,  61,  89, -12 },
  { 0, 0, 0, 0, -10,  56,  93, -11 }, { 0, 0, 0, 0, - 9,  51,  97, -11 },
  { 0, 0, 0, 0, - 9,  47, 101, -11 }, { 0, 0, 0, 0, - 8,  41, 105, -10 },
  { 0, 0, 0, 0, - 7,  37, 108, -10 }, { 0, 0, 0, 0, - 7,  32, 112, - 9 },
  { 0, 0, 0, 0, - 6,  27, 115, - 8 }, { 0, 0, 0, 0, - 5,  22, 118, - 7 },
  { 0, 0, 0, 0, - 4,  18, 120, - 6 }, { 0, 0, 0, 0, - 3,  13, 123, - 5 },
  { 0, 0, 0, 0, - 2,   8, 125, - 3 }, { 0, 0, 0, 0, - 1,   4, 127, - 2 },
  // [3, 4)
  {0, 0, 0, 0, 0, 0, 127,   1 }, {0, 0, 0, 0, 0, 0, 124,   4 },
  {0, 0, 0, 0, 0, 0, 120,   8 }, {0, 0, 0, 0, 0, 0, 116,  12 },
  {0, 0, 0, 0, 0, 0, 112,  16 }, {0, 0, 0, 0, 0, 0, 108,  20 },
  {0, 0, 0, 0, 0, 0, 104,  24 }, {0, 0, 0, 0, 0, 0, 100,  28 },
  {0, 0, 0, 0, 0, 0,  96,  32 }, {0, 0, 0, 0, 0, 0,  92,  36 },
  {0, 0, 0, 0, 0, 0,  88,  40 }, {0, 0, 0, 0, 0, 0,  84,  44 },
  {0, 0, 0, 0, 0, 0,  80,  48 }, {0, 0, 0, 0, 0, 0,  76,  52 },
  {0, 0, 0, 0, 0, 0,  72,  56 }, {0, 0, 0, 0, 0, 0,  68,  60 },
  {0, 0, 0, 0, 0, 0,  64,  64 }, {0, 0, 0, 0, 0, 0,  60,  68 },
  {0, 0, 0, 0, 0, 0,  56,  72 }, {0, 0, 0, 0, 0, 0,  52,  76 },
  {0, 0, 0, 0, 0, 0,  48,  80 }, {0, 0, 0, 0, 0, 0,  44,  84 },
  {0, 0, 0, 0, 0, 0,  40,  88 }, {0, 0, 0, 0, 0, 0,  36,  92 },
  {0, 0, 0, 0, 0, 0,  32,  96 }, {0, 0, 0, 0, 0, 0,  28, 100 },
  {0, 0, 0, 0, 0, 0,  24, 104 }, {0, 0, 0, 0, 0, 0,  20, 108 },
  {0, 0, 0, 0, 0, 0,  16, 112 }, {0, 0, 0, 0, 0, 0,  12, 116 },
  {0, 0, 0, 0, 0, 0,   8, 120 }, {0, 0, 0, 0, 0, 0,   4, 124 },
  // dummy (replicate row index 223)
  {0, 0, 0, 0, 0, 0,   4, 124 },

#endif  // WARPEDPIXEL_PREC_BITS == 6
};

DECLARE_ALIGNED(16, const int16_t,
                av1_ext_warped_filter[EXT_WARP_PHASES + 1][EXT_WARP_STORAGE_TAPS]) = {
// The extended warp filter is a 6-tap filter, but we store each kernel with
// two extra zeros at the end so that each kernel is 16-byte aligned
{ 0,   0, 128,   0,   0, 0, 0, 0 },
{ 0,  -1, 127,   2,   0, 0, 0, 0 },
{ 0,  -2, 127,   4,  -1, 0, 0, 0 },
{ 0,  -3, 126,   6,  -1, 0, 0, 0 },
{ 1,  -4, 125,   8,  -2, 0, 0, 0 },
{ 1,  -5, 124,  11,  -3, 0, 0, 0 },
{ 1,  -6, 123,  13,  -3, 0, 0, 0 },
{ 1,  -6, 122,  15,  -4, 0, 0, 0 },
{ 1,  -7, 120,  17,  -4, 1, 0, 0 },
{ 1,  -8, 119,  20,  -5, 1, 0, 0 },
{ 1,  -9, 118,  22,  -5, 1, 0, 0 },
{ 1,  -9, 117,  24,  -6, 1, 0, 0 },
{ 1, -10, 115,  27,  -6, 1, 0, 0 },
{ 1, -10, 114,  29,  -7, 1, 0, 0 },
{ 1, -11, 112,  32,  -7, 1, 0, 0 },
{ 1, -11, 111,  34,  -8, 1, 0, 0 },
{ 1, -11, 109,  36,  -8, 1, 0, 0 },
{ 2, -12, 107,  39,  -9, 1, 0, 0 },
{ 2, -12, 105,  41,  -9, 1, 0, 0 },
{ 2, -12, 103,  44, -10, 1, 0, 0 },
{ 2, -13, 102,  46, -10, 1, 0, 0 },
{ 2, -13,  99,  49, -10, 1, 0, 0 },
{ 2, -13,  98,  51, -11, 1, 0, 0 },
{ 2, -13,  95,  54, -11, 1, 0, 0 },
{ 2, -14,  93,  56, -11, 2, 0, 0 },
{ 2, -14,  91,  59, -12, 2, 0, 0 },
{ 2, -14,  89,  61, -12, 2, 0, 0 },
{ 2, -14,  87,  63, -12, 2, 0, 0 },
{ 2, -14,  85,  66, -13, 2, 0, 0 },
{ 2, -14,  83,  68, -13, 2, 0, 0 },
{ 2, -14,  80,  71, -13, 2, 0, 0 },
{ 2, -14,  78,  73, -13, 2, 0, 0 },
{ 2, -13,  75,  75, -13, 2, 0, 0 },
{ 2, -13,  73,  78, -14, 2, 0, 0 },
{ 2, -13,  71,  80, -14, 2, 0, 0 },
{ 2, -13,  68,  83, -14, 2, 0, 0 },
{ 2, -13,  66,  85, -14, 2, 0, 0 },
{ 2, -12,  63,  87, -14, 2, 0, 0 },
{ 2, -12,  61,  89, -14, 2, 0, 0 },
{ 2, -12,  59,  91, -14, 2, 0, 0 },
{ 2, -11,  56,  93, -14, 2, 0, 0 },
{ 1, -11,  54,  95, -13, 2, 0, 0 },
{ 1, -11,  51,  98, -13, 2, 0, 0 },
{ 1, -10,  49,  99, -13, 2, 0, 0 },
{ 1, -10,  46, 102, -13, 2, 0, 0 },
{ 1, -10,  44, 103, -12, 2, 0, 0 },
{ 1,  -9,  41, 105, -12, 2, 0, 0 },
{ 1,  -9,  39, 107, -12, 2, 0, 0 },
{ 1,  -8,  36, 109, -11, 1, 0, 0 },
{ 1,  -8,  34, 111, -11, 1, 0, 0 },
{ 1,  -7,  32, 112, -11, 1, 0, 0 },
{ 1,  -7,  29, 114, -10, 1, 0, 0 },
{ 1,  -6,  27, 115, -10, 1, 0, 0 },
{ 1,  -6,  24, 117,  -9, 1, 0, 0 },
{ 1,  -5,  22, 118,  -9, 1, 0, 0 },
{ 1,  -5,  20, 119,  -8, 1, 0, 0 },
{ 1,  -4,  17, 120,  -7, 1, 0, 0 },
{ 0,  -4,  15, 122,  -6, 1, 0, 0 },
{ 0,  -3,  13, 123,  -6, 1, 0, 0 },
{ 0,  -3,  11, 124,  -5, 1, 0, 0 },
{ 0,  -2,   8, 125,  -4, 1, 0, 0 },
{ 0,  -1,   6, 126,  -3, 0, 0, 0 },
{ 0,  -1,   4, 127,  -2, 0, 0, 0 },
{ 0,   0,   2, 127,  -1, 0, 0, 0 },
{ 0,   0,   0, 128,  0, 0, 0, 0 },
};
/* clang-format on */

// Recompute the translational part of a warp model, so that the center
// of the current block (determined by `mi_row`, `mi_col`, `bsize`)
// has an induced motion vector of `mv`
void av1_set_warp_translation(int mi_row, int mi_col, BLOCK_SIZE bsize, MV mv,
                              WarpedMotionParams *wm) {
  const int center_x = mi_col * MI_SIZE + block_size_wide[bsize] / 2 - 1;
  const int center_y = mi_row * MI_SIZE + block_size_high[bsize] / 2 - 1;

  // Note(rachelbarker): We subtract 1 from the diagonal part of the model here.
  // This is because the warp model M maps (current frame) pixel coordinates to
  // (ref frame) pixel coordinates. So, in order to calculate the induced
  // motion vector, we have to subtract the identity matrix.
  int64_t wmmat0 =
      (int64_t)mv.col * (1 << (WARPEDMODEL_PREC_BITS - 3)) -
      ((int64_t)center_x * (wm->wmmat[2] - (1 << WARPEDMODEL_PREC_BITS)) +
       (int64_t)center_y * wm->wmmat[3]);
  int64_t wmmat1 =
      (int64_t)mv.row * (1 << (WARPEDMODEL_PREC_BITS - 3)) -
      ((int64_t)center_x * wm->wmmat[4] +
       (int64_t)center_y * (wm->wmmat[5] - (1 << WARPEDMODEL_PREC_BITS)));

  wm->wmmat[0] =
      (int32_t)clamp64(wmmat0, -WARPEDMODEL_TRANS_CLAMP,
                       WARPEDMODEL_TRANS_CLAMP - (1 << WARP_PARAM_REDUCE_BITS));
  wm->wmmat[1] =
      (int32_t)clamp64(wmmat1, -WARPEDMODEL_TRANS_CLAMP,
                       WARPEDMODEL_TRANS_CLAMP - (1 << WARP_PARAM_REDUCE_BITS));
}

const uint16_t div_lut[DIV_LUT_NUM + 1] = {
  16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
  15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,
  15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,
  14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,
  13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,
  13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,
  13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,
  12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,
  12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,
  11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,
  11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,
  11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,
  10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,
  10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,
  10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,
  9963,  9939,  9916,  9892,  9869,  9846,  9823,  9800,  9777,  9754,  9732,
  9709,  9687,  9664,  9642,  9620,  9598,  9576,  9554,  9533,  9511,  9489,
  9468,  9447,  9425,  9404,  9383,  9362,  9341,  9321,  9300,  9279,  9259,
  9239,  9218,  9198,  9178,  9158,  9138,  9118,  9098,  9079,  9059,  9039,
  9020,  9001,  8981,  8962,  8943,  8924,  8905,  8886,  8867,  8849,  8830,
  8812,  8793,  8775,  8756,  8738,  8720,  8702,  8684,  8666,  8648,  8630,
  8613,  8595,  8577,  8560,  8542,  8525,  8508,  8490,  8473,  8456,  8439,
  8422,  8405,  8389,  8372,  8355,  8339,  8322,  8306,  8289,  8273,  8257,
  8240,  8224,  8208,  8192,
};

static int is_affine_valid(const WarpedMotionParams *const wm) {
  const int32_t *mat = wm->wmmat;
  return (mat[2] > 0);
}

static int is_affine_shear_allowed(int16_t alpha, int16_t beta, int16_t gamma,
                                   int16_t delta) {
  if ((4 * abs(alpha) + 7 * abs(beta) >= (3 << WARPEDMODEL_PREC_BITS)) ||
      (4 * abs(gamma) + 4 * abs(delta) >= (3 << WARPEDMODEL_PREC_BITS)))
    return 0;
  else
    return 1;
}

// Returns 1 on success or 0 on an invalid affine set
int av1_get_shear_params(WarpedMotionParams *wm
#if CONFIG_ACROSS_SCALE_WARP
                         ,
                         const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
) {
  if (!is_affine_valid(wm)) return 0;
  const int16_t max_value = INT16_MAX - (1 << (WARP_PARAM_REDUCE_BITS - 1));

#if CONFIG_ACROSS_SCALE_WARP
  // Always use 4x4 warp in scale of across-scale
  const int is_scaled = sf ? av1_is_scaled(sf) : 0;
  const int32_t *mat = wm->wmmat;
#else
  const int32_t *mat = wm->wmmat;
#endif  // CONFIG_ACROSS_SCALE_WARP

  wm->alpha =
      clamp(mat[2] - (1 << WARPEDMODEL_PREC_BITS), INT16_MIN, max_value);
  wm->beta = clamp(mat[3], INT16_MIN, max_value);
  int16_t shift;
  int16_t y = resolve_divisor_32(abs(mat[2]), &shift) * (mat[2] < 0 ? -1 : 1);
  int64_t v = ((int64_t)mat[4] * (1 << WARPEDMODEL_PREC_BITS)) * y;
  wm->gamma =
      clamp((int)ROUND_POWER_OF_TWO_SIGNED_64(v, shift), INT16_MIN, max_value);
  v = ((int64_t)mat[3] * mat[4]) * y;
  wm->delta = clamp(mat[5] - (int)ROUND_POWER_OF_TWO_SIGNED_64(v, shift) -
                        (1 << WARPEDMODEL_PREC_BITS),
                    INT16_MIN, max_value);

  // Note(rachelbarker):
  // In extreme cases, the `clamp` operations in the previous block can set
  // parameters equal to to INT16_MAX == 32767.
  //
  // The following round-then-multiply, which is intended to reduce the bit
  // storage requirement in hardware, then rounds to 32768, which is outside
  // the range of an int16_t. But casting to int16_t is okay - it will cause
  // this value to become -32768, and so the model will be rejected
  // by is_affine_shear_allowed(), so the outcome is the same.
  //
  // However, we must make this cast explicit, because otherwise the integer
  // sanitizer (correctly) complains about overflow during an implicit cast
  wm->alpha =
      (int16_t)(ROUND_POWER_OF_TWO_SIGNED(wm->alpha, WARP_PARAM_REDUCE_BITS) *
                (1 << WARP_PARAM_REDUCE_BITS));
  wm->beta =
      (int16_t)(ROUND_POWER_OF_TWO_SIGNED(wm->beta, WARP_PARAM_REDUCE_BITS) *
                (1 << WARP_PARAM_REDUCE_BITS));
  wm->gamma =
      (int16_t)(ROUND_POWER_OF_TWO_SIGNED(wm->gamma, WARP_PARAM_REDUCE_BITS) *
                (1 << WARP_PARAM_REDUCE_BITS));
  wm->delta =
      (int16_t)(ROUND_POWER_OF_TWO_SIGNED(wm->delta, WARP_PARAM_REDUCE_BITS) *
                (1 << WARP_PARAM_REDUCE_BITS));

  wm->use_affine_filter =
#if CONFIG_ACROSS_SCALE_WARP
      is_scaled
          ? 0
          :
#endif  // CONFIG_ACROSS_SCALE_WARP
          is_affine_shear_allowed(wm->alpha, wm->beta, wm->gamma, wm->delta);

  return 1;
}

// Reduce the precision of a warp model, ready for use in the warp filter
// and for storage. This should be called after the non-translational parameters
// are calculated, but before av1_set_warp_translation() or
// av1_get_shear_params() are called
//
// This also clamps the values, ensuring that hardware can store each value
// in a signed integer with (WARPEDMODEL_PREC_BITS - WARP_PARAM_REDUCE_BITS)
// total bits
void av1_reduce_warp_model(WarpedMotionParams *wm) {
  // Constrain parameters so that they lie within the range of +/- 1/2
  // relative to the identity model.
  //
  // In order to avoid needing one extra bit, we limit the maximum to one
  // unit less than 1/2, similarly to how an int<n> can only go up to
  // 2^(n-1) - 1. However, unlike an int<n>, the allowable range must
  // remain symmetric, so that ROTZOOM models can maintain the constraint
  // that wmmat[4] == -wmmat[3].
  const int max_value =
      (1 << (WARPEDMODEL_PREC_BITS - 1)) - (1 << WARP_PARAM_REDUCE_BITS);
  const int min_value = -max_value;

  for (int i = 2; i < 6; i++) {
    int offset = (i == 2 || i == 5) ? (1 << WARPEDMODEL_PREC_BITS) : 0;

    int original = wm->wmmat[i] - offset;
    int clamped = clamp(original, min_value, max_value);
    int rounded = ROUND_POWER_OF_TWO_SIGNED(clamped, WARP_PARAM_REDUCE_BITS) *
                  (1 << WARP_PARAM_REDUCE_BITS);

    wm->wmmat[i] = rounded + offset;
  }
}

// Check if a model is already properly reduced, according to the same logic
// used in av1_reduce_warp_model()
bool av1_is_warp_model_reduced(WarpedMotionParams *wm) {
  // Constrain parameters so that they lie within the range of +/- 1/2
  // relative to the identity model.
  //
  // In order to avoid needing one extra bit, we limit the maximum to one
  // unit less than 1/2, similarly to how an int<n> can only go up to
  // 2^(n-1) - 1. However, unlike an int<n>, the allowable range must
  // remain symmetric, so that ROTZOOM models can maintain the constraint
  // that wmmat[4] == -wmmat[3].
  const int max_value =
      (1 << (WARPEDMODEL_PREC_BITS - 1)) - (1 << WARP_PARAM_REDUCE_BITS);
  const int min_value = -max_value;

  for (int i = 2; i < 6; i++) {
    int offset = (i == 2 || i == 5) ? (1 << WARPEDMODEL_PREC_BITS) : 0;

    int original = wm->wmmat[i] - offset;
    int rounded = ROUND_POWER_OF_TWO_SIGNED(original, WARP_PARAM_REDUCE_BITS) *
                  (1 << WARP_PARAM_REDUCE_BITS);
    int clamped = clamp(rounded, min_value, max_value);

    if (clamped != original) return false;
  }

  return true;
}

/* The warp filter for ROTZOOM and AFFINE models works as follows:
   * Split the input into 8x8 blocks
   * For each block, project the point (4, 4) within the block, to get the
     overall block position. Split into integer and fractional coordinates,
     maintaining full WARPEDMODEL precision
   * Filter horizontally: Generate 15 rows of 8 pixels each. Each pixel gets a
     variable horizontal offset. This means that, while the rows of the
     intermediate buffer align with the rows of the *reference* image, the
     columns align with the columns of the *destination* image.
   * Filter vertically: Generate the output block (up to 8x8 pixels, but if the
     destination is too small we crop the output at this stage). Each pixel has
     a variable vertical offset, so that the resulting rows are aligned with
     the rows of the destination image.

   To accomplish these alignments, we factor the warp matrix as a
   product of two shear / asymmetric zoom matrices:
   / a b \  = /   1       0    \ * / 1+alpha  beta \
   \ c d /    \ gamma  1+delta /   \    0      1   /
   where a, b, c, d are wmmat[2], wmmat[3], wmmat[4], wmmat[5] respectively.
   The horizontal shear (with alpha and beta) is applied first,
   then the vertical shear (with gamma and delta) is applied second.

   The only limitation is that, to fit this in a fixed 8-tap filter size,
   the fractional pixel offsets must be at most +-1. Since the horizontal filter
   generates 15 rows of 8 columns, and the initial point we project is at (4, 4)
   within the block, the parameters must satisfy
   4 * |alpha| + 7 * |beta| <= 1   and   4 * |gamma| + 4 * |delta| <= 1
   for this filter to be applicable.

   Note: This function assumes that the caller has done all of the relevant
   checks, ie. that we have a ROTZOOM or AFFINE model, that wm[4] and wm[5]
   are set appropriately (if using a ROTZOOM model), and that alpha, beta,
   gamma, delta are all in range.

   TODO(rachelbarker): Maybe support scaled references?
*/
/* A note on hardware implementation:
    The warp filter is intended to be implementable using the same hardware as
    the high-precision convolve filters from the loop-restoration and
    convolve-round experiments.

    For a single filter stage, considering all of the coefficient sets for the
    warp filter and the regular convolution filter, an input in the range
    [0, 2^k - 1] is mapped into the range [-56 * (2^k - 1), 184 * (2^k - 1)]
    before rounding.

    Allowing for some changes to the filter coefficient sets, call the range
    [-64 * 2^k, 192 * 2^k]. Then, if we initialize the accumulator to 64 * 2^k,
    we can replace this by the range [0, 256 * 2^k], which can be stored in an
    unsigned value with 8 + k bits.

    This allows the derivation of the appropriate bit widths and offsets for
    the various intermediate values: If

    F := FILTER_BITS = 7 (or else the above ranges need adjusting)
         So a *single* filter stage maps a k-bit input to a (k + F + 1)-bit
         intermediate value.
    H := ROUND0_BITS
    V := VERSHEAR_REDUCE_PREC_BITS
    (and note that we must have H + V = 2*F for the output to have the same
     scale as the input)

    then we end up with the following offsets and ranges:
    Horizontal filter: Apply an offset of 1 << (bd + F - 1), sum fits into a
                       uint{bd + F + 1}
    After rounding: The values stored in 'tmp' fit into a uint{bd + F + 1 - H}.
    Vertical filter: Apply an offset of 1 << (bd + 2*F - H), sum fits into a
                     uint{bd + 2*F + 2 - H}
    After rounding: The final value, before undoing the offset, fits into a
                    uint{bd + 2}.

    Then we need to undo the offsets before clamping to a pixel. Note that,
    if we do this at the end, the amount to subtract is actually independent
    of H and V:

    offset to subtract = (1 << ((bd + F - 1) - H + F - V)) +
                         (1 << ((bd + 2*F - H) - V))
                      == (1 << (bd - 1)) + (1 << bd)

    This allows us to entirely avoid clamping in both the warp filter and
    the convolve-round experiment. As of the time of writing, the Wiener filter
    from loop-restoration can encode a central coefficient up to 216, which
    leads to a maximum value of about 282 * 2^k after applying the offset.
    So in that case we still need to clamp.
*/

void av1_highbd_warp_affine_c(const int32_t *mat, const uint16_t *ref,
                              int width, int height, int stride, uint16_t *pred,
                              int p_col, int p_row, int p_width, int p_height,
                              int p_stride, int subsampling_x,
                              int subsampling_y, int bd,
                              ConvolveParams *conv_params, int16_t alpha,
                              int16_t beta, int16_t gamma, int16_t delta) {
  const int left_limit = 0;
  const int right_limit = width - 1;
  const int top_limit = 0;
  const int bottom_limit = height - 1;
  int32_t tmp[15 * 8];
  const int reduce_bits_horiz = conv_params->round_0;
  const int reduce_bits_vert = conv_params->is_compound
                                   ? conv_params->round_1
                                   : 2 * FILTER_BITS - reduce_bits_horiz;
  const int max_bits_horiz = bd + FILTER_BITS + 1 - reduce_bits_horiz;
  const int offset_bits_horiz = bd + FILTER_BITS - 1;
  const int offset_bits_vert = bd + 2 * FILTER_BITS - reduce_bits_horiz;
  const int round_bits =
      2 * FILTER_BITS - conv_params->round_0 - conv_params->round_1;
  const int offset_bits = bd + 2 * FILTER_BITS - conv_params->round_0;
  const int use_wtd_comp_avg = is_uneven_wtd_comp_avg(conv_params);
  (void)max_bits_horiz;
  assert(IMPLIES(conv_params->is_compound, conv_params->dst != NULL));

  // Check that, even with 12-bit input, the intermediate values will fit
  // into an unsigned 16-bit intermediate array.
  assert(bd + FILTER_BITS + 2 - conv_params->round_0 <= 16);
  const int taps = 8;
  const int taps_half = taps >> 1;

  for (int i = p_row; i < p_row + p_height; i += 8) {
    for (int j = p_col; j < p_col + p_width; j += 8) {
      // Calculate the center of this 8x8 block,
      // project to luma coordinates (if in a subsampled chroma plane),
      // apply the affine transformation,
      // then convert back to the original coordinates (if necessary)
      const int32_t src_x = (j + 4) << subsampling_x;
      const int32_t src_y = (i + 4) << subsampling_y;
      const int64_t dst_x =
          (int64_t)mat[2] * src_x + (int64_t)mat[3] * src_y + (int64_t)mat[0];
      const int64_t dst_y =
          (int64_t)mat[4] * src_x + (int64_t)mat[5] * src_y + (int64_t)mat[1];
      const int64_t x4 = dst_x >> subsampling_x;
      const int64_t y4 = dst_y >> subsampling_y;

      const int32_t ix4 = (int32_t)(x4 >> WARPEDMODEL_PREC_BITS);
      int32_t sx4 = x4 & ((1 << WARPEDMODEL_PREC_BITS) - 1);
      const int32_t iy4 = (int32_t)(y4 >> WARPEDMODEL_PREC_BITS);
      int32_t sy4 = y4 & ((1 << WARPEDMODEL_PREC_BITS) - 1);

      sx4 += alpha * (-4) + beta * (-4);
      sy4 += gamma * (-4) + delta * (-4);

      sx4 &= ~((1 << WARP_PARAM_REDUCE_BITS) - 1);
      sy4 &= ~((1 << WARP_PARAM_REDUCE_BITS) - 1);

      // Horizontal filter
      for (int k = -7; k < 8; ++k) {
        const int iy = clamp(iy4 + k, top_limit, bottom_limit);

        int sx = sx4 + beta * (k + 4);
        for (int l = -4; l < 4; ++l) {
          int ix = ix4 + l - (taps_half - 1);
          const int offs = ROUND_POWER_OF_TWO(sx, WARPEDDIFF_PREC_BITS) +
                           3 * WARPEDPIXEL_PREC_SHIFTS;
          assert(offs >= 0 && offs <= WARPEDPIXEL_PREC_SHIFTS * 7);
          const int16_t *coeffs = av1_warped_filter[offs];
          int32_t sum = 1 << offset_bits_horiz;
          for (int m = 0; m < taps; ++m) {
            const int sample_x = clamp(ix + m, left_limit, right_limit);
            sum += ref[iy * stride + sample_x] * coeffs[m];
          }
          sum = ROUND_POWER_OF_TWO(sum, reduce_bits_horiz);
          assert(0 <= sum && sum < (1 << max_bits_horiz));
          tmp[(k + 7) * 8 + (l + 4)] = sum;
          sx += alpha;
        }
      }

      // Vertical filter
      for (int k = -4; k < AOMMIN(4, p_row + p_height - i - 4); ++k) {
        int sy = sy4 + delta * (k + 4);
        for (int l = -4; l < AOMMIN(4, p_col + p_width - j - 4); ++l) {
          const int offs = ROUND_POWER_OF_TWO(sy, WARPEDDIFF_PREC_BITS) +
                           3 * WARPEDPIXEL_PREC_SHIFTS;
          assert(offs >= 0 && offs <= WARPEDPIXEL_PREC_SHIFTS * 7);
          const int16_t *coeffs = av1_warped_filter[offs];

          int32_t sum = 1 << offset_bits_vert;
          for (int m = 0; m < taps; ++m) {
            sum += tmp[(k + m + 4) * 8 + (l + 4)] * coeffs[m];
          }

          if (conv_params->is_compound) {
            CONV_BUF_TYPE *p =
                &conv_params
                     ->dst[(i - p_row + k + 4) * conv_params->dst_stride +
                           (j - p_col + l + 4)];
            sum = ROUND_POWER_OF_TWO(sum, reduce_bits_vert);
            if (conv_params->do_average) {
              uint16_t *dst16 =
                  &pred[(i - p_row + k + 4) * p_stride + (j - p_col + l + 4)];
              int32_t tmp32 = *p;
              if (use_wtd_comp_avg) {
                tmp32 = tmp32 * conv_params->fwd_offset +
                        sum * conv_params->bck_offset;
                tmp32 = tmp32 >> DIST_PRECISION_BITS;
              } else {
                tmp32 += sum;
                tmp32 = tmp32 >> 1;
              }
              tmp32 = tmp32 - (1 << (offset_bits - conv_params->round_1)) -
                      (1 << (offset_bits - conv_params->round_1 - 1));
              *dst16 =
                  clip_pixel_highbd(ROUND_POWER_OF_TWO(tmp32, round_bits), bd);
            } else {
              *p = sum;
            }
          } else {
            uint16_t *p =
                &pred[(i - p_row + k + 4) * p_stride + (j - p_col + l + 4)];
            sum = ROUND_POWER_OF_TWO(sum, reduce_bits_vert);
            assert(0 <= sum && sum < (1 << (bd + 2)));
            *p = clip_pixel_highbd(sum - (1 << (bd - 1)) - (1 << bd), bd);
          }
          sy += gamma;
        }
      }
    }
  }
}

/* Extended-range warp filter, used for strong warps where the regular
   affine filter (av1_highbd_warp_affine) is not usable.

   This filter operates by splitting the prediction unit into 4x4 pixel
   chunks. Then, for each chunk, the following process is applied:

   * Compute the effective motion vector at the center of the 4x4 chunk
     (actually at pixel offset (1, 1) into the chunk), at 1/64 pel precision

   * Translate the entire 4x4 pixel chunk by this compute motion vector

   This generates a prediction of intermediate quality - better than translating
   the prediction unit as a whole, but worse than a full affine shear.
   However, it is able to handle any encode-able warp model, and is not
   constrained in the same way as the regular warp filter.

   Note that this will produce blocking between adjacent 4x4 units, so we need
   apply some form of deblocking to the output of this function. This is handled
   separately.
*/
void av1_ext_highbd_warp_affine_c(const int32_t *mat, const uint16_t *ref,
                                  int width, int height, int stride,
                                  uint16_t *pred, int p_col, int p_row,
                                  int p_width, int p_height, int p_stride,
                                  int subsampling_x, int subsampling_y, int bd,
                                  ConvolveParams *conv_params,
                                  int use_warp_bd_box,
                                  WarpBoundaryBox *warp_bd_box) {
  int32_t im_block[(4 + EXT_WARP_TAPS - 1) * 4];
  const int reduce_bits_horiz = conv_params->round_0;
  const int reduce_bits_vert = conv_params->is_compound
                                   ? conv_params->round_1
                                   : 2 * FILTER_BITS - reduce_bits_horiz;
  const int max_bits_horiz = bd + FILTER_BITS + 1 - reduce_bits_horiz;
  const int offset_bits_horiz = bd + FILTER_BITS - 1;
  const int offset_bits_vert = bd + 2 * FILTER_BITS - reduce_bits_horiz;
  const int round_bits =
      2 * FILTER_BITS - conv_params->round_0 - conv_params->round_1;
  const int offset_bits = bd + 2 * FILTER_BITS - conv_params->round_0;
  const int use_wtd_comp_avg = is_uneven_wtd_comp_avg(conv_params);
  (void)max_bits_horiz;
  assert(IMPLIES(conv_params->is_compound, conv_params->dst != NULL));

  // Check that, even with 12-bit input, the intermediate values will fit
  // into an unsigned 16-bit intermediate array.
  assert(bd + FILTER_BITS + 2 - conv_params->round_0 <= 16);
  const int taps = EXT_WARP_TAPS;
  const int taps_half = taps >> 1;

  int left_limit = 0;
  int right_limit = width - 1;
  int top_limit = 0;
  int bottom_limit = height - 1;
  int warp_bd_box_mem_stride = MAX_WARP_BD_SIZE;
  int box_idx, x_loc, y_loc;

  for (int i = p_row; i < p_row + p_height; i += 4) {
    for (int j = p_col; j < p_col + p_width; j += 4) {
      if (use_warp_bd_box) {
        x_loc = j - p_col;
        y_loc = i - p_row;
        box_idx = (x_loc >> 3) + (y_loc >> 3) * warp_bd_box_mem_stride;
        left_limit = warp_bd_box[box_idx].x0;
        right_limit = warp_bd_box[box_idx].x1 - 1;
        top_limit = warp_bd_box[box_idx].y0;
        bottom_limit = warp_bd_box[box_idx].y1 - 1;
      }
      // Calculate the center of this 4x4 block,
      // project to luma coordinates (if in a subsampled chroma plane),
      // apply the affine transformation,
      // then convert back to the original coordinates (if necessary)
      const int32_t src_x = (j + 2) << subsampling_x;
      const int32_t src_y = (i + 2) << subsampling_y;
      const int64_t dst_x =
          (int64_t)mat[2] * src_x + (int64_t)mat[3] * src_y + (int64_t)mat[0];
      const int64_t dst_y =
          (int64_t)mat[4] * src_x + (int64_t)mat[5] * src_y + (int64_t)mat[1];
      const int64_t x4 = dst_x >> subsampling_x;
      const int64_t y4 = dst_y >> subsampling_y;

      const int32_t ix4 = (int32_t)(x4 >> WARPEDMODEL_PREC_BITS);
      int32_t sx4 = x4 & ((1 << WARPEDMODEL_PREC_BITS) - 1);
      const int32_t iy4 = (int32_t)(y4 >> WARPEDMODEL_PREC_BITS);
      int32_t sy4 = y4 & ((1 << WARPEDMODEL_PREC_BITS) - 1);

      // Horizontal Filter
      const int offs_x = ROUND_POWER_OF_TWO(sx4, EXT_WARP_ROUND_BITS);
      assert(offs_x >= 0 && offs_x <= EXT_WARP_PHASES);
      const int16_t *coeffs_x = av1_ext_warped_filter[offs_x];

      for (int k = -(taps_half + 1); k < taps_half + 2; ++k) {
        const int iy = clamp(iy4 + k, top_limit, bottom_limit);

        for (int l = -2; l < 2; ++l) {
          int ix = ix4 + l - (taps_half - 1);

          int32_t sum = 1 << offset_bits_horiz;
          for (int m = 0; m < taps; ++m) {
            const int sample_x = clamp(ix + m, left_limit, right_limit);
            sum += ref[iy * stride + sample_x] * coeffs_x[m];
          }
          sum = ROUND_POWER_OF_TWO(sum, reduce_bits_horiz);
          assert(0 <= sum && sum < (1 << max_bits_horiz));
          im_block[(k + (taps_half + 1)) * 4 + (l + 2)] = sum;
        }
      }

      // Vertical filter
      const int offs_y = ROUND_POWER_OF_TWO(sy4, WARPEDDIFF_PREC_BITS);
      assert(offs_y >= 0 && offs_y <= WARPEDPIXEL_PREC_SHIFTS);
      const int16_t *coeffs_y = av1_ext_warped_filter[offs_y];

      for (int k = -2; k < AOMMIN(2, p_row + p_height - i - 2); ++k) {
        for (int l = -2; l < AOMMIN(2, p_col + p_width - j - 2); ++l) {
          int32_t sum = 1 << offset_bits_vert;
          for (int m = 0; m < taps; ++m) {
            sum += im_block[(k + m + 2) * 4 + (l + 2)] * coeffs_y[m];
          }

          if (conv_params->is_compound) {
            CONV_BUF_TYPE *p =
                &conv_params
                     ->dst[(i - p_row + k + 2) * conv_params->dst_stride +
                           (j - p_col + l + 2)];
            sum = ROUND_POWER_OF_TWO(sum, reduce_bits_vert);
            if (conv_params->do_average) {
              uint16_t *dst16 =
                  &pred[(i - p_row + k + 2) * p_stride + (j - p_col + l + 2)];
              int32_t tmp32 = *p;
              if (use_wtd_comp_avg) {
                tmp32 = tmp32 * conv_params->fwd_offset +
                        sum * conv_params->bck_offset;
                tmp32 = tmp32 >> DIST_PRECISION_BITS;
              } else {
                tmp32 += sum;
                tmp32 = tmp32 >> 1;
              }
              tmp32 = tmp32 - (1 << (offset_bits - conv_params->round_1)) -
                      (1 << (offset_bits - conv_params->round_1 - 1));
              *dst16 =
                  clip_pixel_highbd(ROUND_POWER_OF_TWO(tmp32, round_bits), bd);
            } else {
              *p = sum;
            }
          } else {
            uint16_t *p =
                &pred[(i - p_row + k + 2) * p_stride + (j - p_col + l + 2)];
            sum = ROUND_POWER_OF_TWO(sum, reduce_bits_vert);
            assert(0 <= sum && sum < (1 << (bd + 2)));
            *p = clip_pixel_highbd(sum - (1 << (bd - 1)) - (1 << bd), bd);
          }
        }
      }
    }
  }
}

#if CONFIG_ACROSS_SCALE_WARP
void av1_ext_highbd_warp_affine_scaled_c(
    const int32_t *mat, const uint16_t *ref, int width, int height, int stride,
    uint16_t *pred, int p_col, int p_row, int p_width, int p_height,
    int p_stride, int subsampling_x, int subsampling_y, int bd,
    ConvolveParams *conv_params, const struct scale_factors *sf,
    int use_warp_bd_box, WarpBoundaryBox *warp_bd_box) {
  //  int32_t im_block[(4 + EXT_WARP_TAPS - 1) * 4];
  int32_t im_block[(2 * 4 + EXT_WARP_TAPS) * 4];
  const int reduce_bits_horiz = conv_params->round_0;
  const int reduce_bits_vert = conv_params->is_compound
                                   ? conv_params->round_1
                                   : 2 * FILTER_BITS - reduce_bits_horiz;
  const int max_bits_horiz = bd + FILTER_BITS + 1 - reduce_bits_horiz;
  const int offset_bits_horiz = bd + FILTER_BITS - 1;
  const int offset_bits_vert = bd + 2 * FILTER_BITS - reduce_bits_horiz;
  const int round_bits =
      2 * FILTER_BITS - conv_params->round_0 - conv_params->round_1;
  const int offset_bits = bd + 2 * FILTER_BITS - conv_params->round_0;
  const int use_wtd_comp_avg = is_uneven_wtd_comp_avg(conv_params);
  (void)max_bits_horiz;
  assert(IMPLIES(conv_params->is_compound, conv_params->dst != NULL));

  // Check that, even with 12-bit input, the intermediate values will fit
  // into an unsigned 16-bit intermediate array.
  assert(bd + FILTER_BITS + 2 - conv_params->round_0 <= 16);
  const int taps = EXT_WARP_TAPS;
  const int taps_half = taps >> 1;
  const int fo_vert = taps_half - 1;
  const int fo_horiz = taps_half - 1;

  int left_limit = 0;
  int right_limit = width - 1;
  int top_limit = 0;
  int bottom_limit = height - 1;
  int warp_bd_box_mem_stride = MAX_WARP_BD_SIZE;
  int box_idx, x_loc, y_loc;
  assert(use_warp_bd_box);

  for (int i = p_row; i < p_row + p_height; i += 4) {
    for (int j = p_col; j < p_col + p_width; j += 4) {
      if (use_warp_bd_box) {
        x_loc = j - p_col;
        y_loc = i - p_row;
        box_idx = (x_loc >> 3) + (y_loc >> 3) * warp_bd_box_mem_stride;
        left_limit = warp_bd_box[box_idx].x0;
        right_limit = warp_bd_box[box_idx].x1 - 1;
        top_limit = warp_bd_box[box_idx].y0;
        bottom_limit = warp_bd_box[box_idx].y1 - 1;
      }
      // Calculate the center of this 4x4 block,
      // project to luma coordinates (if in a subsampled chroma plane),
      // apply the affine transformation,
      // then convert back to the original coordinates (if necessary)
      const int32_t src_x = (j + 2) << subsampling_x;
      const int32_t src_y = (i + 2) << subsampling_y;
      const int64_t dst_x =
          (int64_t)mat[2] * src_x + (int64_t)mat[3] * src_y + (int64_t)mat[0];
      const int64_t dst_y =
          (int64_t)mat[4] * src_x + (int64_t)mat[5] * src_y + (int64_t)mat[1];

      // Top left location in ref frame of a 4x4 block
      // We need to do (- 2 * (1 << WARPEDMODEL_PREC_BITS)) becasue actual dst_x
      // and dst_y is computed at the center of the 4x4 block
      const int64_t x4_org =
          (dst_x >> subsampling_x) - 2 * (1 << WARPEDMODEL_PREC_BITS);
      const int64_t y4_org =
          (dst_y >> subsampling_y) - 2 * (1 << WARPEDMODEL_PREC_BITS);

      const int64_t x4 =
          sf->scale_value_warp_x(x4_org, sf);  // 16 bit sub-pel precision
      const int64_t y4 =
          sf->scale_value_warp_y(y4_org, sf);  // 16 bit sub-pel precision

      const int32_t x_step_qn = sf->x_step_q4
                                << (WARPEDMODEL_PREC_BITS - SCALE_SUBPEL_BITS);
      const int32_t y_step_qn = sf->y_step_q4
                                << (WARPEDMODEL_PREC_BITS - SCALE_SUBPEL_BITS);

      const int32_t iy4 = (int32_t)(y4 >> WARPEDMODEL_PREC_BITS);
      int32_t subpel_y_qn = y4 & ((1 << WARPEDMODEL_PREC_BITS) - 1);

      // Horizontal Filter

      int im_h =
          (((4 - 1) * y_step_qn + subpel_y_qn) >> WARPEDMODEL_PREC_BITS) + taps;
      int im_stride = 4;
      int init_y = iy4 - fo_vert;

      for (int y = 0; y < im_h; ++y) {
        const int y_pos = init_y + y;
        const int iy = clamp(y_pos, top_limit, bottom_limit);
        int64_t x_qn = x4;
        for (int x = 0; x < 4; ++x, x_qn += x_step_qn) {
          // Extract the filter parameters
          int32_t sx4 = x_qn & ((1 << WARPEDMODEL_PREC_BITS) - 1);
          const int offs_x = ROUND_POWER_OF_TWO(sx4, EXT_WARP_ROUND_BITS);
          assert(offs_x >= 0 && offs_x <= EXT_WARP_PHASES);
          const int16_t *coeffs_x = av1_ext_warped_filter[offs_x];

          // position in the unit of integer pixel
          int ix = (int32_t)(x_qn >> WARPEDMODEL_PREC_BITS);  // init_x + x;

          int32_t sum = 1 << offset_bits_horiz;
          for (int m = 0; m < taps; ++m) {
            const int sample_x =
                clamp(ix - fo_horiz + m, left_limit, right_limit);
            sum += ref[iy * stride + sample_x] * coeffs_x[m];
          }
          sum = ROUND_POWER_OF_TWO(sum, reduce_bits_horiz);
          assert(0 <= sum && sum < (1 << max_bits_horiz));
          im_block[y * im_stride + x] = sum;
        }
      }

      // Vertical filter
      int32_t *src_vert = im_block + fo_vert * im_stride;

      for (int x = 0; x < AOMMIN(4, p_col + p_width - j); ++x) {
        int64_t y_qn = subpel_y_qn;
        for (int y = 0; y < AOMMIN(4, p_row + p_height - i);
             ++y, y_qn += y_step_qn) {
          // Extract the filter parameters
          int32_t sy4 = y_qn & ((1 << WARPEDMODEL_PREC_BITS) - 1);
          const int offs_y = ROUND_POWER_OF_TWO(sy4, EXT_WARP_ROUND_BITS);
          assert(offs_y >= 0 && offs_y <= EXT_WARP_PHASES);
          const int16_t *coeffs_y = av1_ext_warped_filter[offs_y];

          const int32_t *src_vert_y =
              &src_vert[(y_qn >> WARPEDMODEL_PREC_BITS) * im_stride];

          int32_t sum = 1 << offset_bits_vert;
          for (int m = 0; m < taps; ++m) {
            sum += src_vert_y[(m - fo_vert) * im_stride] * coeffs_y[m];
          }

          if (conv_params->is_compound) {
            CONV_BUF_TYPE *p =
                &conv_params->dst[(i - p_row + y) * conv_params->dst_stride +
                                  (j - p_col + x)];
            sum = ROUND_POWER_OF_TWO(sum, reduce_bits_vert);
            if (conv_params->do_average) {
              uint16_t *dst16 =
                  &pred[(i - p_row + y) * p_stride + (j - p_col + x)];
              int32_t tmp32 = *p;
              if (use_wtd_comp_avg) {
                tmp32 = tmp32 * conv_params->fwd_offset +
                        sum * conv_params->bck_offset;
                tmp32 = tmp32 >> DIST_PRECISION_BITS;
              } else {
                tmp32 += sum;
                tmp32 = tmp32 >> 1;
              }
              tmp32 = tmp32 - (1 << (offset_bits - conv_params->round_1)) -
                      (1 << (offset_bits - conv_params->round_1 - 1));
              *dst16 =
                  clip_pixel_highbd(ROUND_POWER_OF_TWO(tmp32, round_bits), bd);
            } else {
              *p = sum;
            }
          } else {
            uint16_t *p = &pred[(i - p_row + y) * p_stride + (j - p_col + x)];
            sum = ROUND_POWER_OF_TWO(sum, reduce_bits_vert);
            assert(0 <= sum && sum < (1 << (bd + 2)));
            *p = clip_pixel_highbd(sum - (1 << (bd - 1)) - (1 << bd), bd);
          }
        }
        src_vert++;
      }
    }
  }
}
#endif  // CONFIG_ACROSS_SCALE_WARP

void highbd_warp_plane(WarpedMotionParams *wm, const uint16_t *const ref,
                       int width, int height, int stride, uint16_t *const pred,
                       int p_col, int p_row, int p_width, int p_height,
                       int p_stride, int subsampling_x, int subsampling_y,
                       int bd, ConvolveParams *conv_params
#if CONFIG_ACROSS_SCALE_WARP
                       ,
                       const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
                       ,
                       int use_warp_bd_box, WarpBoundaryBox *warp_bd_box) {

#if CONFIG_ACROSS_SCALE_WARP
  const int is_scaled = sf ? av1_is_scaled(sf) : 0;
#endif  // CONFIG_ACROSS_SCALE_WARP

  assert(wm->wmtype <= AFFINE);
  if (wm->wmtype == ROTZOOM) {
    wm->wmmat[5] = wm->wmmat[2];
    wm->wmmat[4] = -wm->wmmat[3];
  }
  const int32_t *const mat = wm->wmmat;
  const int16_t alpha = wm->alpha;
  const int16_t beta = wm->beta;
  const int16_t gamma = wm->gamma;
  const int16_t delta = wm->delta;

#if CONFIG_ACROSS_SCALE_WARP
  assert(IMPLIES(!is_scaled,
                 wm->use_affine_filter ==
                     is_affine_shear_allowed(alpha, beta, gamma, delta)));
  assert(IMPLIES(is_scaled, !wm->use_affine_filter));
#else
  assert(wm->use_affine_filter ==
         is_affine_shear_allowed(alpha, beta, gamma, delta));
#endif  // CONFIG_ACROSS_SCALE_WARP

  if (!wm->use_affine_filter || p_width < 8 || p_height < 8
#if CONFIG_ACROSS_SCALE_WARP
      || is_scaled
#endif  // CONFIG_ACROSS_SCALE_WARP
  ) {
    WarpedMotionParams wm_scaled = *wm;
#if CONFIG_ACROSS_SCALE_WARP
    if (is_scaled) {
      av1_ext_highbd_warp_affine_scaled_c(
          &wm_scaled.wmmat[0], ref, width, height, stride, pred, p_col, p_row,
          p_width, p_height, p_stride, subsampling_x, subsampling_y, bd,
          conv_params, sf, use_warp_bd_box, warp_bd_box);
    } else {
#endif  // CONFIG_ACROSS_SCALE_WARP
      av1_ext_highbd_warp_affine(&wm_scaled.wmmat[0], ref, width, height,
                                 stride, pred, p_col, p_row, p_width, p_height,
                                 p_stride, subsampling_x, subsampling_y, bd,
                                 conv_params, use_warp_bd_box, warp_bd_box);
#if CONFIG_ACROSS_SCALE_WARP
    }
#endif  // CONFIG_ACROSS_SCALE_WARP

  } else {
    av1_highbd_warp_affine(mat, ref, width, height, stride, pred, p_col, p_row,
                           p_width, p_height, p_stride, subsampling_x,
                           subsampling_y, bd, conv_params, alpha, beta, gamma,
                           delta);
  }
}

void av1_warp_plane(WarpedMotionParams *wm, int bd, const uint16_t *ref,
                    int width, int height, int stride, uint16_t *pred,
                    int p_col, int p_row, int p_width, int p_height,
                    int p_stride, int subsampling_x, int subsampling_y,
                    ConvolveParams *conv_params
#if CONFIG_ACROSS_SCALE_WARP
                    ,
                    const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
                    ,
                    int use_warp_bd_box, WarpBoundaryBox *warp_bd_box) {
  highbd_warp_plane(wm, ref, width, height, stride, pred, p_col, p_row, p_width,
                    p_height, p_stride, subsampling_x, subsampling_y, bd,
                    conv_params
#if CONFIG_ACROSS_SCALE_WARP
                    ,
                    sf
#endif  // CONFIG_ACROSS_SCALE_WARP
                    ,
                    use_warp_bd_box, warp_bd_box);
}

#define LS_MV_MAX 256  // max mv in 1/8-pel
// Use LS_STEP = 8 so that 2 less bits needed for A, Bx, By.
#define LS_STEP 8

// Assuming LS_MV_MAX is < MAX_SB_SIZE * 8,
// the precision needed is:
//   (MAX_SB_SIZE_LOG2 + 3) [for sx * sx magnitude] +
//   (MAX_SB_SIZE_LOG2 + 4) [for sx * dx magnitude] +
//   1 [for sign] +
//   LEAST_SQUARES_SAMPLES_MAX_BITS
//        [for adding up to LEAST_SQUARES_SAMPLES_MAX samples]
// The value is 23
#define LS_MAT_RANGE_BITS \
  ((MAX_SB_SIZE_LOG2 + 4) * 2 + LEAST_SQUARES_SAMPLES_MAX_BITS)

// Bit-depth reduction from the full-range
#define LS_MAT_DOWN_BITS 2

// bits range of A, Bx and By after downshifting
#define LS_MAT_BITS (LS_MAT_RANGE_BITS - LS_MAT_DOWN_BITS)
#define LS_MAT_MIN (-(1 << (LS_MAT_BITS - 1)))
#define LS_MAT_MAX ((1 << (LS_MAT_BITS - 1)) - 1)

// By setting LS_STEP = 8, the least 2 bits of every elements in A, Bx, By are
// 0. So, we can reduce LS_MAT_RANGE_BITS(2) bits here.
#define LS_SQUARE(a)                                              \
  (((a) * (a) * 4 + (a) * 4 * LS_STEP + LS_STEP * LS_STEP * 2) >> \
   (2 + LS_MAT_DOWN_BITS))
#define LS_PRODUCT1(a, b)                                             \
  (((a) * (b) * 4 + ((a) + (b)) * 2 * LS_STEP + LS_STEP * LS_STEP) >> \
   (2 + LS_MAT_DOWN_BITS))
#define LS_PRODUCT2(a, b)                                                 \
  (((a) * (b) * 4 + ((a) + (b)) * 2 * LS_STEP + LS_STEP * LS_STEP * 2) >> \
   (2 + LS_MAT_DOWN_BITS))

#define USE_LIMITED_PREC_MULT 0

#if USE_LIMITED_PREC_MULT

#define MUL_PREC_BITS 16
static uint16_t resolve_multiplier_64(uint64_t D, int16_t *shift) {
  int msb = 0;
  uint16_t mult = 0;
  *shift = 0;
  if (D != 0) {
    msb = (int16_t)((D >> 32) ? get_msb((unsigned int)(D >> 32)) + 32
                              : get_msb((unsigned int)D));
    if (msb >= MUL_PREC_BITS) {
      mult = (uint16_t)ROUND_POWER_OF_TWO_64(D, msb + 1 - MUL_PREC_BITS);
      *shift = msb + 1 - MUL_PREC_BITS;
    } else {
      mult = (uint16_t)D;
      *shift = 0;
    }
  }
  return mult;
}

static int32_t get_mult_shift_ndiag(int64_t Px, int16_t iDet, int shift) {
  int32_t ret;
  int16_t mshift;
  uint16_t Mul = resolve_multiplier_64(llabs(Px), &mshift);
  int32_t v = (int32_t)Mul * (int32_t)iDet * (Px < 0 ? -1 : 1);
  shift -= mshift;
  if (shift > 0) {
    return (int32_t)clamp(ROUND_POWER_OF_TWO_SIGNED(v, shift),
                          -WARPEDMODEL_NONDIAGAFFINE_CLAMP + 1,
                          WARPEDMODEL_NONDIAGAFFINE_CLAMP - 1);
  } else {
    return (int32_t)clamp(v * (1 << (-shift)),
                          -WARPEDMODEL_NONDIAGAFFINE_CLAMP + 1,
                          WARPEDMODEL_NONDIAGAFFINE_CLAMP - 1);
  }
  return ret;
}

static int32_t get_mult_shift_diag(int64_t Px, int16_t iDet, int shift) {
  int16_t mshift;
  uint16_t Mul = resolve_multiplier_64(llabs(Px), &mshift);
  int32_t v = (int32_t)Mul * (int32_t)iDet * (Px < 0 ? -1 : 1);
  shift -= mshift;
  if (shift > 0) {
    return (int32_t)clamp(
        ROUND_POWER_OF_TWO_SIGNED(v, shift),
        (1 << WARPEDMODEL_PREC_BITS) - WARPEDMODEL_NONDIAGAFFINE_CLAMP + 1,
        (1 << WARPEDMODEL_PREC_BITS) + WARPEDMODEL_NONDIAGAFFINE_CLAMP - 1);
  } else {
    return (int32_t)clamp(
        v * (1 << (-shift)),
        (1 << WARPEDMODEL_PREC_BITS) - WARPEDMODEL_NONDIAGAFFINE_CLAMP + 1,
        (1 << WARPEDMODEL_PREC_BITS) + WARPEDMODEL_NONDIAGAFFINE_CLAMP - 1);
  }
}
#endif  // USE_LIMITED_PREC_MULT

static int find_affine_int(int np, const int *pts1, const int *pts2,
                           BLOCK_SIZE bsize, MV mv, WarpedMotionParams *wm,
                           int mi_row, int mi_col
#if CONFIG_ACROSS_SCALE_WARP
                           ,
                           const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
) {
  int32_t A[2][2] = { { 0, 0 }, { 0, 0 } };
  int32_t Bx[2] = { 0, 0 };
  int32_t By[2] = { 0, 0 };

  const int bw = block_size_wide[bsize];
  const int bh = block_size_high[bsize];
  const int rsuy = bh / 2 - 1;
  const int rsux = bw / 2 - 1;
  const int suy = rsuy * 8;
  const int sux = rsux * 8;
  const int duy = suy + mv.row;
  const int dux = sux + mv.col;

  // Assume the center pixel of the block has exactly the same motion vector
  // as transmitted for the block. First shift the origin of the source
  // points to the block center, and the origin of the destination points to
  // the block center added to the motion vector transmitted.
  // Let (xi, yi) denote the source points and (xi', yi') denote destination
  // points after origin shfifting, for i = 0, 1, 2, .... n-1.
  // Then if  P = [x0, y0,
  //               x1, y1
  //               x2, y1,
  //                ....
  //              ]
  //          q = [x0', x1', x2', ... ]'
  //          r = [y0', y1', y2', ... ]'
  // the least squares problems that need to be solved are:
  //          [h1, h2]' = inv(P'P)P'q and
  //          [h3, h4]' = inv(P'P)P'r
  // where the affine transformation is given by:
  //          x' = h1.x + h2.y
  //          y' = h3.x + h4.y
  //
  // The loop below computes: A = P'P, Bx = P'q, By = P'r
  // We need to just compute inv(A).Bx and inv(A).By for the solutions.
  // Contribution from neighbor block
  for (int i = 0; i < np; i++) {
    const int dx = pts2[i * 2] - dux;
    const int dy = pts2[i * 2 + 1] - duy;
    const int sx = pts1[i * 2] - sux;
    const int sy = pts1[i * 2 + 1] - suy;
    // (TODO)yunqing: This comparison wouldn't be necessary if the sample
    // selection is done in find_samples(). Also, global offset can be removed
    // while collecting samples.
    if (abs(sx - dx) < LS_MV_MAX && abs(sy - dy) < LS_MV_MAX) {
      A[0][0] += LS_SQUARE(sx);
      A[0][1] += LS_PRODUCT1(sx, sy);
      A[1][1] += LS_SQUARE(sy);
      Bx[0] += LS_PRODUCT2(sx, dx);
      Bx[1] += LS_PRODUCT1(sy, dx);
      By[0] += LS_PRODUCT1(sx, dy);
      By[1] += LS_PRODUCT2(sy, dy);
    }
  }

  // Just for debugging, and can be removed later.
  assert(A[0][0] >= LS_MAT_MIN && A[0][0] <= LS_MAT_MAX);
  assert(A[0][1] >= LS_MAT_MIN && A[0][1] <= LS_MAT_MAX);
  assert(A[1][1] >= LS_MAT_MIN && A[1][1] <= LS_MAT_MAX);
  assert(Bx[0] >= LS_MAT_MIN && Bx[0] <= LS_MAT_MAX);
  assert(Bx[1] >= LS_MAT_MIN && Bx[1] <= LS_MAT_MAX);
  assert(By[0] >= LS_MAT_MIN && By[0] <= LS_MAT_MAX);
  assert(By[1] >= LS_MAT_MIN && By[1] <= LS_MAT_MAX);

  // Compute Determinant of A
  const int64_t Det = (int64_t)A[0][0] * A[1][1] - (int64_t)A[0][1] * A[0][1];
  if (Det == 0) return 1;

  int16_t shift;
  int16_t iDet = resolve_divisor_64(llabs(Det), &shift) * (Det < 0 ? -1 : 1);
  shift -= WARPEDMODEL_PREC_BITS;
  if (shift < 0) {
    iDet <<= (-shift);
    shift = 0;
  }

  int64_t Px[2], Py[2];
  // These divided by the Det, are the least squares solutions
  Px[0] = (int64_t)A[1][1] * Bx[0] - (int64_t)A[0][1] * Bx[1];
  Px[1] = -(int64_t)A[0][1] * Bx[0] + (int64_t)A[0][0] * Bx[1];
  Py[0] = (int64_t)A[1][1] * By[0] - (int64_t)A[0][1] * By[1];
  Py[1] = -(int64_t)A[0][1] * By[0] + (int64_t)A[0][0] * By[1];

  wm->wmmat[2] =
      clamp64_to_32(ROUND_POWER_OF_TWO_SIGNED_64(Px[0] * iDet, shift));
  wm->wmmat[3] =
      clamp64_to_32(ROUND_POWER_OF_TWO_SIGNED_64(Px[1] * iDet, shift));
  wm->wmmat[4] =
      clamp64_to_32(ROUND_POWER_OF_TWO_SIGNED_64(Py[0] * iDet, shift));
  wm->wmmat[5] =
      clamp64_to_32(ROUND_POWER_OF_TWO_SIGNED_64(Py[1] * iDet, shift));

  av1_reduce_warp_model(wm);
  // check compatibility with the fast warp filter
  if (!av1_get_shear_params(wm
#if CONFIG_ACROSS_SCALE_WARP
                            ,
                            sf
#endif  // CONFIG_ACROSS_SCALE_WARP
                            ))
    return 1;
  av1_set_warp_translation(mi_row, mi_col, bsize, mv, wm);
  wm->wmmat[6] = wm->wmmat[7] = 0;
  return 0;
}

int av1_find_projection(int np, const int *pts1, const int *pts2,
                        BLOCK_SIZE bsize, MV mv, WarpedMotionParams *wm_params,
                        int mi_row, int mi_col
#if CONFIG_ACROSS_SCALE_WARP
                        ,
                        const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
) {
  assert(wm_params->wmtype == AFFINE);

#if CONFIG_ACROSS_SCALE_WARP
  if (find_affine_int(np, pts1, pts2, bsize, mv, wm_params, mi_row, mi_col, sf

                      )) {
    wm_params->invalid = 1;
    return 1;
  }
  wm_params->invalid = 0;
#else
  if (find_affine_int(np, pts1, pts2, bsize, mv, wm_params, mi_row, mi_col))
    return 1;
#endif  // CONFIG_ACROSS_SCALE_WARP

  return 0;
}

/* Given a neighboring block's warp model and the motion vector at the center
   of the current block, construct a new warp model which is continuous with
   the neighbor at the common edge but which has the given motion vector at
   the center of the block.

    The `neighbor_is_above` parameter should be true if the neighboring block
    is above the current block, or false if it is to the left of the current
    block.

    Returns 0 if  the resulting model can be used with the warp filter,
    1 if not.
*/
int av1_extend_warp_model(const bool neighbor_is_above, const BLOCK_SIZE bsize,
                          const MV *center_mv, const int mi_row,
                          const int mi_col,
                          const WarpedMotionParams *neighbor_wm,
                          WarpedMotionParams *wm_params
#if CONFIG_ACROSS_SCALE_WARP
                          ,
                          const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
) {
  const int half_width_log2 = mi_size_wide_log2[bsize] + MI_SIZE_LOG2 - 1;
  const int half_height_log2 = mi_size_high_log2[bsize] + MI_SIZE_LOG2 - 1;
  const int center_x = (mi_col * MI_SIZE) + (1 << half_width_log2) - 1;
  const int center_y = (mi_row * MI_SIZE) + (1 << half_height_log2) - 1;
  // Calculate the point (at warp model precision) where the center of the
  // current block should be mapped to
  int64_t proj_center_x = ((int64_t)center_x * (1 << WARPEDMODEL_PREC_BITS)) +
                          (center_mv->col * (1 << (WARPEDMODEL_PREC_BITS - 3)));
  int64_t proj_center_y = ((int64_t)center_y * (1 << WARPEDMODEL_PREC_BITS)) +
                          (center_mv->row * (1 << (WARPEDMODEL_PREC_BITS - 3)));

  *wm_params = default_warp_params;
  wm_params->wmtype = AFFINE;

  if (neighbor_is_above) {
    // We want to construct a model which will project the block center
    // according to the signaled motion vector, and which matches the
    // neighbor's warp model along the top edge of the block.
    //
    // We do this in three steps:
    // 1) Since the models should match along the whole top edge of the block,
    //    the coefficients of x in the warp model must be the same as for the
    //    neighboring block
    //
    // 2) The coefficients of y in the warp model can then be determined from
    //    the difference in projected positions between a point on the edge
    //    and the block center
    //
    // 3) The translational part can be derived (outside of this `if`)
    //    by subtracting the linear part of the model from the signaled MV.

    wm_params->wmmat[2] = neighbor_wm->wmmat[2];
    wm_params->wmmat[4] = neighbor_wm->wmmat[4];

    // Project above point
    int64_t above_x = center_x;
    int64_t above_y = center_y - (1 << half_height_log2);
    int64_t proj_above_x = neighbor_wm->wmmat[2] * above_x +
                           neighbor_wm->wmmat[3] * above_y +
                           neighbor_wm->wmmat[0];
    int64_t proj_above_y = neighbor_wm->wmmat[4] * above_x +
                           neighbor_wm->wmmat[5] * above_y +
                           neighbor_wm->wmmat[1];

    // y coefficients are (project(center) - project(above)) / (center.y -
    // above.y), which simplifies to (project(center) - project(above)) /
    // 2^(half_height_log2)
    wm_params->wmmat[3] = clamp64_to_32(
        ROUND_POWER_OF_TWO_64(proj_center_x - proj_above_x, half_height_log2));
    wm_params->wmmat[5] = clamp64_to_32(
        ROUND_POWER_OF_TWO_64(proj_center_y - proj_above_y, half_height_log2));
  } else {
    // If the neighboring block is to the left of the current block, we do the
    // same thing as for the above case, but with x and y axes interchanged

    wm_params->wmmat[3] = neighbor_wm->wmmat[3];
    wm_params->wmmat[5] = neighbor_wm->wmmat[5];

    // Project left point
    int64_t left_x = center_x - (1 << half_width_log2);
    int64_t left_y = center_y;
    int64_t proj_left_x = neighbor_wm->wmmat[2] * left_x +
                          neighbor_wm->wmmat[3] * left_y +
                          neighbor_wm->wmmat[0];
    int64_t proj_left_y = neighbor_wm->wmmat[4] * left_x +
                          neighbor_wm->wmmat[5] * left_y +
                          neighbor_wm->wmmat[1];

    // y coefficients are
    //    (project(center) - project(left)) / (center.y - left.y)
    // which simplifies to
    //    (project(center) - project(left)) / 2^(half_width_log2)
    wm_params->wmmat[2] = clamp64_to_32(
        ROUND_POWER_OF_TWO_64(proj_center_x - proj_left_x, half_width_log2));
    wm_params->wmmat[4] = clamp64_to_32(
        ROUND_POWER_OF_TWO_64(proj_center_y - proj_left_y, half_width_log2));
  }

  av1_reduce_warp_model(wm_params);
  // check compatibility with the fast warp filter
#if CONFIG_ACROSS_SCALE_WARP
  if (!av1_get_shear_params(wm_params, sf)) {
    wm_params->invalid = 1;
    return 1;
  }
#else
  if (!av1_get_shear_params(wm_params)) return 1;
#endif  // CONFIG_ACROSS_SCALE_WARP
  // Derive translational part from signaled MV
  av1_set_warp_translation(mi_row, mi_col, bsize, *center_mv, wm_params);
#if CONFIG_ACROSS_SCALE_WARP
  wm_params->invalid = 0;
#endif  // CONFIG_ACROSS_SCALE_WARP
  return 0;
}

// From the warp model, derive the MV in (x,y) position.
// (x,y) is the horizontal and vertical position of the frame
//(0,0) is the top-left co-ordinate of the frame
int_mv get_warp_motion_vector_xy_pos(const MACROBLOCKD *xd,
                                     const WarpedMotionParams *model,
                                     const int x, const int y,
                                     MvSubpelPrecision precision) {
  int_mv res;

  if (model->invalid || model->wmtype == IDENTITY) {
    res.as_int = 0;
    return res;
  }

  if (model->wmtype == TRANSLATION) {
    // All global motion vectors are stored with WARPEDMODEL_PREC_BITS (16)
    // bits of fractional precision. The offset for a translation is stored in
    // entries 0 and 1. For translations, all but the top three (two if
    // precision < MV_SUBPEL_EIGHTH) fractional bits are always
    // zero.
    //
    // After the right shifts, there are 3 fractional bits of precision. If
    // precision < MV_SUBPEL_EIGHTH is false, the bottom bit is always zero
    // (so we don't need a call to convert_to_trans_prec here)
    res.as_mv.col = model->wmmat[0] >> GM_TRANS_ONLY_PREC_DIFF;
    res.as_mv.row = model->wmmat[1] >> GM_TRANS_ONLY_PREC_DIFF;

    clamp_mv_ref(&res.as_mv, xd->width << MI_SIZE_LOG2,
                 xd->height << MI_SIZE_LOG2, xd);

    if (precision < MV_PRECISION_HALF_PEL)
      lower_mv_precision(&res.as_mv, precision);
    return res;
  }

  const int32_t *mat = model->wmmat;
  int tx, ty;

  if (model->wmtype == ROTZOOM) {
    assert(model->wmmat[5] == model->wmmat[2]);
    assert(model->wmmat[4] == -model->wmmat[3]);
  }

  int xc = get_subblk_offset_x_hp(mat, x, y, (1 << WARPEDMODEL_PREC_BITS));
  int yc = get_subblk_offset_y_hp(mat, x, y, (1 << WARPEDMODEL_PREC_BITS));

  tx = convert_to_trans_prec(precision, xc);
  ty = convert_to_trans_prec(precision, yc);

  res.as_mv.row = clamp(ty, MV_LOW + 1, MV_UPP - 1);
  res.as_mv.col = clamp(tx, MV_LOW + 1, MV_UPP - 1);

  clamp_mv_ref(&res.as_mv, xd->width << MI_SIZE_LOG2,
               xd->height << MI_SIZE_LOG2, xd);

  if (precision < MV_PRECISION_HALF_PEL)
    lower_mv_precision(&res.as_mv, precision);
  return res;
}

// return 0 if the model is invalid
// pts (col, row) is the array of source points in the unit of integer pixel
// mvs are the array of the MVs corresponding to the source points
// for nth point,
//  pts[2*n] is the col value of the source position. pts[2*n + 1] is the row
//  value of the source position mvs[2*n] is the col value of mv. mvs[2*n + 1]
//  is the row value of mv pts_inref[2*n] is the col value of the projected
//  position. pts_inref[2*n + 1] is the row value of the projected position
int get_model_from_corner_mvs(WarpedMotionParams *derive_model, int *pts,
                              int np, int *mvs, const BLOCK_SIZE bsize
#if CONFIG_ACROSS_SCALE_WARP
                              ,
                              const struct scale_factors *sf
#endif  // CONFIG_ACROSS_SCALE_WARP
) {
  // In order to derive the warp model we need 3 projected points
  // If the number of projected points (np) is not equal to 3, model is not
  // valid.
  if (np != 3) {
    derive_model->invalid = 1;
    return 0;
  }

  int x0, y0;
  int64_t ref_x0, ref_x1, ref_x2, ref_y0, ref_y1, ref_y2;
  int64_t pts_inref[2 * 3];
  const int width_log2 = mi_size_wide_log2[bsize] + MI_SIZE_LOG2;
  const int height_log2 = mi_size_high_log2[bsize] + MI_SIZE_LOG2;

  assert(derive_model != NULL);

  for (int n = 0; n < np; n++) {
    pts_inref[2 * n] = (int64_t)pts[2 * n] * (1 << WARPEDMODEL_PREC_BITS) +
                       (int64_t)mvs[2 * n] * (1 << GM_TRANS_ONLY_PREC_DIFF);
    pts_inref[2 * n + 1] =
        (int64_t)pts[2 * n + 1] * (1 << WARPEDMODEL_PREC_BITS) +
        (int64_t)mvs[2 * n + 1] * (1 << GM_TRANS_ONLY_PREC_DIFF);
    int valid_point =
        ((int64_t)pts[2 * n] >= 0 && (int64_t)pts[2 * n + 1] >= 0 &&
         pts_inref[2 * n] >= 0 && pts_inref[2 * n + 1] >= 0);
    if (!valid_point) return 0;
  }

  int all_mvs_same = 1;
  for (int k = 1; k < np; k++) {
    all_mvs_same &= (mvs[0] == mvs[2 * k]) & (mvs[1] == mvs[2 * k + 1]);
  }
  if (all_mvs_same) {
    derive_model->invalid = 1;
    return 0;
  }

  // Top-left point
  x0 = pts[2 * 0];
  y0 = pts[2 * 0 + 1];
  ref_x0 = pts_inref[2 * 0];
  ref_y0 = pts_inref[2 * 0 + 1];

  // Top-right point
  ref_x1 = pts_inref[2 * 1];
  ref_y1 = pts_inref[2 * 1 + 1];

  // Bottom-left point
  ref_x2 = pts_inref[2 * 2];
  ref_y2 = pts_inref[2 * 2 + 1];

  derive_model->wmmat[2] = clamp64_to_32((ref_x1 - ref_x0) >> width_log2);
  derive_model->wmmat[4] = clamp64_to_32((ref_y1 - ref_y0) >> width_log2);

  derive_model->wmmat[3] = clamp64_to_32((ref_x2 - ref_x0) >> height_log2);
  derive_model->wmmat[5] = clamp64_to_32((ref_y2 - ref_y0) >> height_log2);

  int64_t wmmat0 = (int64_t)ref_x0 -
                   (int64_t)derive_model->wmmat[2] * (int64_t)x0 -
                   (int64_t)derive_model->wmmat[3] * (int64_t)y0;
  int64_t wmmat1 = (int64_t)ref_y0 -
                   (int64_t)derive_model->wmmat[4] * (int64_t)x0 -
                   (int64_t)derive_model->wmmat[5] * (int64_t)y0;

  derive_model->wmtype = AFFINE;
  derive_model->invalid = 0;

  av1_reduce_warp_model(derive_model);

  // check compatibility with the fast warp filter
  if (!av1_get_shear_params(derive_model
#if CONFIG_ACROSS_SCALE_WARP
                            ,
                            sf
#endif  // CONFIG_ACROSS_SCALE_WARP
                            )) {
    derive_model->invalid = 1;
    return 0;
  }

  derive_model->wmmat[0] =
      (int32_t)clamp64(wmmat0, -WARPEDMODEL_TRANS_CLAMP,
                       WARPEDMODEL_TRANS_CLAMP - (1 << WARP_PARAM_REDUCE_BITS));
  derive_model->wmmat[1] =
      (int32_t)clamp64(wmmat1, -WARPEDMODEL_TRANS_CLAMP,
                       WARPEDMODEL_TRANS_CLAMP - (1 << WARP_PARAM_REDUCE_BITS));

  derive_model->wmmat[6] = derive_model->wmmat[7] = 0;

  return 1;
}
