xref: /aosp_15_r20/external/libvpx/vpx_dsp/vpx_convolve.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include <assert.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_convolve.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_dsp_common.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_filter.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
21*fb1b10abSAndroid Build Coastguard Worker 
convolve_horiz(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * x_filters,int x0_q4,int x_step_q4,int w,int h)22*fb1b10abSAndroid Build Coastguard Worker static void convolve_horiz(const uint8_t *src, ptrdiff_t src_stride,
23*fb1b10abSAndroid Build Coastguard Worker                            uint8_t *dst, ptrdiff_t dst_stride,
24*fb1b10abSAndroid Build Coastguard Worker                            const InterpKernel *x_filters, int x0_q4,
25*fb1b10abSAndroid Build Coastguard Worker                            int x_step_q4, int w, int h) {
26*fb1b10abSAndroid Build Coastguard Worker   int x, y;
27*fb1b10abSAndroid Build Coastguard Worker   src -= SUBPEL_TAPS / 2 - 1;
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < h; ++y) {
30*fb1b10abSAndroid Build Coastguard Worker     int x_q4 = x0_q4;
31*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < w; ++x) {
32*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *const src_x = &src[x_q4 >> SUBPEL_BITS];
33*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const x_filter = x_filters[x_q4 & SUBPEL_MASK];
34*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
35*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k) sum += src_x[k] * x_filter[k];
36*fb1b10abSAndroid Build Coastguard Worker       dst[x] = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS));
37*fb1b10abSAndroid Build Coastguard Worker       x_q4 += x_step_q4;
38*fb1b10abSAndroid Build Coastguard Worker     }
39*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
40*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
41*fb1b10abSAndroid Build Coastguard Worker   }
42*fb1b10abSAndroid Build Coastguard Worker }
43*fb1b10abSAndroid Build Coastguard Worker 
convolve_avg_horiz(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * x_filters,int x0_q4,int x_step_q4,int w,int h)44*fb1b10abSAndroid Build Coastguard Worker static void convolve_avg_horiz(const uint8_t *src, ptrdiff_t src_stride,
45*fb1b10abSAndroid Build Coastguard Worker                                uint8_t *dst, ptrdiff_t dst_stride,
46*fb1b10abSAndroid Build Coastguard Worker                                const InterpKernel *x_filters, int x0_q4,
47*fb1b10abSAndroid Build Coastguard Worker                                int x_step_q4, int w, int h) {
48*fb1b10abSAndroid Build Coastguard Worker   int x, y;
49*fb1b10abSAndroid Build Coastguard Worker   src -= SUBPEL_TAPS / 2 - 1;
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < h; ++y) {
52*fb1b10abSAndroid Build Coastguard Worker     int x_q4 = x0_q4;
53*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < w; ++x) {
54*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *const src_x = &src[x_q4 >> SUBPEL_BITS];
55*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const x_filter = x_filters[x_q4 & SUBPEL_MASK];
56*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
57*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k) sum += src_x[k] * x_filter[k];
58*fb1b10abSAndroid Build Coastguard Worker       dst[x] = ROUND_POWER_OF_TWO(
59*fb1b10abSAndroid Build Coastguard Worker           dst[x] + clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)), 1);
60*fb1b10abSAndroid Build Coastguard Worker       x_q4 += x_step_q4;
61*fb1b10abSAndroid Build Coastguard Worker     }
62*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
63*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
64*fb1b10abSAndroid Build Coastguard Worker   }
65*fb1b10abSAndroid Build Coastguard Worker }
66*fb1b10abSAndroid Build Coastguard Worker 
convolve_vert(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * y_filters,int y0_q4,int y_step_q4,int w,int h)67*fb1b10abSAndroid Build Coastguard Worker static void convolve_vert(const uint8_t *src, ptrdiff_t src_stride,
68*fb1b10abSAndroid Build Coastguard Worker                           uint8_t *dst, ptrdiff_t dst_stride,
69*fb1b10abSAndroid Build Coastguard Worker                           const InterpKernel *y_filters, int y0_q4,
70*fb1b10abSAndroid Build Coastguard Worker                           int y_step_q4, int w, int h) {
71*fb1b10abSAndroid Build Coastguard Worker   int x, y;
72*fb1b10abSAndroid Build Coastguard Worker   src -= src_stride * (SUBPEL_TAPS / 2 - 1);
73*fb1b10abSAndroid Build Coastguard Worker 
74*fb1b10abSAndroid Build Coastguard Worker   for (x = 0; x < w; ++x) {
75*fb1b10abSAndroid Build Coastguard Worker     int y_q4 = y0_q4;
76*fb1b10abSAndroid Build Coastguard Worker     for (y = 0; y < h; ++y) {
77*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_y = &src[(y_q4 >> SUBPEL_BITS) * src_stride];
78*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const y_filter = y_filters[y_q4 & SUBPEL_MASK];
79*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
80*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k)
81*fb1b10abSAndroid Build Coastguard Worker         sum += src_y[k * src_stride] * y_filter[k];
82*fb1b10abSAndroid Build Coastguard Worker       dst[y * dst_stride] = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS));
83*fb1b10abSAndroid Build Coastguard Worker       y_q4 += y_step_q4;
84*fb1b10abSAndroid Build Coastguard Worker     }
85*fb1b10abSAndroid Build Coastguard Worker     ++src;
86*fb1b10abSAndroid Build Coastguard Worker     ++dst;
87*fb1b10abSAndroid Build Coastguard Worker   }
88*fb1b10abSAndroid Build Coastguard Worker }
89*fb1b10abSAndroid Build Coastguard Worker 
convolve_avg_vert(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * y_filters,int y0_q4,int y_step_q4,int w,int h)90*fb1b10abSAndroid Build Coastguard Worker static void convolve_avg_vert(const uint8_t *src, ptrdiff_t src_stride,
91*fb1b10abSAndroid Build Coastguard Worker                               uint8_t *dst, ptrdiff_t dst_stride,
92*fb1b10abSAndroid Build Coastguard Worker                               const InterpKernel *y_filters, int y0_q4,
93*fb1b10abSAndroid Build Coastguard Worker                               int y_step_q4, int w, int h) {
94*fb1b10abSAndroid Build Coastguard Worker   int x, y;
95*fb1b10abSAndroid Build Coastguard Worker   src -= src_stride * (SUBPEL_TAPS / 2 - 1);
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker   for (x = 0; x < w; ++x) {
98*fb1b10abSAndroid Build Coastguard Worker     int y_q4 = y0_q4;
99*fb1b10abSAndroid Build Coastguard Worker     for (y = 0; y < h; ++y) {
100*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_y = &src[(y_q4 >> SUBPEL_BITS) * src_stride];
101*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const y_filter = y_filters[y_q4 & SUBPEL_MASK];
102*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
103*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k)
104*fb1b10abSAndroid Build Coastguard Worker         sum += src_y[k * src_stride] * y_filter[k];
105*fb1b10abSAndroid Build Coastguard Worker       dst[y * dst_stride] = ROUND_POWER_OF_TWO(
106*fb1b10abSAndroid Build Coastguard Worker           dst[y * dst_stride] +
107*fb1b10abSAndroid Build Coastguard Worker               clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)),
108*fb1b10abSAndroid Build Coastguard Worker           1);
109*fb1b10abSAndroid Build Coastguard Worker       y_q4 += y_step_q4;
110*fb1b10abSAndroid Build Coastguard Worker     }
111*fb1b10abSAndroid Build Coastguard Worker     ++src;
112*fb1b10abSAndroid Build Coastguard Worker     ++dst;
113*fb1b10abSAndroid Build Coastguard Worker   }
114*fb1b10abSAndroid Build Coastguard Worker }
115*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve8_horiz_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)116*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve8_horiz_c(const uint8_t *src, ptrdiff_t src_stride,
117*fb1b10abSAndroid Build Coastguard Worker                            uint8_t *dst, ptrdiff_t dst_stride,
118*fb1b10abSAndroid Build Coastguard Worker                            const InterpKernel *filter, int x0_q4, int x_step_q4,
119*fb1b10abSAndroid Build Coastguard Worker                            int y0_q4, int y_step_q4, int w, int h) {
120*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
121*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
122*fb1b10abSAndroid Build Coastguard Worker   convolve_horiz(src, src_stride, dst, dst_stride, filter, x0_q4, x_step_q4, w,
123*fb1b10abSAndroid Build Coastguard Worker                  h);
124*fb1b10abSAndroid Build Coastguard Worker }
125*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve8_avg_horiz_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)126*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve8_avg_horiz_c(const uint8_t *src, ptrdiff_t src_stride,
127*fb1b10abSAndroid Build Coastguard Worker                                uint8_t *dst, ptrdiff_t dst_stride,
128*fb1b10abSAndroid Build Coastguard Worker                                const InterpKernel *filter, int x0_q4,
129*fb1b10abSAndroid Build Coastguard Worker                                int x_step_q4, int y0_q4, int y_step_q4, int w,
130*fb1b10abSAndroid Build Coastguard Worker                                int h) {
131*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
132*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
133*fb1b10abSAndroid Build Coastguard Worker   convolve_avg_horiz(src, src_stride, dst, dst_stride, filter, x0_q4, x_step_q4,
134*fb1b10abSAndroid Build Coastguard Worker                      w, h);
135*fb1b10abSAndroid Build Coastguard Worker }
136*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve8_vert_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)137*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve8_vert_c(const uint8_t *src, ptrdiff_t src_stride,
138*fb1b10abSAndroid Build Coastguard Worker                           uint8_t *dst, ptrdiff_t dst_stride,
139*fb1b10abSAndroid Build Coastguard Worker                           const InterpKernel *filter, int x0_q4, int x_step_q4,
140*fb1b10abSAndroid Build Coastguard Worker                           int y0_q4, int y_step_q4, int w, int h) {
141*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
142*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
143*fb1b10abSAndroid Build Coastguard Worker   convolve_vert(src, src_stride, dst, dst_stride, filter, y0_q4, y_step_q4, w,
144*fb1b10abSAndroid Build Coastguard Worker                 h);
145*fb1b10abSAndroid Build Coastguard Worker }
146*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve8_avg_vert_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)147*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve8_avg_vert_c(const uint8_t *src, ptrdiff_t src_stride,
148*fb1b10abSAndroid Build Coastguard Worker                               uint8_t *dst, ptrdiff_t dst_stride,
149*fb1b10abSAndroid Build Coastguard Worker                               const InterpKernel *filter, int x0_q4,
150*fb1b10abSAndroid Build Coastguard Worker                               int x_step_q4, int y0_q4, int y_step_q4, int w,
151*fb1b10abSAndroid Build Coastguard Worker                               int h) {
152*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
153*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
154*fb1b10abSAndroid Build Coastguard Worker   convolve_avg_vert(src, src_stride, dst, dst_stride, filter, y0_q4, y_step_q4,
155*fb1b10abSAndroid Build Coastguard Worker                     w, h);
156*fb1b10abSAndroid Build Coastguard Worker }
157*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve8_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)158*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve8_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
159*fb1b10abSAndroid Build Coastguard Worker                      ptrdiff_t dst_stride, const InterpKernel *filter,
160*fb1b10abSAndroid Build Coastguard Worker                      int x0_q4, int x_step_q4, int y0_q4, int y_step_q4, int w,
161*fb1b10abSAndroid Build Coastguard Worker                      int h) {
162*fb1b10abSAndroid Build Coastguard Worker   // Note: Fixed size intermediate buffer, temp, places limits on parameters.
163*fb1b10abSAndroid Build Coastguard Worker   // 2d filtering proceeds in 2 steps:
164*fb1b10abSAndroid Build Coastguard Worker   //   (1) Interpolate horizontally into an intermediate buffer, temp.
165*fb1b10abSAndroid Build Coastguard Worker   //   (2) Interpolate temp vertically to derive the sub-pixel result.
166*fb1b10abSAndroid Build Coastguard Worker   // Deriving the maximum number of rows in the temp buffer (135):
167*fb1b10abSAndroid Build Coastguard Worker   // --Smallest scaling factor is x1/2 ==> y_step_q4 = 32 (Normative).
168*fb1b10abSAndroid Build Coastguard Worker   // --Largest block size is 64x64 pixels.
169*fb1b10abSAndroid Build Coastguard Worker   // --64 rows in the downscaled frame span a distance of (64 - 1) * 32 in the
170*fb1b10abSAndroid Build Coastguard Worker   //   original frame (in 1/16th pixel units).
171*fb1b10abSAndroid Build Coastguard Worker   // --Must round-up because block may be located at sub-pixel position.
172*fb1b10abSAndroid Build Coastguard Worker   // --Require an additional SUBPEL_TAPS rows for the 8-tap filter tails.
173*fb1b10abSAndroid Build Coastguard Worker   // --((64 - 1) * 32 + 15) >> 4 + 8 = 135.
174*fb1b10abSAndroid Build Coastguard Worker   // When calling in frame scaling function, the smallest scaling factor is x1/4
175*fb1b10abSAndroid Build Coastguard Worker   // ==> y_step_q4 = 64. Since w and h are at most 16, the temp buffer is still
176*fb1b10abSAndroid Build Coastguard Worker   // big enough.
177*fb1b10abSAndroid Build Coastguard Worker   uint8_t temp[64 * 135];
178*fb1b10abSAndroid Build Coastguard Worker   const int intermediate_height =
179*fb1b10abSAndroid Build Coastguard Worker       (((h - 1) * y_step_q4 + y0_q4) >> SUBPEL_BITS) + SUBPEL_TAPS;
180*fb1b10abSAndroid Build Coastguard Worker 
181*fb1b10abSAndroid Build Coastguard Worker   assert(w <= 64);
182*fb1b10abSAndroid Build Coastguard Worker   assert(h <= 64);
183*fb1b10abSAndroid Build Coastguard Worker   assert(y_step_q4 <= 32 || (y_step_q4 <= 64 && h <= 32));
184*fb1b10abSAndroid Build Coastguard Worker   assert(x_step_q4 <= 64);
185*fb1b10abSAndroid Build Coastguard Worker 
186*fb1b10abSAndroid Build Coastguard Worker   convolve_horiz(src - src_stride * (SUBPEL_TAPS / 2 - 1), src_stride, temp, 64,
187*fb1b10abSAndroid Build Coastguard Worker                  filter, x0_q4, x_step_q4, w, intermediate_height);
188*fb1b10abSAndroid Build Coastguard Worker   convolve_vert(temp + 64 * (SUBPEL_TAPS / 2 - 1), 64, dst, dst_stride, filter,
189*fb1b10abSAndroid Build Coastguard Worker                 y0_q4, y_step_q4, w, h);
190*fb1b10abSAndroid Build Coastguard Worker }
191*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve8_avg_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)192*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve8_avg_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
193*fb1b10abSAndroid Build Coastguard Worker                          ptrdiff_t dst_stride, const InterpKernel *filter,
194*fb1b10abSAndroid Build Coastguard Worker                          int x0_q4, int x_step_q4, int y0_q4, int y_step_q4,
195*fb1b10abSAndroid Build Coastguard Worker                          int w, int h) {
196*fb1b10abSAndroid Build Coastguard Worker   // Fixed size intermediate buffer places limits on parameters.
197*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint8_t, temp[64 * 64]);
198*fb1b10abSAndroid Build Coastguard Worker   assert(w <= 64);
199*fb1b10abSAndroid Build Coastguard Worker   assert(h <= 64);
200*fb1b10abSAndroid Build Coastguard Worker 
201*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_c(src, src_stride, temp, 64, filter, x0_q4, x_step_q4, y0_q4,
202*fb1b10abSAndroid Build Coastguard Worker                   y_step_q4, w, h);
203*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve_avg_c(temp, 64, dst, dst_stride, NULL, 0, 0, 0, 0, w, h);
204*fb1b10abSAndroid Build Coastguard Worker }
205*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve_copy_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)206*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve_copy_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
207*fb1b10abSAndroid Build Coastguard Worker                          ptrdiff_t dst_stride, const InterpKernel *filter,
208*fb1b10abSAndroid Build Coastguard Worker                          int x0_q4, int x_step_q4, int y0_q4, int y_step_q4,
209*fb1b10abSAndroid Build Coastguard Worker                          int w, int h) {
210*fb1b10abSAndroid Build Coastguard Worker   int r;
211*fb1b10abSAndroid Build Coastguard Worker 
212*fb1b10abSAndroid Build Coastguard Worker   (void)filter;
213*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
214*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
215*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
216*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
217*fb1b10abSAndroid Build Coastguard Worker 
218*fb1b10abSAndroid Build Coastguard Worker   for (r = h; r > 0; --r) {
219*fb1b10abSAndroid Build Coastguard Worker     memcpy(dst, src, w);
220*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
221*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
222*fb1b10abSAndroid Build Coastguard Worker   }
223*fb1b10abSAndroid Build Coastguard Worker }
224*fb1b10abSAndroid Build Coastguard Worker 
vpx_convolve_avg_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)225*fb1b10abSAndroid Build Coastguard Worker void vpx_convolve_avg_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
226*fb1b10abSAndroid Build Coastguard Worker                         ptrdiff_t dst_stride, const InterpKernel *filter,
227*fb1b10abSAndroid Build Coastguard Worker                         int x0_q4, int x_step_q4, int y0_q4, int y_step_q4,
228*fb1b10abSAndroid Build Coastguard Worker                         int w, int h) {
229*fb1b10abSAndroid Build Coastguard Worker   int x, y;
230*fb1b10abSAndroid Build Coastguard Worker 
231*fb1b10abSAndroid Build Coastguard Worker   (void)filter;
232*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
233*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
234*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
235*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
236*fb1b10abSAndroid Build Coastguard Worker 
237*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < h; ++y) {
238*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < w; ++x) dst[x] = ROUND_POWER_OF_TWO(dst[x] + src[x], 1);
239*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
240*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
241*fb1b10abSAndroid Build Coastguard Worker   }
242*fb1b10abSAndroid Build Coastguard Worker }
243*fb1b10abSAndroid Build Coastguard Worker 
vpx_scaled_horiz_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)244*fb1b10abSAndroid Build Coastguard Worker void vpx_scaled_horiz_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
245*fb1b10abSAndroid Build Coastguard Worker                         ptrdiff_t dst_stride, const InterpKernel *filter,
246*fb1b10abSAndroid Build Coastguard Worker                         int x0_q4, int x_step_q4, int y0_q4, int y_step_q4,
247*fb1b10abSAndroid Build Coastguard Worker                         int w, int h) {
248*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_horiz_c(src, src_stride, dst, dst_stride, filter, x0_q4,
249*fb1b10abSAndroid Build Coastguard Worker                         x_step_q4, y0_q4, y_step_q4, w, h);
250*fb1b10abSAndroid Build Coastguard Worker }
251*fb1b10abSAndroid Build Coastguard Worker 
vpx_scaled_vert_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)252*fb1b10abSAndroid Build Coastguard Worker void vpx_scaled_vert_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
253*fb1b10abSAndroid Build Coastguard Worker                        ptrdiff_t dst_stride, const InterpKernel *filter,
254*fb1b10abSAndroid Build Coastguard Worker                        int x0_q4, int x_step_q4, int y0_q4, int y_step_q4,
255*fb1b10abSAndroid Build Coastguard Worker                        int w, int h) {
256*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_vert_c(src, src_stride, dst, dst_stride, filter, x0_q4,
257*fb1b10abSAndroid Build Coastguard Worker                        x_step_q4, y0_q4, y_step_q4, w, h);
258*fb1b10abSAndroid Build Coastguard Worker }
259*fb1b10abSAndroid Build Coastguard Worker 
vpx_scaled_2d_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)260*fb1b10abSAndroid Build Coastguard Worker void vpx_scaled_2d_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
261*fb1b10abSAndroid Build Coastguard Worker                      ptrdiff_t dst_stride, const InterpKernel *filter,
262*fb1b10abSAndroid Build Coastguard Worker                      int x0_q4, int x_step_q4, int y0_q4, int y_step_q4, int w,
263*fb1b10abSAndroid Build Coastguard Worker                      int h) {
264*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_c(src, src_stride, dst, dst_stride, filter, x0_q4, x_step_q4,
265*fb1b10abSAndroid Build Coastguard Worker                   y0_q4, y_step_q4, w, h);
266*fb1b10abSAndroid Build Coastguard Worker }
267*fb1b10abSAndroid Build Coastguard Worker 
vpx_scaled_avg_horiz_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)268*fb1b10abSAndroid Build Coastguard Worker void vpx_scaled_avg_horiz_c(const uint8_t *src, ptrdiff_t src_stride,
269*fb1b10abSAndroid Build Coastguard Worker                             uint8_t *dst, ptrdiff_t dst_stride,
270*fb1b10abSAndroid Build Coastguard Worker                             const InterpKernel *filter, int x0_q4,
271*fb1b10abSAndroid Build Coastguard Worker                             int x_step_q4, int y0_q4, int y_step_q4, int w,
272*fb1b10abSAndroid Build Coastguard Worker                             int h) {
273*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_avg_horiz_c(src, src_stride, dst, dst_stride, filter, x0_q4,
274*fb1b10abSAndroid Build Coastguard Worker                             x_step_q4, y0_q4, y_step_q4, w, h);
275*fb1b10abSAndroid Build Coastguard Worker }
276*fb1b10abSAndroid Build Coastguard Worker 
vpx_scaled_avg_vert_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)277*fb1b10abSAndroid Build Coastguard Worker void vpx_scaled_avg_vert_c(const uint8_t *src, ptrdiff_t src_stride,
278*fb1b10abSAndroid Build Coastguard Worker                            uint8_t *dst, ptrdiff_t dst_stride,
279*fb1b10abSAndroid Build Coastguard Worker                            const InterpKernel *filter, int x0_q4, int x_step_q4,
280*fb1b10abSAndroid Build Coastguard Worker                            int y0_q4, int y_step_q4, int w, int h) {
281*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_avg_vert_c(src, src_stride, dst, dst_stride, filter, x0_q4,
282*fb1b10abSAndroid Build Coastguard Worker                            x_step_q4, y0_q4, y_step_q4, w, h);
283*fb1b10abSAndroid Build Coastguard Worker }
284*fb1b10abSAndroid Build Coastguard Worker 
vpx_scaled_avg_2d_c(const uint8_t * src,ptrdiff_t src_stride,uint8_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h)285*fb1b10abSAndroid Build Coastguard Worker void vpx_scaled_avg_2d_c(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
286*fb1b10abSAndroid Build Coastguard Worker                          ptrdiff_t dst_stride, const InterpKernel *filter,
287*fb1b10abSAndroid Build Coastguard Worker                          int x0_q4, int x_step_q4, int y0_q4, int y_step_q4,
288*fb1b10abSAndroid Build Coastguard Worker                          int w, int h) {
289*fb1b10abSAndroid Build Coastguard Worker   vpx_convolve8_avg_c(src, src_stride, dst, dst_stride, filter, x0_q4,
290*fb1b10abSAndroid Build Coastguard Worker                       x_step_q4, y0_q4, y_step_q4, w, h);
291*fb1b10abSAndroid Build Coastguard Worker }
292*fb1b10abSAndroid Build Coastguard Worker 
293*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
highbd_convolve_horiz(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * x_filters,int x0_q4,int x_step_q4,int w,int h,int bd)294*fb1b10abSAndroid Build Coastguard Worker static void highbd_convolve_horiz(const uint16_t *src, ptrdiff_t src_stride,
295*fb1b10abSAndroid Build Coastguard Worker                                   uint16_t *dst, ptrdiff_t dst_stride,
296*fb1b10abSAndroid Build Coastguard Worker                                   const InterpKernel *x_filters, int x0_q4,
297*fb1b10abSAndroid Build Coastguard Worker                                   int x_step_q4, int w, int h, int bd) {
298*fb1b10abSAndroid Build Coastguard Worker   int x, y;
299*fb1b10abSAndroid Build Coastguard Worker   src -= SUBPEL_TAPS / 2 - 1;
300*fb1b10abSAndroid Build Coastguard Worker 
301*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < h; ++y) {
302*fb1b10abSAndroid Build Coastguard Worker     int x_q4 = x0_q4;
303*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < w; ++x) {
304*fb1b10abSAndroid Build Coastguard Worker       const uint16_t *const src_x = &src[x_q4 >> SUBPEL_BITS];
305*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const x_filter = x_filters[x_q4 & SUBPEL_MASK];
306*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
307*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k) sum += src_x[k] * x_filter[k];
308*fb1b10abSAndroid Build Coastguard Worker       dst[x] = clip_pixel_highbd(ROUND_POWER_OF_TWO(sum, FILTER_BITS), bd);
309*fb1b10abSAndroid Build Coastguard Worker       x_q4 += x_step_q4;
310*fb1b10abSAndroid Build Coastguard Worker     }
311*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
312*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
313*fb1b10abSAndroid Build Coastguard Worker   }
314*fb1b10abSAndroid Build Coastguard Worker }
315*fb1b10abSAndroid Build Coastguard Worker 
highbd_convolve_avg_horiz(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * x_filters,int x0_q4,int x_step_q4,int w,int h,int bd)316*fb1b10abSAndroid Build Coastguard Worker static void highbd_convolve_avg_horiz(const uint16_t *src, ptrdiff_t src_stride,
317*fb1b10abSAndroid Build Coastguard Worker                                       uint16_t *dst, ptrdiff_t dst_stride,
318*fb1b10abSAndroid Build Coastguard Worker                                       const InterpKernel *x_filters, int x0_q4,
319*fb1b10abSAndroid Build Coastguard Worker                                       int x_step_q4, int w, int h, int bd) {
320*fb1b10abSAndroid Build Coastguard Worker   int x, y;
321*fb1b10abSAndroid Build Coastguard Worker   src -= SUBPEL_TAPS / 2 - 1;
322*fb1b10abSAndroid Build Coastguard Worker 
323*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < h; ++y) {
324*fb1b10abSAndroid Build Coastguard Worker     int x_q4 = x0_q4;
325*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < w; ++x) {
326*fb1b10abSAndroid Build Coastguard Worker       const uint16_t *const src_x = &src[x_q4 >> SUBPEL_BITS];
327*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const x_filter = x_filters[x_q4 & SUBPEL_MASK];
328*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
329*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k) sum += src_x[k] * x_filter[k];
330*fb1b10abSAndroid Build Coastguard Worker       dst[x] = ROUND_POWER_OF_TWO(
331*fb1b10abSAndroid Build Coastguard Worker           dst[x] + clip_pixel_highbd(ROUND_POWER_OF_TWO(sum, FILTER_BITS), bd),
332*fb1b10abSAndroid Build Coastguard Worker           1);
333*fb1b10abSAndroid Build Coastguard Worker       x_q4 += x_step_q4;
334*fb1b10abSAndroid Build Coastguard Worker     }
335*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
336*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
337*fb1b10abSAndroid Build Coastguard Worker   }
338*fb1b10abSAndroid Build Coastguard Worker }
339*fb1b10abSAndroid Build Coastguard Worker 
highbd_convolve_vert(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * y_filters,int y0_q4,int y_step_q4,int w,int h,int bd)340*fb1b10abSAndroid Build Coastguard Worker static void highbd_convolve_vert(const uint16_t *src, ptrdiff_t src_stride,
341*fb1b10abSAndroid Build Coastguard Worker                                  uint16_t *dst, ptrdiff_t dst_stride,
342*fb1b10abSAndroid Build Coastguard Worker                                  const InterpKernel *y_filters, int y0_q4,
343*fb1b10abSAndroid Build Coastguard Worker                                  int y_step_q4, int w, int h, int bd) {
344*fb1b10abSAndroid Build Coastguard Worker   int x, y;
345*fb1b10abSAndroid Build Coastguard Worker   src -= src_stride * (SUBPEL_TAPS / 2 - 1);
346*fb1b10abSAndroid Build Coastguard Worker 
347*fb1b10abSAndroid Build Coastguard Worker   for (x = 0; x < w; ++x) {
348*fb1b10abSAndroid Build Coastguard Worker     int y_q4 = y0_q4;
349*fb1b10abSAndroid Build Coastguard Worker     for (y = 0; y < h; ++y) {
350*fb1b10abSAndroid Build Coastguard Worker       const uint16_t *src_y = &src[(y_q4 >> SUBPEL_BITS) * src_stride];
351*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const y_filter = y_filters[y_q4 & SUBPEL_MASK];
352*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
353*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k)
354*fb1b10abSAndroid Build Coastguard Worker         sum += src_y[k * src_stride] * y_filter[k];
355*fb1b10abSAndroid Build Coastguard Worker       dst[y * dst_stride] =
356*fb1b10abSAndroid Build Coastguard Worker           clip_pixel_highbd(ROUND_POWER_OF_TWO(sum, FILTER_BITS), bd);
357*fb1b10abSAndroid Build Coastguard Worker       y_q4 += y_step_q4;
358*fb1b10abSAndroid Build Coastguard Worker     }
359*fb1b10abSAndroid Build Coastguard Worker     ++src;
360*fb1b10abSAndroid Build Coastguard Worker     ++dst;
361*fb1b10abSAndroid Build Coastguard Worker   }
362*fb1b10abSAndroid Build Coastguard Worker }
363*fb1b10abSAndroid Build Coastguard Worker 
highbd_convolve_avg_vert(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * y_filters,int y0_q4,int y_step_q4,int w,int h,int bd)364*fb1b10abSAndroid Build Coastguard Worker static void highbd_convolve_avg_vert(const uint16_t *src, ptrdiff_t src_stride,
365*fb1b10abSAndroid Build Coastguard Worker                                      uint16_t *dst, ptrdiff_t dst_stride,
366*fb1b10abSAndroid Build Coastguard Worker                                      const InterpKernel *y_filters, int y0_q4,
367*fb1b10abSAndroid Build Coastguard Worker                                      int y_step_q4, int w, int h, int bd) {
368*fb1b10abSAndroid Build Coastguard Worker   int x, y;
369*fb1b10abSAndroid Build Coastguard Worker   src -= src_stride * (SUBPEL_TAPS / 2 - 1);
370*fb1b10abSAndroid Build Coastguard Worker 
371*fb1b10abSAndroid Build Coastguard Worker   for (x = 0; x < w; ++x) {
372*fb1b10abSAndroid Build Coastguard Worker     int y_q4 = y0_q4;
373*fb1b10abSAndroid Build Coastguard Worker     for (y = 0; y < h; ++y) {
374*fb1b10abSAndroid Build Coastguard Worker       const uint16_t *src_y = &src[(y_q4 >> SUBPEL_BITS) * src_stride];
375*fb1b10abSAndroid Build Coastguard Worker       const int16_t *const y_filter = y_filters[y_q4 & SUBPEL_MASK];
376*fb1b10abSAndroid Build Coastguard Worker       int k, sum = 0;
377*fb1b10abSAndroid Build Coastguard Worker       for (k = 0; k < SUBPEL_TAPS; ++k)
378*fb1b10abSAndroid Build Coastguard Worker         sum += src_y[k * src_stride] * y_filter[k];
379*fb1b10abSAndroid Build Coastguard Worker       dst[y * dst_stride] = ROUND_POWER_OF_TWO(
380*fb1b10abSAndroid Build Coastguard Worker           dst[y * dst_stride] +
381*fb1b10abSAndroid Build Coastguard Worker               clip_pixel_highbd(ROUND_POWER_OF_TWO(sum, FILTER_BITS), bd),
382*fb1b10abSAndroid Build Coastguard Worker           1);
383*fb1b10abSAndroid Build Coastguard Worker       y_q4 += y_step_q4;
384*fb1b10abSAndroid Build Coastguard Worker     }
385*fb1b10abSAndroid Build Coastguard Worker     ++src;
386*fb1b10abSAndroid Build Coastguard Worker     ++dst;
387*fb1b10abSAndroid Build Coastguard Worker   }
388*fb1b10abSAndroid Build Coastguard Worker }
389*fb1b10abSAndroid Build Coastguard Worker 
highbd_convolve(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)390*fb1b10abSAndroid Build Coastguard Worker static void highbd_convolve(const uint16_t *src, ptrdiff_t src_stride,
391*fb1b10abSAndroid Build Coastguard Worker                             uint16_t *dst, ptrdiff_t dst_stride,
392*fb1b10abSAndroid Build Coastguard Worker                             const InterpKernel *filter, int x0_q4,
393*fb1b10abSAndroid Build Coastguard Worker                             int x_step_q4, int y0_q4, int y_step_q4, int w,
394*fb1b10abSAndroid Build Coastguard Worker                             int h, int bd) {
395*fb1b10abSAndroid Build Coastguard Worker   // Note: Fixed size intermediate buffer, temp, places limits on parameters.
396*fb1b10abSAndroid Build Coastguard Worker   // 2d filtering proceeds in 2 steps:
397*fb1b10abSAndroid Build Coastguard Worker   //   (1) Interpolate horizontally into an intermediate buffer, temp.
398*fb1b10abSAndroid Build Coastguard Worker   //   (2) Interpolate temp vertically to derive the sub-pixel result.
399*fb1b10abSAndroid Build Coastguard Worker   // Deriving the maximum number of rows in the temp buffer (135):
400*fb1b10abSAndroid Build Coastguard Worker   // --Smallest scaling factor is x1/2 ==> y_step_q4 = 32 (Normative).
401*fb1b10abSAndroid Build Coastguard Worker   // --Largest block size is 64x64 pixels.
402*fb1b10abSAndroid Build Coastguard Worker   // --64 rows in the downscaled frame span a distance of (64 - 1) * 32 in the
403*fb1b10abSAndroid Build Coastguard Worker   //   original frame (in 1/16th pixel units).
404*fb1b10abSAndroid Build Coastguard Worker   // --Must round-up because block may be located at sub-pixel position.
405*fb1b10abSAndroid Build Coastguard Worker   // --Require an additional SUBPEL_TAPS rows for the 8-tap filter tails.
406*fb1b10abSAndroid Build Coastguard Worker   // --((64 - 1) * 32 + 15) >> 4 + 8 = 135.
407*fb1b10abSAndroid Build Coastguard Worker   uint16_t temp[64 * 135];
408*fb1b10abSAndroid Build Coastguard Worker   const int intermediate_height =
409*fb1b10abSAndroid Build Coastguard Worker       (((h - 1) * y_step_q4 + y0_q4) >> SUBPEL_BITS) + SUBPEL_TAPS;
410*fb1b10abSAndroid Build Coastguard Worker 
411*fb1b10abSAndroid Build Coastguard Worker   assert(w <= 64);
412*fb1b10abSAndroid Build Coastguard Worker   assert(h <= 64);
413*fb1b10abSAndroid Build Coastguard Worker   assert(y_step_q4 <= 32);
414*fb1b10abSAndroid Build Coastguard Worker   assert(x_step_q4 <= 32);
415*fb1b10abSAndroid Build Coastguard Worker 
416*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve_horiz(src - src_stride * (SUBPEL_TAPS / 2 - 1), src_stride,
417*fb1b10abSAndroid Build Coastguard Worker                         temp, 64, filter, x0_q4, x_step_q4, w,
418*fb1b10abSAndroid Build Coastguard Worker                         intermediate_height, bd);
419*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve_vert(temp + 64 * (SUBPEL_TAPS / 2 - 1), 64, dst, dst_stride,
420*fb1b10abSAndroid Build Coastguard Worker                        filter, y0_q4, y_step_q4, w, h, bd);
421*fb1b10abSAndroid Build Coastguard Worker }
422*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve8_horiz_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)423*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve8_horiz_c(const uint16_t *src, ptrdiff_t src_stride,
424*fb1b10abSAndroid Build Coastguard Worker                                   uint16_t *dst, ptrdiff_t dst_stride,
425*fb1b10abSAndroid Build Coastguard Worker                                   const InterpKernel *filter, int x0_q4,
426*fb1b10abSAndroid Build Coastguard Worker                                   int x_step_q4, int y0_q4, int y_step_q4,
427*fb1b10abSAndroid Build Coastguard Worker                                   int w, int h, int bd) {
428*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
429*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
430*fb1b10abSAndroid Build Coastguard Worker 
431*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve_horiz(src, src_stride, dst, dst_stride, filter, x0_q4,
432*fb1b10abSAndroid Build Coastguard Worker                         x_step_q4, w, h, bd);
433*fb1b10abSAndroid Build Coastguard Worker }
434*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve8_avg_horiz_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)435*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve8_avg_horiz_c(const uint16_t *src, ptrdiff_t src_stride,
436*fb1b10abSAndroid Build Coastguard Worker                                       uint16_t *dst, ptrdiff_t dst_stride,
437*fb1b10abSAndroid Build Coastguard Worker                                       const InterpKernel *filter, int x0_q4,
438*fb1b10abSAndroid Build Coastguard Worker                                       int x_step_q4, int y0_q4, int y_step_q4,
439*fb1b10abSAndroid Build Coastguard Worker                                       int w, int h, int bd) {
440*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
441*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
442*fb1b10abSAndroid Build Coastguard Worker 
443*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve_avg_horiz(src, src_stride, dst, dst_stride, filter, x0_q4,
444*fb1b10abSAndroid Build Coastguard Worker                             x_step_q4, w, h, bd);
445*fb1b10abSAndroid Build Coastguard Worker }
446*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve8_vert_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)447*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve8_vert_c(const uint16_t *src, ptrdiff_t src_stride,
448*fb1b10abSAndroid Build Coastguard Worker                                  uint16_t *dst, ptrdiff_t dst_stride,
449*fb1b10abSAndroid Build Coastguard Worker                                  const InterpKernel *filter, int x0_q4,
450*fb1b10abSAndroid Build Coastguard Worker                                  int x_step_q4, int y0_q4, int y_step_q4, int w,
451*fb1b10abSAndroid Build Coastguard Worker                                  int h, int bd) {
452*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
453*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
454*fb1b10abSAndroid Build Coastguard Worker 
455*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve_vert(src, src_stride, dst, dst_stride, filter, y0_q4,
456*fb1b10abSAndroid Build Coastguard Worker                        y_step_q4, w, h, bd);
457*fb1b10abSAndroid Build Coastguard Worker }
458*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve8_avg_vert_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)459*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve8_avg_vert_c(const uint16_t *src, ptrdiff_t src_stride,
460*fb1b10abSAndroid Build Coastguard Worker                                      uint16_t *dst, ptrdiff_t dst_stride,
461*fb1b10abSAndroid Build Coastguard Worker                                      const InterpKernel *filter, int x0_q4,
462*fb1b10abSAndroid Build Coastguard Worker                                      int x_step_q4, int y0_q4, int y_step_q4,
463*fb1b10abSAndroid Build Coastguard Worker                                      int w, int h, int bd) {
464*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
465*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
466*fb1b10abSAndroid Build Coastguard Worker 
467*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve_avg_vert(src, src_stride, dst, dst_stride, filter, y0_q4,
468*fb1b10abSAndroid Build Coastguard Worker                            y_step_q4, w, h, bd);
469*fb1b10abSAndroid Build Coastguard Worker }
470*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve8_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)471*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve8_c(const uint16_t *src, ptrdiff_t src_stride,
472*fb1b10abSAndroid Build Coastguard Worker                             uint16_t *dst, ptrdiff_t dst_stride,
473*fb1b10abSAndroid Build Coastguard Worker                             const InterpKernel *filter, int x0_q4,
474*fb1b10abSAndroid Build Coastguard Worker                             int x_step_q4, int y0_q4, int y_step_q4, int w,
475*fb1b10abSAndroid Build Coastguard Worker                             int h, int bd) {
476*fb1b10abSAndroid Build Coastguard Worker   highbd_convolve(src, src_stride, dst, dst_stride, filter, x0_q4, x_step_q4,
477*fb1b10abSAndroid Build Coastguard Worker                   y0_q4, y_step_q4, w, h, bd);
478*fb1b10abSAndroid Build Coastguard Worker }
479*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve8_avg_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)480*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve8_avg_c(const uint16_t *src, ptrdiff_t src_stride,
481*fb1b10abSAndroid Build Coastguard Worker                                 uint16_t *dst, ptrdiff_t dst_stride,
482*fb1b10abSAndroid Build Coastguard Worker                                 const InterpKernel *filter, int x0_q4,
483*fb1b10abSAndroid Build Coastguard Worker                                 int x_step_q4, int y0_q4, int y_step_q4, int w,
484*fb1b10abSAndroid Build Coastguard Worker                                 int h, int bd) {
485*fb1b10abSAndroid Build Coastguard Worker   // Fixed size intermediate buffer places limits on parameters.
486*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint16_t, temp[64 * 64]);
487*fb1b10abSAndroid Build Coastguard Worker   assert(w <= 64);
488*fb1b10abSAndroid Build Coastguard Worker   assert(h <= 64);
489*fb1b10abSAndroid Build Coastguard Worker 
490*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_convolve8_c(src, src_stride, temp, 64, filter, x0_q4, x_step_q4,
491*fb1b10abSAndroid Build Coastguard Worker                          y0_q4, y_step_q4, w, h, bd);
492*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_convolve_avg_c(temp, 64, dst, dst_stride, NULL, 0, 0, 0, 0, w, h,
493*fb1b10abSAndroid Build Coastguard Worker                             bd);
494*fb1b10abSAndroid Build Coastguard Worker }
495*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve_copy_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)496*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve_copy_c(const uint16_t *src, ptrdiff_t src_stride,
497*fb1b10abSAndroid Build Coastguard Worker                                 uint16_t *dst, ptrdiff_t dst_stride,
498*fb1b10abSAndroid Build Coastguard Worker                                 const InterpKernel *filter, int x0_q4,
499*fb1b10abSAndroid Build Coastguard Worker                                 int x_step_q4, int y0_q4, int y_step_q4, int w,
500*fb1b10abSAndroid Build Coastguard Worker                                 int h, int bd) {
501*fb1b10abSAndroid Build Coastguard Worker   int r;
502*fb1b10abSAndroid Build Coastguard Worker 
503*fb1b10abSAndroid Build Coastguard Worker   (void)filter;
504*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
505*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
506*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
507*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
508*fb1b10abSAndroid Build Coastguard Worker   (void)bd;
509*fb1b10abSAndroid Build Coastguard Worker 
510*fb1b10abSAndroid Build Coastguard Worker   for (r = h; r > 0; --r) {
511*fb1b10abSAndroid Build Coastguard Worker     memcpy(dst, src, w * sizeof(uint16_t));
512*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
513*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
514*fb1b10abSAndroid Build Coastguard Worker   }
515*fb1b10abSAndroid Build Coastguard Worker }
516*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_convolve_avg_c(const uint16_t * src,ptrdiff_t src_stride,uint16_t * dst,ptrdiff_t dst_stride,const InterpKernel * filter,int x0_q4,int x_step_q4,int y0_q4,int y_step_q4,int w,int h,int bd)517*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_convolve_avg_c(const uint16_t *src, ptrdiff_t src_stride,
518*fb1b10abSAndroid Build Coastguard Worker                                uint16_t *dst, ptrdiff_t dst_stride,
519*fb1b10abSAndroid Build Coastguard Worker                                const InterpKernel *filter, int x0_q4,
520*fb1b10abSAndroid Build Coastguard Worker                                int x_step_q4, int y0_q4, int y_step_q4, int w,
521*fb1b10abSAndroid Build Coastguard Worker                                int h, int bd) {
522*fb1b10abSAndroid Build Coastguard Worker   int x, y;
523*fb1b10abSAndroid Build Coastguard Worker 
524*fb1b10abSAndroid Build Coastguard Worker   (void)filter;
525*fb1b10abSAndroid Build Coastguard Worker   (void)x0_q4;
526*fb1b10abSAndroid Build Coastguard Worker   (void)x_step_q4;
527*fb1b10abSAndroid Build Coastguard Worker   (void)y0_q4;
528*fb1b10abSAndroid Build Coastguard Worker   (void)y_step_q4;
529*fb1b10abSAndroid Build Coastguard Worker   (void)bd;
530*fb1b10abSAndroid Build Coastguard Worker 
531*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < h; ++y) {
532*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < w; ++x) dst[x] = ROUND_POWER_OF_TWO(dst[x] + src[x], 1);
533*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
534*fb1b10abSAndroid Build Coastguard Worker     dst += dst_stride;
535*fb1b10abSAndroid Build Coastguard Worker   }
536*fb1b10abSAndroid Build Coastguard Worker }
537*fb1b10abSAndroid Build Coastguard Worker #endif
538