1b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian/*
2b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *
4b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
5b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
6b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
7b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
8b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
9b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian */
10b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
11b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <assert.h>
12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <limits.h>
13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <math.h>
14b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdio.h>
15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdlib.h>
16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <string.h>
17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_common.h"
19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_resize.h"
20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define FILTER_BITS               7
22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define INTERP_TAPS               8
24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define SUBPEL_BITS               5
25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define SUBPEL_MASK               ((1 << SUBPEL_BITS) - 1)
26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define INTERP_PRECISION_BITS     32
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef int16_t interp_kernel[INTERP_TAPS];
29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Filters for interpolation (0.5-band) - note this also filters integer pels.
31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst interp_kernel vp9_filteredinterp_filters500[(1 << SUBPEL_BITS)] = {
32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-3,  0, 35, 64, 35,  0, -3, 0},
33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-3, -1, 34, 64, 36,  1, -3, 0},
34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-3, -1, 32, 64, 38,  1, -3, 0},
35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -2, 31, 63, 39,  2, -3, 0},
36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -2, 29, 63, 41,  2, -3, 0},
37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -2, 28, 63, 42,  3, -4, 0},
38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -3, 27, 63, 43,  4, -4, 0},
39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -3, 25, 62, 45,  5, -4, 0},
40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -3, 24, 62, 46,  5, -4, 0},
41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -3, 23, 61, 47,  6, -4, 0},
42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-2, -3, 21, 60, 49,  7, -4, 0},
43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 20, 60, 50,  8, -4, -1},
44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 19, 59, 51,  9, -4, -1},
45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 17, 58, 52, 10, -4, 0},
46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 16, 57, 53, 12, -4, -1},
47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 15, 56, 54, 13, -4, -1},
48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 14, 55, 55, 14, -4, -1},
49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 13, 54, 56, 15, -4, -1},
50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4, 12, 53, 57, 16, -4, -1},
51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4, 10, 52, 58, 17, -4, -1},
52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4,  9, 51, 59, 19, -4, -1},
53b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -4,  8, 50, 60, 20, -4, -1},
54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4,  7, 49, 60, 21, -3, -2},
55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4,  6, 47, 61, 23, -3, -2},
56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4,  5, 46, 62, 24, -3, -2},
57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4,  5, 45, 62, 25, -3, -2},
58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4,  4, 43, 63, 27, -3, -2},
59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -4,  3, 42, 63, 28, -2, -2},
60b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -3,  2, 41, 63, 29, -2, -2},
61b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -3,  2, 39, 63, 31, -2, -2},
62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -3,  1, 38, 64, 32, -1, -3},
63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -3,  1, 36, 64, 34, -1, -3}
64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian};
65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Filters for interpolation (0.625-band) - note this also filters integer pels.
67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst interp_kernel vp9_filteredinterp_filters625[(1 << SUBPEL_BITS)] = {
68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -8, 33, 80, 33, -8, -1, 0},
69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -8, 30, 80, 35, -8, -1, 1},
70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1, -8, 28, 80, 37, -7, -2, 1},
71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 26, 79, 39, -7, -2, 1},
72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 24, 79, 41, -7, -2, 1},
73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 22, 78, 43, -6, -2, 1},
74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 20, 78, 45, -5, -3, 1},
75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 18, 77, 48, -5, -3, 1},
76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 16, 76, 50, -4, -3, 1},
77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -8, 15, 75, 52, -3, -4, 1},
78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -7, 13, 74, 54, -3, -4, 1},
79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -7, 11, 73, 56, -2, -4, 1},
80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0, -7, 10, 71, 58, -1, -4, 1},
81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -7,  8, 70, 60,  0, -5, 1},
82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -6,  6, 68, 62,  1, -5, 1},
83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -6,  5, 67, 63,  2, -5, 1},
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -6,  4, 65, 65,  4, -6, 1},
85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -5,  2, 63, 67,  5, -6, 1},
86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -5,  1, 62, 68,  6, -6, 1},
87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -5,  0, 60, 70,  8, -7, 1},
88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -4, -1, 58, 71, 10, -7, 0},
89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -4, -2, 56, 73, 11, -7, 0},
90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -4, -3, 54, 74, 13, -7, 0},
91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -4, -3, 52, 75, 15, -8, 0},
92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -3, -4, 50, 76, 16, -8, 0},
93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -3, -5, 48, 77, 18, -8, 0},
94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -3, -5, 45, 78, 20, -8, 0},
95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -2, -6, 43, 78, 22, -8, 0},
96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -2, -7, 41, 79, 24, -8, 0},
97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -2, -7, 39, 79, 26, -8, 0},
98b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -2, -7, 37, 80, 28, -8, -1},
99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -1, -8, 35, 80, 30, -8, -1},
100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian};
101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
102b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Filters for interpolation (0.75-band) - note this also filters integer pels.
103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst interp_kernel vp9_filteredinterp_filters750[(1 << SUBPEL_BITS)] = {
104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2, -11,  25,  96,  25, -11,   2, 0},
105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2, -11,  22,  96,  28, -11,   2, 0},
106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2, -10,  19,  95,  31, -11,   2, 0},
107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2, -10,  17,  95,  34, -12,   2, 0},
108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -9,  14,  94,  37, -12,   2, 0},
109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -8,  12,  93,  40, -12,   1, 0},
110b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -8,   9,  92,  43, -12,   1, 1},
111b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -7,   7,  91,  46, -12,   1, 0},
112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -7,   5,  90,  49, -12,   1, 0},
113b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -6,   3,  88,  52, -12,   0, 1},
114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -5,   1,  86,  55, -12,   0, 1},
115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -5,  -1,  84,  58, -11,   0, 1},
116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -4,  -2,  82,  61, -11,  -1, 1},
117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -4,  -4,  80,  64, -10,  -1, 1},
118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -3, -5, 77, 67, -9, -1, 1},
119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -3, -6, 75, 70, -8, -2, 1},
120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -2, -7, 72, 72, -7, -2, 1},
121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -2, -8, 70, 75, -6, -3, 1},
122b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1, -1, -9, 67, 77, -5, -3, 1},
123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,  -1, -10,  64,  80,  -4,  -4, 2},
124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,  -1, -11,  61,  82,  -2,  -4, 2},
125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,   0, -11,  58,  84,  -1,  -5, 2},
126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,   0, -12,  55,  86,   1,  -5, 2},
127b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,   0, -12,  52,  88,   3,  -6, 2},
128b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1, -12,  49,  90,   5,  -7, 2},
129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1, -12,  46,  91,   7,  -7, 2},
130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,   1, -12,  43,  92,   9,  -8, 2},
131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1, -12,  40,  93,  12,  -8, 2},
132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2, -12,  37,  94,  14,  -9, 2},
133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2, -12,  34,  95,  17, -10, 2},
134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2, -11,  31,  95,  19, -10, 2},
135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2, -11,  28,  96,  22, -11, 2}
136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian};
137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Filters for interpolation (0.875-band) - note this also filters integer pels.
139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst interp_kernel vp9_filteredinterp_filters875[(1 << SUBPEL_BITS)] = {
140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {3,  -8,  13, 112,  13,  -8,   3, 0},
141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {3,  -7,  10, 112,  17,  -9,   3, -1},
142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -6,   7, 111,  21,  -9,   3, -1},
143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -5,   4, 111,  24, -10,   3, -1},
144b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {2,  -4,   1, 110,  28, -11,   3, -1},
145b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,  -3,  -1, 108,  32, -12,   4, -1},
146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,  -2,  -3, 106,  36, -13,   4, -1},
147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,  -1,  -6, 105,  40, -14,   4, -1},
148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,  -1,  -7, 102,  44, -14,   4, -1},
149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,   0,  -9, 100,  48, -15,   4, -1},
150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {1,   1, -11,  97,  53, -16,   4, -1},
151b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1, -12,  95,  57, -16,   4, -1},
152b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2, -13,  91,  61, -16,   4, -1},
153b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2, -14,  88,  65, -16,   4, -1},
154b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   3, -15,  84,  69, -17,   4, 0},
155b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   3, -16,  81,  73, -16,   3, 0},
156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   3, -16,  77,  77, -16,   3, 0},
157b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   3, -16,  73,  81, -16,   3, 0},
158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   4, -17,  69,  84, -15,   3, 0},
159b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -16,  65,  88, -14,   2, 0},
160b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -16,  61,  91, -13,   2, 0},
161b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -16,  57,  95, -12,   1, 0},
162b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -16,  53,  97, -11,   1, 1},
163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -15,  48, 100,  -9,   0, 1},
164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -14,  44, 102,  -7,  -1, 1},
165b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -14,  40, 105,  -6,  -1, 1},
166b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -13,  36, 106,  -3,  -2, 1},
167b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -12,  32, 108,  -1,  -3, 1},
168b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3, -11,  28, 110,   1,  -4, 2},
169b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3, -10,  24, 111,   4,  -5, 2},
170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3,  -9,  21, 111,   7,  -6, 2},
171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3,  -9,  17, 112,  10,  -7, 3}
172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian};
173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Filters for interpolation (full-band) - no filtering for integer pixels
175b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst interp_kernel vp9_filteredinterp_filters1000[(1 << SUBPEL_BITS)] = {
176b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   0,   0, 128,   0,   0,   0, 0},
177b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1,  -3, 128,   3,  -1,   0, 0},
178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   2,  -6, 127,   7,  -2,   1, 0},
179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3,  -9, 126,  12,  -4,   1, 0},
180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -12, 125,  16,  -5,   1, 0},
181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -14, 123,  20,  -6,   2, 0},
182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   5, -15, 120,  25,  -8,   2, 0},
183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   5, -17, 118,  30,  -9,   3, -1},
184b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -18, 114,  35, -10,   3, -1},
185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -19, 111,  41, -12,   3, -1},
186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -20, 107,  46, -13,   4, -1},
187b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -21, 103,  52, -14,   4, -1},
188b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -21,  99,  57, -16,   5, -1},
189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -21,  94,  63, -17,   5, -1},
190b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -20,  89,  68, -18,   5, -1},
191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -20,  84,  73, -19,   6, -1},
192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -20,  79,  79, -20,   6, -1},
193b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   6, -19,  73,  84, -20,   6, -1},
194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   5, -18,  68,  89, -20,   6, -1},
195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   5, -17,  63,  94, -21,   6, -1},
196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   5, -16,  57,  99, -21,   6, -1},
197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -14,  52, 103, -21,   6, -1},
198b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   4, -13,  46, 107, -20,   6, -1},
199b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3, -12,  41, 111, -19,   6, -1},
200b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3, -10,  35, 114, -18,   6, -1},
201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {-1,   3,  -9,  30, 118, -17,   5, -1},
202b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2,  -8,  25, 120, -15,   5, -1},
203b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   2,  -6,  20, 123, -14,   4, -1},
204b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1,  -5,  16, 125, -12,   4, -1},
205b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1,  -4,  12, 126,  -9,   3, -1},
206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   1,  -2,   7, 127,  -6,   2, -1},
207b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {0,   0,  -1,   3, 128,  -3,   1, 0}
208b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian};
209b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
210b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Filters for factor of 2 downsampling.
211b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const int16_t vp9_down2_symeven_half_filter[] = {56, 12, -3, -1};
212b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const int16_t vp9_down2_symodd_half_filter[] = {64, 35, 0, -3};
213b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
214b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const interp_kernel *choose_interp_filter(int inlength, int outlength) {
215b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int outlength16 = outlength * 16;
216b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (outlength16 >= inlength * 16)
217b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return vp9_filteredinterp_filters1000;
218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else if (outlength16 >= inlength * 13)
219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return vp9_filteredinterp_filters875;
220b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else if (outlength16 >= inlength * 11)
221b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return vp9_filteredinterp_filters750;
222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else if (outlength16 >= inlength * 9)
223b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return vp9_filteredinterp_filters625;
224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else
225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return vp9_filteredinterp_filters500;
226b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
227b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
228b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void interpolate(const uint8_t *const input, int inlength,
229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        uint8_t *output, int outlength) {
230b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int64_t delta = (((uint64_t)inlength << 32) + outlength / 2) /
231b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      outlength;
232b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int64_t offset = inlength > outlength ?
233b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      (((int64_t)(inlength - outlength) << 31) + outlength / 2) / outlength :
234b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      -(((int64_t)(outlength - inlength) << 31) + outlength / 2) / outlength;
235b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *optr = output;
236b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int x, x1, x2, sum, k, int_pel, sub_pel;
237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t y;
238b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
239b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const interp_kernel *interp_filters =
240b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      choose_interp_filter(inlength, outlength);
241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
242b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  x = 0;
243b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  y = offset;
244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  while ((y >> INTERP_PRECISION_BITS) < (INTERP_TAPS / 2 - 1)) {
245b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    x++;
246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    y += delta;
247b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
248b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  x1 = x;
249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  x = outlength - 1;
250b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  y = delta * x + offset;
251b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  while ((y >> INTERP_PRECISION_BITS) +
252b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian         (int64_t)(INTERP_TAPS / 2) >= inlength) {
253b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    x--;
254b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    y -= delta;
255b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
256b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  x2 = x;
257b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (x1 > x2) {
258b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (x = 0, y = offset; x < outlength; ++x, y += delta) {
259b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const int16_t *filter;
260b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int_pel = y >> INTERP_PRECISION_BITS;
261b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sub_pel = (y >> (INTERP_PRECISION_BITS - SUBPEL_BITS)) & SUBPEL_MASK;
262b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      filter = interp_filters[sub_pel];
263b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum = 0;
264b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (k = 0; k < INTERP_TAPS; ++k) {
265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        const int pk = int_pel - INTERP_TAPS / 2 + 1 + k;
266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += filter[k] * input[(pk < 0 ? 0 :
267b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                  (pk >= inlength ? inlength - 1 : pk))];
268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
269b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS));
270b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
272b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Initial part.
273b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (x = 0, y = offset; x < x1; ++x, y += delta) {
274b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const int16_t *filter;
275b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int_pel = y >> INTERP_PRECISION_BITS;
276b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sub_pel = (y >> (INTERP_PRECISION_BITS - SUBPEL_BITS)) & SUBPEL_MASK;
277b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      filter = interp_filters[sub_pel];
278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum = 0;
279b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (k = 0; k < INTERP_TAPS; ++k)
280b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += filter[k] * input[(int_pel - INTERP_TAPS / 2 + 1 + k < 0 ?
281b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                  0 :
282b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                  int_pel - INTERP_TAPS / 2 + 1 + k)];
283b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS));
284b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
285b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Middle part.
286b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (; x <= x2; ++x, y += delta) {
287b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const int16_t *filter;
288b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int_pel = y >> INTERP_PRECISION_BITS;
289b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sub_pel = (y >> (INTERP_PRECISION_BITS - SUBPEL_BITS)) & SUBPEL_MASK;
290b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      filter = interp_filters[sub_pel];
291b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum = 0;
292b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (k = 0; k < INTERP_TAPS; ++k)
293b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += filter[k] * input[int_pel - INTERP_TAPS / 2 + 1 + k];
294b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS));
295b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
296b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // End part.
297b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (; x < outlength; ++x, y += delta) {
298b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const int16_t *filter;
299b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int_pel = y >> INTERP_PRECISION_BITS;
300b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sub_pel = (y >> (INTERP_PRECISION_BITS - SUBPEL_BITS)) & SUBPEL_MASK;
301b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      filter = interp_filters[sub_pel];
302b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum = 0;
303b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (k = 0; k < INTERP_TAPS; ++k)
304b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += filter[k] * input[(int_pel - INTERP_TAPS / 2 + 1 + k >=
305b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                  inlength ?  inlength - 1 :
306b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                  int_pel - INTERP_TAPS / 2 + 1 + k)];
307b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS));
308b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
309b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
310b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
311b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
312b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void down2_symeven(const uint8_t *const input, int length,
313b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          uint8_t *output) {
314b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Actual filter len = 2 * filter_len_half.
315b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  static const int16_t *filter = vp9_down2_symeven_half_filter;
316b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int filter_len_half = sizeof(vp9_down2_symeven_half_filter) / 2;
317b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i, j;
318b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *optr = output;
319b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int l1 = filter_len_half;
320b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int l2 = (length - filter_len_half);
321b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  l1 += (l1 & 1);
322b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  l2 += (l2 & 1);
323b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (l1 > l2) {
324b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Short input length.
325b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (i = 0; i < length; i += 2) {
326b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1));
327b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 0; j < filter_len_half; ++j) {
328b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[(i - j < 0 ? 0 : i - j)] +
329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                input[(i + 1 + j >= length ? length - 1 : i + 1 + j)]) *
330b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            filter[j];
331b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
332b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
333b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
334b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
335b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
336b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Initial part.
337b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (i = 0; i < l1; i += 2) {
338b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1));
339b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 0; j < filter_len_half; ++j) {
340b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[(i - j < 0 ? 0 : i - j)] + input[i + 1 + j]) * filter[j];
341b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
342b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
343b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
344b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
345b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Middle part.
346b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (; i < l2; i += 2) {
347b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1));
348b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 0; j < filter_len_half; ++j) {
349b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[i - j] + input[i + 1 + j]) * filter[j];
350b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
351b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
352b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
353b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
354b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // End part.
355b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (; i < length; i += 2) {
356b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1));
357b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 0; j < filter_len_half; ++j) {
358b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[i - j] +
359b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                input[(i + 1 + j >= length ? length - 1 : i + 1 + j)]) *
360b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            filter[j];
361b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
362b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
364b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
365b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
366b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
368b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void down2_symodd(const uint8_t *const input, int length,
369b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *output) {
370b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Actual filter len = 2 * filter_len_half - 1.
371b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  static const int16_t *filter = vp9_down2_symodd_half_filter;
372b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int filter_len_half = sizeof(vp9_down2_symodd_half_filter) / 2;
373b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i, j;
374b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *optr = output;
375b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int l1 = filter_len_half - 1;
376b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int l2 = (length - filter_len_half + 1);
377b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  l1 += (l1 & 1);
378b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  l2 += (l2 & 1);
379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (l1 > l2) {
380b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Short input length.
381b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (i = 0; i < length; i += 2) {
382b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1)) + input[i] * filter[0];
383b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 1; j < filter_len_half; ++j) {
384b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[(i - j < 0 ? 0 : i - j)] +
385b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                input[(i + j >= length ? length - 1 : i + j)]) *
386b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            filter[j];
387b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
388b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
389b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
390b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
391b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
392b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Initial part.
393b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (i = 0; i < l1; i += 2) {
394b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1)) + input[i] * filter[0];
395b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 1; j < filter_len_half; ++j) {
396b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[(i - j < 0 ? 0 : i - j)] + input[i + j]) * filter[j];
397b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
399b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
400b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
401b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Middle part.
402b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (; i < l2; i += 2) {
403b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1)) + input[i] * filter[0];
404b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 1; j < filter_len_half; ++j) {
405b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[i - j] + input[i + j]) * filter[j];
406b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
407b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
408b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
409b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
410b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // End part.
411b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (; i < length; i += 2) {
412b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      int sum = (1 << (FILTER_BITS - 1)) + input[i] * filter[0];
413b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      for (j = 1; j < filter_len_half; ++j) {
414b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        sum += (input[i - j] + input[(i + j >= length ? length - 1 : i + j)]) *
415b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            filter[j];
416b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
417b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      sum >>= FILTER_BITS;
418b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *optr++ = clip_pixel(sum);
419b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
420b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
421b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
422b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
423b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int get_down2_length(int length, int steps) {
424b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int s;
425b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (s = 0; s < steps; ++s)
426b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    length = (length + 1) >> 1;
427b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return length;
428b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
429b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
430b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint get_down2_steps(int in_length, int out_length) {
431b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int steps = 0;
432b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int proj_in_length;
433b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  while ((proj_in_length = get_down2_length(in_length, 1)) >= out_length) {
434b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ++steps;
435b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    in_length = proj_in_length;
436b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
437b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return steps;
438b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
439b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
440b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void resize_multistep(const uint8_t *const input,
441b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                             int length,
442b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                             uint8_t *output,
443b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                             int olength,
444b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                             uint8_t *buf) {
445b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int steps;
446b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (length == olength) {
447b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    memcpy(output, input, sizeof(uint8_t) * length);
448b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return;
449b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
450b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  steps = get_down2_steps(length, olength);
451b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
452b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (steps > 0) {
453b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    int s;
454b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    uint8_t *out = NULL;
455b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    uint8_t *tmpbuf = NULL;
456b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    uint8_t *otmp, *otmp2;
457b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    int filteredlength = length;
458b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (!tmpbuf) {
459b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      tmpbuf = (uint8_t *)malloc(sizeof(uint8_t) * length);
460b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      otmp = tmpbuf;
461b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else {
462b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      otmp = buf;
463b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
464b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    otmp2 = otmp + get_down2_length(length, 1);
465b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    for (s = 0; s < steps; ++s) {
466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const int proj_filteredlength = get_down2_length(filteredlength, 1);
467b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const uint8_t *const in = (s == 0 ? input : out);
468b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (s == steps - 1 && proj_filteredlength == olength)
469b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        out = output;
470b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      else
471b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        out = (s & 1 ? otmp2 : otmp);
472b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (filteredlength & 1)
473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        down2_symodd(in, filteredlength, out);
474b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      else
475b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        down2_symeven(in, filteredlength, out);
476b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      filteredlength = proj_filteredlength;
477b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
478b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (filteredlength != olength) {
479b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      interpolate(out, filteredlength, output, olength);
480b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (tmpbuf)
482b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      free(tmpbuf);
483b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
484b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    interpolate(input, length, output, olength);
485b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
486b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
487b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
488b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void fill_col_to_arr(uint8_t *img, int stride, int len, uint8_t *arr) {
489b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i;
490b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *iptr = img;
491b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *aptr = arr;
492b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < len; ++i, iptr += stride) {
493b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    *aptr++ = *iptr;
494b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
495b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
496b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
497b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void fill_arr_to_col(uint8_t *img, int stride, int len, uint8_t *arr) {
498b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i;
499b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *iptr = img;
500b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *aptr = arr;
501b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < len; ++i, iptr += stride) {
502b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    *iptr = *aptr++;
503b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
504b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
505b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
506b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_resize_plane(const uint8_t *const input,
507b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      int height,
508b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      int width,
509b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      int in_stride,
510b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      uint8_t *output,
511b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      int height2,
512b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      int width2,
513b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      int out_stride) {
514b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i;
515b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *intbuf = (uint8_t *)malloc(sizeof(uint8_t) * width2 * height);
516b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *tmpbuf = (uint8_t *)malloc(sizeof(uint8_t) *
517b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      (width < height ? height : width));
518b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *arrbuf = (uint8_t *)malloc(sizeof(uint8_t) * (height + height2));
519b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < height; ++i)
520b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    resize_multistep(input + in_stride * i, width,
521b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        intbuf + width2 * i, width2, tmpbuf);
522b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < width2; ++i) {
523b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    fill_col_to_arr(intbuf + i, width2, height, arrbuf);
524b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    resize_multistep(arrbuf, height, arrbuf + height, height2, tmpbuf);
525b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    fill_arr_to_col(output + i, out_stride, height2, arrbuf + height);
526b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
527b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  free(intbuf);
528b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  free(tmpbuf);
529b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  free(arrbuf);
530b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
531b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
532b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_resize_frame420(const uint8_t *const y,
533b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int y_stride,
534b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         const uint8_t *const u, const uint8_t *const v,
535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int uv_stride,
536b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int height, int width,
537b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *oy, int oy_stride,
538b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *ou, uint8_t *ov, int ouv_stride,
539b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int oheight, int owidth) {
540b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(y, height, width, y_stride,
541b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   oy, oheight, owidth, oy_stride);
542b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(u, height / 2, width / 2, uv_stride,
543b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   ou, oheight / 2, owidth / 2, ouv_stride);
544b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(v, height / 2, width / 2, uv_stride,
545b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   ov, oheight / 2, owidth / 2, ouv_stride);
546b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
547b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_resize_frame422(const uint8_t *const y, int y_stride,
549b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         const uint8_t *const u, const uint8_t *const v,
550b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int uv_stride,
551b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int height, int width,
552b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *oy, int oy_stride,
553b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *ou, uint8_t *ov, int ouv_stride,
554b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int oheight, int owidth) {
555b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(y, height, width, y_stride,
556b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   oy, oheight, owidth, oy_stride);
557b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(u, height, width / 2, uv_stride,
558b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   ou, oheight, owidth / 2, ouv_stride);
559b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(v, height, width / 2, uv_stride,
560b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   ov, oheight, owidth / 2, ouv_stride);
561b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
562b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
563b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_resize_frame444(const uint8_t *const y, int y_stride,
564b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         const uint8_t *const u, const uint8_t *const v,
565b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int uv_stride,
566b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int height, int width,
567b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *oy, int oy_stride,
568b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         uint8_t *ou, uint8_t *ov, int ouv_stride,
569b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         int oheight, int owidth) {
570b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(y, height, width, y_stride,
571b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   oy, oheight, owidth, oy_stride);
572b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(u, height, width, uv_stride,
573b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   ou, oheight, owidth, ouv_stride);
574b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_resize_plane(v, height, width, uv_stride,
575b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   ov, oheight, owidth, ouv_stride);
576b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
577