blob: 6d547d686a9d9d26a57185a1ac5c91f3ba6cb4fd [file] [log] [blame]
/*
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "vpx_config.h"
#include "vp8_rtcd.h"
#include <math.h>
#include "vp8/common/filter.h"
#include "vpx_ports/mem.h"
extern void vp8_filter_block2d_first_pass_armv6(
unsigned char *src_ptr, short *output_ptr, unsigned int src_pixels_per_line,
unsigned int output_width, unsigned int output_height,
const short *vp8_filter);
// 8x8
extern void vp8_filter_block2d_first_pass_8x8_armv6(
unsigned char *src_ptr, short *output_ptr, unsigned int src_pixels_per_line,
unsigned int output_width, unsigned int output_height,
const short *vp8_filter);
// 16x16
extern void vp8_filter_block2d_first_pass_16x16_armv6(
unsigned char *src_ptr, short *output_ptr, unsigned int src_pixels_per_line,
unsigned int output_width, unsigned int output_height,
const short *vp8_filter);
extern void vp8_filter_block2d_second_pass_armv6(short *src_ptr,
unsigned char *output_ptr,
unsigned int output_pitch,
unsigned int cnt,
const short *vp8_filter);
extern void vp8_filter4_block2d_second_pass_armv6(short *src_ptr,
unsigned char *output_ptr,
unsigned int output_pitch,
unsigned int cnt,
const short *vp8_filter);
extern void vp8_filter_block2d_first_pass_only_armv6(
unsigned char *src_ptr, unsigned char *output_ptr,
unsigned int src_pixels_per_line, unsigned int cnt,
unsigned int output_pitch, const short *vp8_filter);
extern void vp8_filter_block2d_second_pass_only_armv6(
unsigned char *src_ptr, unsigned char *output_ptr,
unsigned int src_pixels_per_line, unsigned int cnt,
unsigned int output_pitch, const short *vp8_filter);
#if HAVE_MEDIA
void vp8_sixtap_predict4x4_armv6(unsigned char *src_ptr,
int src_pixels_per_line, int xoffset,
int yoffset, unsigned char *dst_ptr,
int dst_pitch) {
const short *HFilter;
const short *VFilter;
DECLARE_ALIGNED(4, short,
FData[12 * 4]); /* Temp data buffer used in filtering */
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
/* Vfilter is null. First pass only */
if (xoffset && !yoffset) {
/*vp8_filter_block2d_first_pass_armv6 ( src_ptr, FData+2,
src_pixels_per_line, 4, 4, HFilter );
vp8_filter_block2d_second_pass_armv6 ( FData+2, dst_ptr, dst_pitch, 4,
VFilter );*/
vp8_filter_block2d_first_pass_only_armv6(
src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, HFilter);
}
/* Hfilter is null. Second pass only */
else if (!xoffset && yoffset) {
vp8_filter_block2d_second_pass_only_armv6(
src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, VFilter);
} else {
/* Vfilter is a 4 tap filter */
if (yoffset & 0x1) {
vp8_filter_block2d_first_pass_armv6(src_ptr - src_pixels_per_line,
FData + 1, src_pixels_per_line, 4, 7,
HFilter);
vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4,
VFilter);
}
/* Vfilter is 6 tap filter */
else {
vp8_filter_block2d_first_pass_armv6(src_ptr - (2 * src_pixels_per_line),
FData, src_pixels_per_line, 4, 9,
HFilter);
vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4,
VFilter);
}
}
}
void vp8_sixtap_predict8x8_armv6(unsigned char *src_ptr,
int src_pixels_per_line, int xoffset,
int yoffset, unsigned char *dst_ptr,
int dst_pitch) {
const short *HFilter;
const short *VFilter;
DECLARE_ALIGNED(4, short,
FData[16 * 8]); /* Temp data buffer used in filtering */
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
if (xoffset && !yoffset) {
vp8_filter_block2d_first_pass_only_armv6(
src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, HFilter);
}
/* Hfilter is null. Second pass only */
else if (!xoffset && yoffset) {
vp8_filter_block2d_second_pass_only_armv6(
src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, VFilter);
} else {
if (yoffset & 0x1) {
vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - src_pixels_per_line,
FData + 1, src_pixels_per_line, 8,
11, HFilter);
vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8,
VFilter);
} else {
vp8_filter_block2d_first_pass_8x8_armv6(
src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 8,
13, HFilter);
vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8,
VFilter);
}
}
}
void vp8_sixtap_predict16x16_armv6(unsigned char *src_ptr,
int src_pixels_per_line, int xoffset,
int yoffset, unsigned char *dst_ptr,
int dst_pitch) {
const short *HFilter;
const short *VFilter;
DECLARE_ALIGNED(4, short,
FData[24 * 16]); /* Temp data buffer used in filtering */
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
if (xoffset && !yoffset) {
vp8_filter_block2d_first_pass_only_armv6(
src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, HFilter);
}
/* Hfilter is null. Second pass only */
else if (!xoffset && yoffset) {
vp8_filter_block2d_second_pass_only_armv6(
src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, VFilter);
} else {
if (yoffset & 0x1) {
vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - src_pixels_per_line,
FData + 1, src_pixels_per_line,
16, 19, HFilter);
vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16,
VFilter);
} else {
vp8_filter_block2d_first_pass_16x16_armv6(
src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 16,
21, HFilter);
vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16,
VFilter);
}
}
}
#endif