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