/*
 * 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"

#if CONFIG_RELAX_AFFINE_CONSTRAINTS
// 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.
#else
// For warping, we really use a 6-tap filter, 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
// [-1, 2) * WARPEDPIXEL_PREC_SHIFTS.
// We need an extra 2 taps to fit this in, for a total of 8 taps.
#endif  // CONFIG_RELAX_AFFINE_CONSTRAINTS
/* clang-format off */
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
const int16_t av1_warped_filter[WARPEDPIXEL_PREC_SHIFTS * 7 + 1][8] = {
#else
const int16_t av1_warped_filter[WARPEDPIXEL_PREC_SHIFTS * 3 + 1][8] = {
#endif  // CONFIG_RELAX_AFFINE_CONSTRAINTS
#if WARPEDPIXEL_PREC_BITS == 6
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
  // [-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 },
#endif // CONFIG_RELAX_AFFINE_CONSTRAINTS
  // [-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 },

#if CONFIG_RELAX_AFFINE_CONSTRAINTS
  // [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 },
#else
  // dummy (replicate row index 191)
  { 0, 0, 0,   0,   2, 127, - 1, 0 },
#endif // CONFIG_RELAX_AFFINE_CONSTRAINTS
#elif WARPEDPIXEL_PREC_BITS == 5
  // The filters added below under CONFIG_RELAX_AFFINE_CONSTRAINTS are taken
  // from WARPEDPIXEL_PREC_BITS=6 case by skipping alternate filters and the
  // codec is not validated for this case.
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
  // [-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 },
#endif // CONFIG_RELAX_AFFINE_CONSTRAINTS
  // [-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},
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
  // [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 },
#else
  // dummy (replicate row index 95)
  {0, 0, 0,  -1,   4, 127,  -3, 1},
#endif // CONFIG_RELAX_AFFINE_CONSTRAINTS

#endif  // WARPEDPIXEL_PREC_BITS == 6
};

#if CONFIG_EXT_WARP_FILTER
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 },
};
#endif  // CONFIG_EXT_WARP_FILTER
/* 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 CONFIG_RELAX_AFFINE_CONSTRAINTS
  if ((4 * abs(alpha) + 7 * abs(beta) >= (3 << WARPEDMODEL_PREC_BITS)) ||
      (4 * abs(gamma) + 4 * abs(delta) >= (3 << WARPEDMODEL_PREC_BITS)))
#else
  if ((4 * abs(alpha) + 7 * abs(beta) >= (1 << WARPEDMODEL_PREC_BITS)) ||
      (4 * abs(gamma) + 4 * abs(delta) >= (1 << WARPEDMODEL_PREC_BITS)))
#endif  // CONFIG_RELAX_AFFINE_CONSTRAINTS
    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;
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
  const int16_t max_value = INT16_MAX - (1 << (WARP_PARAM_REDUCE_BITS - 1));
#else
  const int16_t max_value = INT16_MAX;
#endif  // CONFIG_RELAX_AFFINE_CONSTRAINTS

#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));

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

  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) {
#if CONFIG_EXT_WARP_FILTER
  // 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;
#else
  // Think of this range as an int<N>, multiplied by (1 <<
  // WARP_PARAM_REDUCE_BITS). In other words, the max is -2^(N-1) and max is
  // (2^(N-1) - 1), but with an extra multiplier applied to both terms
  const int min_value = -(1 << (WARPEDMODEL_PREC_BITS - 1));
  const int max_value =
      (1 << (WARPEDMODEL_PREC_BITS - 1)) - (1 << WARP_PARAM_REDUCE_BITS);
#endif  // CONFIG_EXT_WARP_FILTER

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

    int original = wm->wmmat[i] - offset;
#if CONFIG_WARP_PARAM_CLIP
    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;
#else
    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);

    wm->wmmat[i] = clamped + offset;
#endif  // CONFIG_WARP_PARAM_CLIP
  }
}

#if CONFIG_EXT_WARP_FILTER
// 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;
}
#endif  // CONFIG_EXT_WARP_FILTER

/* 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
#if CONFIG_OPFL_MEMBW_REDUCTION
                              ,
                              int use_damr_padding, ReferenceArea *ref_area
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
) {
#if CONFIG_OPFL_MEMBW_REDUCTION
  const int left_limit = use_damr_padding ? ref_area->pad_block.x0 : 0;
  const int right_limit =
      use_damr_padding ? ref_area->pad_block.x1 - 1 : width - 1;
  const int top_limit = use_damr_padding ? ref_area->pad_block.y0 : 0;
  const int bottom_limit =
      use_damr_padding ? ref_area->pad_block.y1 - 1 : height - 1;
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
  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) {
#if CONFIG_OPFL_MEMBW_REDUCTION
        const int iy = clamp(iy4 + k, top_limit, bottom_limit);
#else
        const int iy = clamp(iy4 + k, 0, height - 1);
#endif  // CONFIG_OPFL_MEMBW_REDUCTION

        int sx = sx4 + beta * (k + 4);
        for (int l = -4; l < 4; ++l) {
          int ix = ix4 + l - (taps_half - 1);
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
          const int offs = ROUND_POWER_OF_TWO(sx, WARPEDDIFF_PREC_BITS) +
                           3 * WARPEDPIXEL_PREC_SHIFTS;
          assert(offs >= 0 && offs <= WARPEDPIXEL_PREC_SHIFTS * 7);
#else
          const int offs = ROUND_POWER_OF_TWO(sx, WARPEDDIFF_PREC_BITS) +
                           WARPEDPIXEL_PREC_SHIFTS;
          assert(offs >= 0 && offs <= WARPEDPIXEL_PREC_SHIFTS * 3);
#endif
          const int16_t *coeffs = av1_warped_filter[offs];
          int32_t sum = 1 << offset_bits_horiz;
          for (int m = 0; m < taps; ++m) {
#if CONFIG_OPFL_MEMBW_REDUCTION
            const int sample_x = clamp(ix + m, left_limit, right_limit);
#else
            const int sample_x = clamp(ix + m, 0, width - 1);
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
            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) {
#if CONFIG_RELAX_AFFINE_CONSTRAINTS
          const int offs = ROUND_POWER_OF_TWO(sy, WARPEDDIFF_PREC_BITS) +
                           3 * WARPEDPIXEL_PREC_SHIFTS;
          assert(offs >= 0 && offs <= WARPEDPIXEL_PREC_SHIFTS * 7);
#else
          const int offs = ROUND_POWER_OF_TWO(sy, WARPEDDIFF_PREC_BITS) +
                           WARPEDPIXEL_PREC_SHIFTS;
          assert(offs >= 0 && offs <= WARPEDPIXEL_PREC_SHIFTS * 3);
#endif  // CONFIG_RELAX_AFFINE_CONSTRAINTS
          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;
        }
      }
    }
  }
}

#if CONFIG_EXT_WARP_FILTER
/* 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
#if CONFIG_WARP_BD_BOX
    ,
    int use_warp_bd_box, WarpBoundaryBox *warp_bd_box, int use_warp_bd_damr,
    WarpBoundaryBox *warp_bd_box_damr
#endif  // CONFIG_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;

#if CONFIG_WARP_BD_BOX
  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;
#endif  // CONFIG_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 CONFIG_WARP_BD_BOX
      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;
      }
      if (use_warp_bd_damr) {
        left_limit = warp_bd_box_damr->x0;
        right_limit = warp_bd_box_damr->x1 - 1;
        top_limit = warp_bd_box_damr->y0;
        bottom_limit = warp_bd_box_damr->y1 - 1;
      }
#endif  // CONFIG_WARP_BD_BOX
      // 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) {
#if CONFIG_WARP_BD_BOX
        const int iy = clamp(iy4 + k, top_limit, bottom_limit);
#else
        const int iy = clamp(iy4 + k, 0, height - 1);
#endif  // CONFIG_WARP_BD_BOX

        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) {
#if CONFIG_WARP_BD_BOX
            const int sample_x = clamp(ix + m, left_limit, right_limit);
#else
            const int sample_x = clamp(ix + m, 0, width - 1);
#endif  // CONFIG_WARP_BD_BOX
            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
#if CONFIG_WARP_BD_BOX
    ,
    int use_warp_bd_box, WarpBoundaryBox *warp_bd_box, int use_warp_bd_damr,
    WarpBoundaryBox *warp_bd_box_damr
#endif  // CONFIG_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;

#if CONFIG_WARP_BD_BOX
  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;
#endif  // CONFIG_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 CONFIG_WARP_BD_BOX
      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;
      }
      if (use_warp_bd_damr) {
        left_limit = warp_bd_box_damr->x0;
        right_limit = warp_bd_box_damr->x1 - 1;
        top_limit = warp_bd_box_damr->y0;
        bottom_limit = warp_bd_box_damr->y1 - 1;
      }
#endif  // CONFIG_WARP_BD_BOX
      // 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);
      const int64_t y4 = sf->scale_value_warp_y(y4_org, sf);

      // No vertical scaling is supported in current super-res mode
      assert(y4_org == y4);
      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;
#if CONFIG_WARP_BD_BOX
        const int iy = clamp(y_pos, top_limit, bottom_limit);
#else
        const int iy = clamp(y_pos, 0, height - 1);
#endif  // CONFIG_WARP_BD_BOX
        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) {
#if CONFIG_WARP_BD_BOX
            const int sample_x =
                clamp(ix - fo_horiz + m, left_limit, right_limit);
#else
            const int sample_x = clamp(ix - fo_horiz + m, 0, width - 1);
#endif  // CONFIG_WARP_BD_BOX
            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

#if CONFIG_AFFINE_REFINEMENT
void av1_warp_plane_ext(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) {
  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;

  av1_ext_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
#if CONFIG_WARP_BD_BOX
                             ,
                             0, NULL, 0, NULL
#endif  // CONFIG_WARP_BD_BOX
  );
}
#endif  // CONFIG_AFFINE_REFINEMENT
#endif  // CONFIG_EXT_WARP_FILTER

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
#if CONFIG_OPFL_MEMBW_REDUCTION
                       ,
                       int use_damr_padding, ReferenceArea *ref_area
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
#if CONFIG_WARP_BD_BOX
                       ,
                       int use_warp_bd_box, WarpBoundaryBox *warp_bd_box,
                       int use_warp_bd_damr, WarpBoundaryBox *warp_bd_box_damr
#endif  // CONFIG_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_EXT_WARP_FILTER
#if CONFIG_ACROSS_SCALE_WARP
  assert(IMPLIES(!is_scaled,
                 wm->use_affine_filter ==
                     is_affine_shear_allowed(alpha, beta, gamma, delta)));
#else
  assert(wm->use_affine_filter ==
         is_affine_shear_allowed(alpha, beta, gamma, delta));
#endif  // CONFIG_ACROSS_SCALE_WARP

  if (!wm->use_affine_filter
#if CONFIG_AFFINE_REFINEMENT
      || p_width < 8 || p_height < 8
#endif  // CONFIG_AFFINE_REFINEMENT
#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
#if CONFIG_WARP_BD_BOX
          ,
          use_warp_bd_box, warp_bd_box, use_warp_bd_damr, warp_bd_box_damr
#endif  // CONFIG_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
#if CONFIG_WARP_BD_BOX
          ,
          use_warp_bd_box, warp_bd_box, use_warp_bd_damr, warp_bd_box_damr
#endif  // CONFIG_WARP_BD_BOX
      );
#if CONFIG_ACROSS_SCALE_WARP
    }
#endif  // CONFIG_ACROSS_SCALE_WARP

  } else {
#endif  // CONFIG_EXT_WARP_FILTER
    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
#if CONFIG_OPFL_MEMBW_REDUCTION
                           ,
                           use_damr_padding, ref_area
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
    );
  }
}

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
#if CONFIG_OPFL_MEMBW_REDUCTION
                    ,
                    int use_damr_padding, ReferenceArea *ref_area
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
#if CONFIG_WARP_BD_BOX
                    ,
                    int use_warp_bd_box, WarpBoundaryBox *warp_bd_box,
                    int use_warp_bd_damr, WarpBoundaryBox *warp_bd_box_damr
#endif  // CONFIG_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
#if CONFIG_OPFL_MEMBW_REDUCTION
      ,
      use_damr_padding, ref_area
#endif  // CONFIG_OPFL_MEMBW_REDUCTION
#if CONFIG_WARP_BD_BOX
      ,
      use_warp_bd_box, warp_bd_box, use_warp_bd_damr, warp_bd_box_damr
#endif  // CONFIG_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);
  }
}
#elif !CONFIG_WARP_PARAM_CLIP
static int32_t get_mult_shift_ndiag(int64_t Px, int16_t iDet, int shift) {
  int64_t v = Px * (int64_t)iDet;
  return (int32_t)clamp64(ROUND_POWER_OF_TWO_SIGNED_64(v, shift),
                          -WARPEDMODEL_NONDIAGAFFINE_CLAMP + 1,
                          WARPEDMODEL_NONDIAGAFFINE_CLAMP - 1);
}

static int32_t get_mult_shift_diag(int64_t Px, int16_t iDet, int shift) {
  int64_t v = Px * (int64_t)iDet;
  return (int32_t)clamp64(
      ROUND_POWER_OF_TWO_SIGNED_64(v, 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];

#if CONFIG_WARP_PARAM_CLIP
  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));
#else
  wm->wmmat[2] = get_mult_shift_diag(Px[0], iDet, shift);
  wm->wmmat[3] = get_mult_shift_ndiag(Px[1], iDet, shift);
  wm->wmmat[4] = get_mult_shift_ndiag(Py[0], iDet, shift);
  wm->wmmat[5] = get_mult_shift_diag(Py[1], iDet, shift);
#endif  // CONFIG_WARP_PARAM_CLIP

  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)
#if CONFIG_WARP_PARAM_CLIP
    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
    wm_params->wmmat[3] = (int32_t)(ROUND_POWER_OF_TWO_64(
        proj_center_x - proj_above_x, half_height_log2));
    wm_params->wmmat[5] = (int32_t)(ROUND_POWER_OF_TWO_64(
        proj_center_y - proj_above_y, half_height_log2));
#endif  // CONFIG_WARP_PARAM_CLIP
  } 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)
#if CONFIG_WARP_PARAM_CLIP
    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));
#else
    wm_params->wmmat[2] = (int32_t)(ROUND_POWER_OF_TWO_64(
        proj_center_x - proj_left_x, half_width_log2));
    wm_params->wmmat[4] = (int32_t)(ROUND_POWER_OF_TWO_64(
        proj_center_y - proj_left_y, half_width_log2));
#endif  // CONFIG_WARP_PARAM_CLIP
  }

  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 CONFIG_C071_SUBBLK_WARPMV
    if (precision < MV_PRECISION_HALF_PEL)
#endif  // CONFIG_C071_SUBBLK_WARPMV
      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 CONFIG_C071_SUBBLK_WARPMV
  if (precision < MV_PRECISION_HALF_PEL)
#endif  // CONFIG_C071_SUBBLK_WARPMV
    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];

#if CONFIG_WARP_PARAM_CLIP
  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);
#else
  derive_model->wmmat[2] = (int32_t)((ref_x1 - ref_x0) >> width_log2);
  derive_model->wmmat[4] = (int32_t)((ref_y1 - ref_y0) >> width_log2);

  derive_model->wmmat[3] = (int32_t)((ref_x2 - ref_x0) >> height_log2);
  derive_model->wmmat[5] = (int32_t)((ref_y2 - ref_y0) >> height_log2);
#endif  // CONFIG_WARP_PARAM_CLIP

  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;
}
