31 |
|
|
32 |
|
|
33 |
#include "../portab.h" |
#include "../portab.h" |
34 |
|
#include "../global.h" |
35 |
#include "interpolate8x8.h" |
#include "interpolate8x8.h" |
36 |
|
|
37 |
// function pointers |
// function pointers |
42 |
INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2; |
INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2; |
43 |
INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4; |
INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4; |
44 |
|
|
45 |
INTERPOLATE8X8_LOWPASS_PTR interpolate8x8_lowpass_h; |
INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_h; |
46 |
INTERPOLATE8X8_LOWPASS_PTR interpolate8x8_lowpass_v; |
INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_v; |
47 |
INTERPOLATE8X8_LOWPASS_HV_PTR interpolate8x8_lowpass_hv; |
|
48 |
|
INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_h; |
49 |
|
INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_v; |
50 |
|
|
51 |
|
INTERPOLATE_LOWPASS_HV_PTR interpolate8x8_lowpass_hv; |
52 |
|
INTERPOLATE_LOWPASS_HV_PTR interpolate16x16_lowpass_hv; |
53 |
|
|
54 |
INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h; |
INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h; |
55 |
INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v; |
INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v; |
56 |
|
|
57 |
void interpolate8x8_avg2_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint32_t stride, const uint32_t rounding) |
void interpolate8x8_avg2_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint32_t stride, const uint32_t rounding, const uint32_t height) |
58 |
{ |
{ |
59 |
int32_t i; |
uint32_t i; |
60 |
const int32_t round = 1 - rounding; |
const int32_t round = 1 - rounding; |
61 |
|
|
62 |
for(i = 0; i < 8; i++) |
for(i = 0; i < height; i++) |
63 |
{ |
{ |
64 |
dst[0] = (src1[0] + src2[0] + round) >> 1; |
dst[0] = (src1[0] + src2[0] + round) >> 1; |
65 |
dst[1] = (src1[1] + src2[1] + round) >> 1; |
dst[1] = (src1[1] + src2[1] + round) >> 1; |
168 |
* QPEL STUFF STARTS HERE * |
* QPEL STUFF STARTS HERE * |
169 |
*************************************************************/ |
*************************************************************/ |
170 |
|
|
|
#define CLIP(X,A,B) (X < A) ? (A) : ((X > B) ? (B) : (X)) |
|
|
|
|
171 |
void interpolate8x8_6tap_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
void interpolate8x8_6tap_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
172 |
{ |
{ |
173 |
int32_t i; |
int32_t i; |
190 |
} |
} |
191 |
} |
} |
192 |
|
|
193 |
|
void interpolate16x16_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
194 |
|
{ |
195 |
|
int32_t i; |
196 |
|
uint8_t round_add = 16 - rounding; |
197 |
|
|
198 |
|
for(i = 0; i < 17; i++) |
199 |
|
{ |
200 |
|
|
201 |
|
dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); |
202 |
|
dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255); |
203 |
|
dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255); |
204 |
|
|
205 |
|
dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255); |
206 |
|
dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255); |
207 |
|
dst[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255); |
208 |
|
dst[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255); |
209 |
|
dst[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255); |
210 |
|
dst[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255); |
211 |
|
dst[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255); |
212 |
|
dst[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255); |
213 |
|
dst[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255); |
214 |
|
dst[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255); |
215 |
|
|
216 |
|
dst[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255); |
217 |
|
dst[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255); |
218 |
|
dst[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255); |
219 |
|
|
220 |
|
dst += stride; |
221 |
|
src += stride; |
222 |
|
} |
223 |
|
} |
224 |
|
|
225 |
void interpolate8x8_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
void interpolate8x8_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
226 |
{ |
{ |
227 |
int32_t i; |
int32_t i; |
228 |
uint8_t round_add = 16 - rounding; |
uint8_t round_add = 16 - rounding; |
229 |
|
|
230 |
for(i = 0; i < 8; i++) |
for(i = 0; i < 9; i++) |
231 |
{ |
{ |
232 |
|
|
233 |
dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); |
dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); |
279 |
} |
} |
280 |
} |
} |
281 |
|
|
282 |
|
void interpolate16x16_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
283 |
|
{ |
284 |
|
int32_t i; |
285 |
|
uint8_t round_add = 16 - rounding; |
286 |
|
|
287 |
|
for(i = 0; i < 17; i++) |
288 |
|
{ |
289 |
|
int32_t src0 = src[0]; |
290 |
|
int32_t src1 = src[stride]; |
291 |
|
int32_t src2 = src[2 * stride]; |
292 |
|
int32_t src3 = src[3 * stride]; |
293 |
|
int32_t src4 = src[4 * stride]; |
294 |
|
int32_t src5 = src[5 * stride]; |
295 |
|
int32_t src6 = src[6 * stride]; |
296 |
|
int32_t src7 = src[7 * stride]; |
297 |
|
int32_t src8 = src[8 * stride]; |
298 |
|
int32_t src9 = src[9 * stride]; |
299 |
|
int32_t src10 = src[10 * stride]; |
300 |
|
int32_t src11 = src[11 * stride]; |
301 |
|
int32_t src12 = src[12 * stride]; |
302 |
|
int32_t src13 = src[13 * stride]; |
303 |
|
int32_t src14 = src[14 * stride]; |
304 |
|
int32_t src15 = src[15 * stride]; |
305 |
|
int32_t src16 = src[16 * stride]; |
306 |
|
|
307 |
|
|
308 |
|
dst[0] = CLIP(((7 * ((src0<<1) - src2) + 23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255); |
309 |
|
dst[stride] = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3<<1)) + round_add) >> 5), 0, 255); |
310 |
|
dst[2*stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4)<<1)) - src6 + round_add) >> 5), 0, 255); |
311 |
|
|
312 |
|
dst[3*stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255); |
313 |
|
dst[4*stride] = CLIP(((20 * (src4 + src5) - 3 * (((src3 + src6)<<1) - (src2 + src7)) - (src1 + src8) + round_add) >> 5), 0, 255); |
314 |
|
dst[5*stride] = CLIP(((20 * (src5 + src6) - 3 * (((src4 + src7)<<1) - (src3 + src8)) - (src2 + src9) + round_add) >> 5), 0, 255); |
315 |
|
dst[6*stride] = CLIP(((20 * (src6 + src7) - 3 * (((src5 + src8)<<1) - (src4 + src9)) - (src3 + src10) + round_add) >> 5), 0, 255); |
316 |
|
dst[7*stride] = CLIP(((20 * (src7 + src8) - 3 * (((src6 + src9)<<1) - (src5 + src10)) - (src4 + src11) + round_add) >> 5), 0, 255); |
317 |
|
dst[8*stride] = CLIP(((20 * (src8 + src9) - 3 * (((src7 + src10)<<1) - (src6 + src11)) - (src5 + src12) + round_add) >> 5), 0, 255); |
318 |
|
dst[9*stride] = CLIP(((20 * (src9 + src10) - 3 * (((src8 + src11)<<1) - (src7 + src12)) - (src6 + src13) + round_add) >> 5), 0, 255); |
319 |
|
dst[10*stride] = CLIP(((20 * (src10 + src11) - 3 * (((src9 + src12)<<1) - (src8 + src13)) - (src7 + src14) + round_add) >> 5), 0, 255); |
320 |
|
dst[11*stride] = CLIP(((20 * (src11 + src12) - 3 * (((src10 + src13)<<1) - (src9 + src14)) - (src8 + src15) + round_add) >> 5), 0, 255); |
321 |
|
dst[12*stride] = CLIP(((20 * (src12 + src13) - 3 * (((src11 + src14)<<1) - (src10 + src15)) - (src9 + src16) + round_add) >> 5), 0, 255); |
322 |
|
|
323 |
|
dst[13*stride] = CLIP(((20 * (src13 + src14) + (src16<<1) + 3 * (src11 - ((src12 + src15) << 1)) - src10 + round_add) >> 5), 0, 255); |
324 |
|
dst[14*stride] = CLIP(((19 * src15 + 20 * src14 + 3 * (src12 - src16 - (src13 << 1)) - src11 + round_add) >> 5), 0, 255); |
325 |
|
dst[15*stride] = CLIP(((23 * src15 + 7 * ((src16<<1) - src14) + 3 * src13 - src12 + round_add) >> 5), 0, 255); |
326 |
|
|
327 |
|
dst++; |
328 |
|
src++; |
329 |
|
} |
330 |
|
} |
331 |
|
|
332 |
void interpolate8x8_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
void interpolate8x8_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding) |
333 |
{ |
{ |
334 |
int32_t i; |
int32_t i; |
335 |
uint8_t round_add = 16 - rounding; |
uint8_t round_add = 16 - rounding; |
336 |
|
|
337 |
for(i = 0; i < 8; i++) |
for(i = 0; i < 9; i++) |
338 |
{ |
{ |
339 |
int32_t src0 = src[0]; |
int32_t src0 = src[0]; |
340 |
int32_t src1 = src[stride]; |
int32_t src1 = src[stride]; |
360 |
} |
} |
361 |
} |
} |
362 |
|
|
363 |
|
void interpolate16x16_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding) |
364 |
|
{ |
365 |
|
int32_t i; |
366 |
|
uint8_t round_add = 16 - rounding; |
367 |
|
uint8_t *h_ptr = dst2; |
368 |
|
|
369 |
|
for(i = 0; i < 17; i++) |
370 |
|
{ |
371 |
|
|
372 |
|
h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); |
373 |
|
h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255); |
374 |
|
h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255); |
375 |
|
|
376 |
|
h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255); |
377 |
|
h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255); |
378 |
|
h_ptr[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255); |
379 |
|
h_ptr[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255); |
380 |
|
h_ptr[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255); |
381 |
|
h_ptr[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255); |
382 |
|
h_ptr[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255); |
383 |
|
h_ptr[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255); |
384 |
|
h_ptr[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255); |
385 |
|
h_ptr[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255); |
386 |
|
|
387 |
|
h_ptr[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255); |
388 |
|
h_ptr[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255); |
389 |
|
h_ptr[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255); |
390 |
|
|
391 |
|
h_ptr += stride; |
392 |
|
src += stride; |
393 |
|
} |
394 |
|
|
395 |
|
interpolate16x16_lowpass_v_c(dst1, dst2, stride, rounding); |
396 |
|
|
397 |
|
} |
398 |
|
|
399 |
void interpolate8x8_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding) |
void interpolate8x8_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding) |
400 |
{ |
{ |
401 |
int32_t i; |
int32_t i; |