| Index: source/libvpx/vp9/common/vp9_filter.c
|
| ===================================================================
|
| --- source/libvpx/vp9/common/vp9_filter.c (revision 177019)
|
| +++ source/libvpx/vp9/common/vp9_filter.c (working copy)
|
| @@ -13,8 +13,9 @@
|
| #include "vp9/common/vp9_filter.h"
|
| #include "vpx_ports/mem.h"
|
| #include "vp9_rtcd.h"
|
| +#include "vp9/common/vp9_common.h"
|
|
|
| -DECLARE_ALIGNED(16, const short, vp9_bilinear_filters[SUBPEL_SHIFTS][2]) = {
|
| +DECLARE_ALIGNED(16, const int16_t, vp9_bilinear_filters[SUBPEL_SHIFTS][2]) = {
|
| { 128, 0 },
|
| { 120, 8 },
|
| { 112, 16 },
|
| @@ -35,7 +36,7 @@
|
|
|
| #define FILTER_ALPHA 0
|
| #define FILTER_ALPHA_SHARP 1
|
| -DECLARE_ALIGNED(16, const short, vp9_sub_pel_filters_8[SUBPEL_SHIFTS][8]) = {
|
| +DECLARE_ALIGNED(16, const int16_t, vp9_sub_pel_filters_8[SUBPEL_SHIFTS][8]) = {
|
| #if FILTER_ALPHA == 0
|
| /* Lagrangian interpolation filter */
|
| { 0, 0, 0, 128, 0, 0, 0, 0},
|
| @@ -81,7 +82,7 @@
|
| #endif /* FILTER_ALPHA */
|
| };
|
|
|
| -DECLARE_ALIGNED(16, const short, vp9_sub_pel_filters_8s[SUBPEL_SHIFTS][8]) = {
|
| +DECLARE_ALIGNED(16, const int16_t, vp9_sub_pel_filters_8s[SUBPEL_SHIFTS][8]) = {
|
| #if FILTER_ALPHA_SHARP == 1
|
| /* dct based filter */
|
| {0, 0, 0, 128, 0, 0, 0, 0},
|
| @@ -121,7 +122,29 @@
|
| #endif /* FILTER_ALPHA_SHARP */
|
| };
|
|
|
| -DECLARE_ALIGNED(16, const short, vp9_sub_pel_filters_6[SUBPEL_SHIFTS][6]) = {
|
| +DECLARE_ALIGNED(16, const int16_t,
|
| + vp9_sub_pel_filters_8lp[SUBPEL_SHIFTS][8]) = {
|
| + /* 8-tap lowpass filter */
|
| + /* Hamming window */
|
| + {-1, -7, 32, 80, 32, -7, -1, 0},
|
| + {-1, -8, 28, 80, 37, -7, -2, 1},
|
| + { 0, -8, 24, 79, 41, -7, -2, 1},
|
| + { 0, -8, 20, 78, 45, -5, -3, 1},
|
| + { 0, -8, 16, 76, 50, -4, -3, 1},
|
| + { 0, -7, 13, 74, 54, -3, -4, 1},
|
| + { 1, -7, 9, 71, 58, -1, -4, 1},
|
| + { 1, -6, 6, 68, 62, 1, -5, 1},
|
| + { 1, -6, 4, 65, 65, 4, -6, 1},
|
| + { 1, -5, 1, 62, 68, 6, -6, 1},
|
| + { 1, -4, -1, 58, 71, 9, -7, 1},
|
| + { 1, -4, -3, 54, 74, 13, -7, 0},
|
| + { 1, -3, -4, 50, 76, 16, -8, 0},
|
| + { 1, -3, -5, 45, 78, 20, -8, 0},
|
| + { 1, -2, -7, 41, 79, 24, -8, 0},
|
| + { 1, -2, -7, 37, 80, 28, -8, -1}
|
| +};
|
| +
|
| +DECLARE_ALIGNED(16, const int16_t, vp9_sub_pel_filters_6[SUBPEL_SHIFTS][6]) = {
|
| {0, 0, 128, 0, 0, 0},
|
| {1, -5, 125, 8, -2, 1},
|
| {1, -8, 122, 17, -5, 1},
|
| @@ -140,19 +163,19 @@
|
| {1, -2, 8, 125, -5, 1}
|
| };
|
|
|
| -static void filter_block2d_first_pass_6(unsigned char *src_ptr,
|
| +static void filter_block2d_first_pass_6(uint8_t *src_ptr,
|
| int *output_ptr,
|
| unsigned int src_pixels_per_line,
|
| unsigned int pixel_step,
|
| unsigned int output_height,
|
| unsigned int output_width,
|
| - const short *vp9_filter) {
|
| + const int16_t *vp9_filter) {
|
| unsigned int i, j;
|
| - int Temp;
|
| + int temp;
|
|
|
| for (i = 0; i < output_height; i++) {
|
| for (j = 0; j < output_width; j++) {
|
| - Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp9_filter[0]) +
|
| + temp = ((int)src_ptr[-2 * (int)pixel_step] * vp9_filter[0]) +
|
| ((int)src_ptr[-1 * (int)pixel_step] * vp9_filter[1]) +
|
| ((int)src_ptr[0] * vp9_filter[2]) +
|
| ((int)src_ptr[pixel_step] * vp9_filter[3]) +
|
| @@ -161,14 +184,7 @@
|
| (VP9_FILTER_WEIGHT >> 1); /* Rounding */
|
|
|
| /* Normalize back to 0-255 */
|
| - Temp = Temp >> VP9_FILTER_SHIFT;
|
| -
|
| - if (Temp < 0)
|
| - Temp = 0;
|
| - else if (Temp > 255)
|
| - Temp = 255;
|
| -
|
| - output_ptr[j] = Temp;
|
| + output_ptr[j] = clip_pixel(temp >> VP9_FILTER_SHIFT);
|
| src_ptr++;
|
| }
|
|
|
| @@ -179,20 +195,20 @@
|
| }
|
|
|
| static void filter_block2d_second_pass_6(int *src_ptr,
|
| - unsigned char *output_ptr,
|
| + uint8_t *output_ptr,
|
| int output_pitch,
|
| unsigned int src_pixels_per_line,
|
| unsigned int pixel_step,
|
| unsigned int output_height,
|
| unsigned int output_width,
|
| - const short *vp9_filter) {
|
| + const int16_t *vp9_filter) {
|
| unsigned int i, j;
|
| - int Temp;
|
| + int temp;
|
|
|
| for (i = 0; i < output_height; i++) {
|
| for (j = 0; j < output_width; j++) {
|
| /* Apply filter */
|
| - Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp9_filter[0]) +
|
| + temp = ((int)src_ptr[-2 * (int)pixel_step] * vp9_filter[0]) +
|
| ((int)src_ptr[-1 * (int)pixel_step] * vp9_filter[1]) +
|
| ((int)src_ptr[0] * vp9_filter[2]) +
|
| ((int)src_ptr[pixel_step] * vp9_filter[3]) +
|
| @@ -201,14 +217,7 @@
|
| (VP9_FILTER_WEIGHT >> 1); /* Rounding */
|
|
|
| /* Normalize back to 0-255 */
|
| - Temp = Temp >> VP9_FILTER_SHIFT;
|
| -
|
| - if (Temp < 0)
|
| - Temp = 0;
|
| - else if (Temp > 255)
|
| - Temp = 255;
|
| -
|
| - output_ptr[j] = (unsigned char)Temp;
|
| + output_ptr[j] = clip_pixel(temp >> VP9_FILTER_SHIFT);
|
| src_ptr++;
|
| }
|
|
|
| @@ -227,20 +236,20 @@
|
| * ((filter_result + dest + 1) >> 1) and stores that in the output.
|
| */
|
| static void filter_block2d_second_pass_avg_6(int *src_ptr,
|
| - unsigned char *output_ptr,
|
| + uint8_t *output_ptr,
|
| int output_pitch,
|
| unsigned int src_pixels_per_line,
|
| unsigned int pixel_step,
|
| unsigned int output_height,
|
| unsigned int output_width,
|
| - const short *vp9_filter) {
|
| + const int16_t *vp9_filter) {
|
| unsigned int i, j;
|
| - int Temp;
|
| + int temp;
|
|
|
| for (i = 0; i < output_height; i++) {
|
| for (j = 0; j < output_width; j++) {
|
| /* Apply filter */
|
| - Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp9_filter[0]) +
|
| + temp = ((int)src_ptr[-2 * (int)pixel_step] * vp9_filter[0]) +
|
| ((int)src_ptr[-1 * (int)pixel_step] * vp9_filter[1]) +
|
| ((int)src_ptr[0] * vp9_filter[2]) +
|
| ((int)src_ptr[pixel_step] * vp9_filter[3]) +
|
| @@ -249,14 +258,8 @@
|
| (VP9_FILTER_WEIGHT >> 1); /* Rounding */
|
|
|
| /* Normalize back to 0-255 */
|
| - Temp = Temp >> VP9_FILTER_SHIFT;
|
| -
|
| - if (Temp < 0)
|
| - Temp = 0;
|
| - else if (Temp > 255)
|
| - Temp = 255;
|
| -
|
| - output_ptr[j] = (unsigned char)((output_ptr[j] + Temp + 1) >> 1);
|
| + output_ptr[j] = (clip_pixel(temp >> VP9_FILTER_SHIFT) +
|
| + output_ptr[j] + 1) >> 1;
|
| src_ptr++;
|
| }
|
|
|
| @@ -267,36 +270,39 @@
|
| }
|
|
|
| #define Interp_Extend 3
|
| -static void filter_block2d_6(unsigned char *src_ptr,
|
| - unsigned char *output_ptr,
|
| +static void filter_block2d_6(uint8_t *src_ptr,
|
| + uint8_t *output_ptr,
|
| unsigned int src_pixels_per_line,
|
| int output_pitch,
|
| - const short *HFilter,
|
| - const short *VFilter) {
|
| - int FData[(3 + Interp_Extend * 2) * 4]; /* Temp data buffer used in filtering */
|
| + const int16_t *HFilter,
|
| + const int16_t *VFilter) {
|
| + int FData[(3 + Interp_Extend * 2) * 4]; /* Temp data buffer */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData, src_pixels_per_line, 1,
|
| - 3 + Interp_Extend * 2, 4, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 3 + Interp_Extend * 2, 4, HFilter);
|
|
|
| - /* then filter verticaly... */
|
| - filter_block2d_second_pass_6(FData + 4 * (Interp_Extend - 1), output_ptr, output_pitch, 4, 4, 4, 4, VFilter);
|
| + /* then filter vertically... */
|
| + filter_block2d_second_pass_6(FData + 4 * (Interp_Extend - 1), output_ptr,
|
| + output_pitch, 4, 4, 4, 4, VFilter);
|
| }
|
|
|
|
|
| -void vp9_sixtap_predict_c(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;
|
| +void vp9_sixtap_predict4x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| - filter_block2d_6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter);
|
| + filter_block2d_6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter,
|
| + VFilter);
|
| }
|
|
|
| /*
|
| @@ -306,173 +312,154 @@
|
| * then averages that with the content already present in the output
|
| * ((filter_result + dest + 1) >> 1) and stores that in the output.
|
| */
|
| -static void filter_block2d_avg_6(unsigned char *src_ptr,
|
| - unsigned char *output_ptr,
|
| +static void filter_block2d_avg_6(uint8_t *src_ptr,
|
| + uint8_t *output_ptr,
|
| unsigned int src_pixels_per_line,
|
| int output_pitch,
|
| - const short *HFilter,
|
| - const short *VFilter) {
|
| - int FData[(3 + Interp_Extend * 2) * 4]; /* Temp data buffer used in filtering */
|
| + const int16_t *HFilter,
|
| + const int16_t *VFilter) {
|
| + int FData[(3 + Interp_Extend * 2) * 4]; /* Temp data buffer */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line),
|
| - FData, src_pixels_per_line, 1,
|
| - 3 + Interp_Extend * 2, 4, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 3 + Interp_Extend * 2, 4, HFilter);
|
|
|
| - /* then filter verticaly... */
|
| + /* then filter vertically... */
|
| filter_block2d_second_pass_avg_6(FData + 4 * (Interp_Extend - 1), output_ptr,
|
| output_pitch, 4, 4, 4, 4, VFilter);
|
| }
|
|
|
| -void vp9_sixtap_predict_avg_c
|
| -(
|
| - 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;
|
| +void vp9_sixtap_predict_avg4x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| - filter_block2d_avg_6(src_ptr, dst_ptr, src_pixels_per_line,
|
| - dst_pitch, HFilter, VFilter);
|
| + filter_block2d_avg_6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch,
|
| + HFilter, VFilter);
|
| }
|
|
|
| -void vp9_sixtap_predict8x8_c
|
| -(
|
| - 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;
|
| - // int FData[(7+Interp_Extend*2)*16]; /* Temp data buffer used in filtering */
|
| - int FData[(7 + Interp_Extend * 2) * 8]; /* Temp data buffer used in filtering */
|
| +void vp9_sixtap_predict8x8_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
| + int FData[(7 + Interp_Extend * 2) * 8]; /* Temp data buffer */
|
|
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData, src_pixels_per_line, 1,
|
| - 7 + Interp_Extend * 2, 8, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 7 + Interp_Extend * 2, 8, HFilter);
|
|
|
| + /* then filter vertically... */
|
| + filter_block2d_second_pass_6(FData + 8 * (Interp_Extend - 1), dst_ptr,
|
| + dst_pitch, 8, 8, 8, 8, VFilter);
|
|
|
| - /* then filter verticaly... */
|
| - filter_block2d_second_pass_6(FData + 8 * (Interp_Extend - 1), dst_ptr, dst_pitch, 8, 8, 8, 8, VFilter);
|
| -
|
| }
|
|
|
| -void vp9_sixtap_predict_avg8x8_c
|
| -(
|
| - 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;
|
| - // int FData[(7+Interp_Extend*2)*16]; /* Temp data buffer used in filtering */
|
| - int FData[(7 + Interp_Extend * 2) * 8]; /* Temp data buffer used in filtering */
|
| +void vp9_sixtap_predict_avg8x8_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
| + int FData[(7 + Interp_Extend * 2) * 8]; /* Temp data buffer */
|
|
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData, src_pixels_per_line, 1,
|
| - 7 + Interp_Extend * 2, 8, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 7 + Interp_Extend * 2, 8, HFilter);
|
|
|
| - /* then filter verticaly... */
|
| - filter_block2d_second_pass_avg_6(FData + 8 * (Interp_Extend - 1), dst_ptr, dst_pitch, 8, 8, 8, 8, VFilter);
|
| + /* then filter vertically... */
|
| + filter_block2d_second_pass_avg_6(FData + 8 * (Interp_Extend - 1), dst_ptr,
|
| + dst_pitch, 8, 8, 8, 8, VFilter);
|
| }
|
|
|
| -void vp9_sixtap_predict8x4_c
|
| -(
|
| - 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;
|
| - // int FData[(7+Interp_Extend*2)*16]; /* Temp data buffer used in filtering */
|
| - int FData[(3 + Interp_Extend * 2) * 8]; /* Temp data buffer used in filtering */
|
| +void vp9_sixtap_predict8x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
| + int FData[(3 + Interp_Extend * 2) * 8]; /* Temp data buffer */
|
|
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData, src_pixels_per_line, 1,
|
| - 3 + Interp_Extend * 2, 8, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 3 + Interp_Extend * 2, 8, HFilter);
|
|
|
| -
|
| - /* then filter verticaly... */
|
| - filter_block2d_second_pass_6(FData + 8 * (Interp_Extend - 1), dst_ptr, dst_pitch, 8, 8, 4, 8, VFilter);
|
| -
|
| + /* then filter vertically... */
|
| + filter_block2d_second_pass_6(FData + 8 * (Interp_Extend - 1), dst_ptr,
|
| + dst_pitch, 8, 8, 4, 8, VFilter);
|
| }
|
|
|
| -void vp9_sixtap_predict16x16_c
|
| -(
|
| - 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;
|
| - // int FData[(15+Interp_Extend*2)*24]; /* Temp data buffer used in filtering */
|
| - int FData[(15 + Interp_Extend * 2) * 16]; /* Temp data buffer used in filtering */
|
| +void vp9_sixtap_predict16x16_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
| + int FData[(15 + Interp_Extend * 2) * 16]; /* Temp data buffer */
|
|
|
| -
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData, src_pixels_per_line, 1,
|
| - 15 + Interp_Extend * 2, 16, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 15 + Interp_Extend * 2, 16, HFilter);
|
|
|
| - /* then filter verticaly... */
|
| - filter_block2d_second_pass_6(FData + 16 * (Interp_Extend - 1), dst_ptr, dst_pitch, 16, 16, 16, 16, VFilter);
|
| -
|
| + /* then filter vertically... */
|
| + filter_block2d_second_pass_6(FData + 16 * (Interp_Extend - 1), dst_ptr,
|
| + dst_pitch, 16, 16, 16, 16, VFilter);
|
| }
|
|
|
| -void vp9_sixtap_predict_avg16x16_c
|
| -(
|
| - 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;
|
| - // int FData[(15+Interp_Extend*2)*24]; /* Temp data buffer used in filtering */
|
| - int FData[(15 + Interp_Extend * 2) * 16]; /* Temp data buffer used in filtering */
|
| +void vp9_sixtap_predict_avg16x16_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
| + int FData[(15 + Interp_Extend * 2) * 16]; /* Temp data buffer */
|
|
|
| HFilter = vp9_sub_pel_filters_6[xoffset]; /* 6 tap */
|
| VFilter = vp9_sub_pel_filters_6[yoffset]; /* 6 tap */
|
|
|
| /* First filter 1-D horizontally... */
|
| - filter_block2d_first_pass_6(src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| - src_pixels_per_line, 1, 15 + Interp_Extend * 2, 16, HFilter);
|
| + filter_block2d_first_pass_6(
|
| + src_ptr - ((Interp_Extend - 1) * src_pixels_per_line), FData,
|
| + src_pixels_per_line, 1, 15 + Interp_Extend * 2, 16, HFilter);
|
|
|
| - /* then filter verticaly... */
|
| - filter_block2d_second_pass_avg_6(FData + 16 * (Interp_Extend - 1), dst_ptr, dst_pitch,
|
| - 16, 16, 16, 16, VFilter);
|
| + /* then filter vertically... */
|
| + filter_block2d_second_pass_avg_6(FData + 16 * (Interp_Extend - 1), dst_ptr,
|
| + dst_pitch, 16, 16, 16, 16, VFilter);
|
| }
|
|
|
| typedef enum {
|
| @@ -489,16 +476,13 @@
|
| {16,16},
|
| };
|
|
|
| -static const unsigned int filter_max_height = 16;
|
| -static const unsigned int filter_max_width = 16;
|
| -
|
| -static void filter_block2d_8_c(const unsigned char *src_ptr,
|
| - const unsigned int src_stride,
|
| - const short *HFilter,
|
| - const short *VFilter,
|
| +static void filter_block2d_8_c(const uint8_t *src_ptr,
|
| + const unsigned int src_stride,
|
| + const int16_t *HFilter,
|
| + const int16_t *VFilter,
|
| const filter_size_t filter_size,
|
| - unsigned char *dst_ptr,
|
| - unsigned int dst_stride) {
|
| + uint8_t *dst_ptr,
|
| + unsigned int dst_stride) {
|
| const unsigned int output_width = filter_size_to_wh[filter_size][0];
|
| const unsigned int output_height = filter_size_to_wh[filter_size][1];
|
|
|
| @@ -509,19 +493,20 @@
|
| const int kInterp_Extend = 4;
|
| const unsigned int intermediate_height =
|
| (kInterp_Extend - 1) + output_height + kInterp_Extend;
|
| - const unsigned int max_intermediate_height =
|
| - (kInterp_Extend - 1) + filter_max_height + kInterp_Extend;
|
| -#ifdef _MSC_VER
|
| - // MSVC does not support C99 style declaration
|
| - unsigned char intermediate_buffer[23 * 16];
|
| -#else
|
| - unsigned char intermediate_buffer[max_intermediate_height * filter_max_width];
|
| -#endif
|
| +
|
| + /* Size of intermediate_buffer is max_intermediate_height * filter_max_width,
|
| + * where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
|
| + * + kInterp_Extend
|
| + * = 3 + 16 + 4
|
| + * = 23
|
| + * and filter_max_width = 16
|
| + */
|
| + uint8_t intermediate_buffer[23 * 16];
|
| const int intermediate_next_stride = 1 - intermediate_height * output_width;
|
|
|
| // Horizontal pass (src -> transposed intermediate).
|
| {
|
| - unsigned char *output_ptr = intermediate_buffer;
|
| + uint8_t *output_ptr = intermediate_buffer;
|
| const int src_next_row_stride = src_stride - output_width;
|
| unsigned int i, j;
|
| src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
|
| @@ -539,14 +524,8 @@
|
| (VP9_FILTER_WEIGHT >> 1); // Rounding
|
|
|
| // Normalize back to 0-255...
|
| - temp >>= VP9_FILTER_SHIFT;
|
| - if (temp < 0) {
|
| - temp = 0;
|
| - } else if (temp > 255) {
|
| - temp = 255;
|
| - }
|
| + *output_ptr = clip_pixel(temp >> VP9_FILTER_SHIFT);
|
| src_ptr++;
|
| - *output_ptr = temp;
|
| output_ptr += intermediate_height;
|
| }
|
| src_ptr += src_next_row_stride;
|
| @@ -556,7 +535,7 @@
|
|
|
| // Vertical pass (transposed intermediate -> dst).
|
| {
|
| - unsigned char *src_ptr = intermediate_buffer;
|
| + uint8_t *src_ptr = intermediate_buffer;
|
| const int dst_next_row_stride = dst_stride - output_width;
|
| unsigned int i, j;
|
| for (i = 0; i < output_height; i++) {
|
| @@ -573,15 +552,8 @@
|
| (VP9_FILTER_WEIGHT >> 1); // Rounding
|
|
|
| // Normalize back to 0-255...
|
| - temp >>= VP9_FILTER_SHIFT;
|
| - if (temp < 0) {
|
| - temp = 0;
|
| - } else if (temp > 255) {
|
| - temp = 255;
|
| - }
|
| -
|
| + *dst_ptr++ = clip_pixel(temp >> VP9_FILTER_SHIFT);
|
| src_ptr += intermediate_height;
|
| - *dst_ptr++ = (unsigned char)temp;
|
| }
|
| src_ptr += intermediate_next_stride;
|
| dst_ptr += dst_next_row_stride;
|
| @@ -589,53 +561,49 @@
|
| }
|
| }
|
|
|
| -void vp9_filter_block2d_4x4_8_c(const unsigned char *src_ptr,
|
| +void vp9_filter_block2d_4x4_8_c(const uint8_t *src_ptr,
|
| const unsigned int src_stride,
|
| - const short *HFilter_aligned16,
|
| - const short *VFilter_aligned16,
|
| - unsigned char *dst_ptr,
|
| + const int16_t *HFilter_aligned16,
|
| + const int16_t *VFilter_aligned16,
|
| + uint8_t *dst_ptr,
|
| unsigned int dst_stride) {
|
| - filter_block2d_8_c(src_ptr, src_stride,
|
| - HFilter_aligned16, VFilter_aligned16,
|
| + filter_block2d_8_c(src_ptr, src_stride, HFilter_aligned16, VFilter_aligned16,
|
| VPX_FILTER_4x4, dst_ptr, dst_stride);
|
| }
|
|
|
| -void vp9_filter_block2d_8x4_8_c(const unsigned char *src_ptr,
|
| +void vp9_filter_block2d_8x4_8_c(const uint8_t *src_ptr,
|
| const unsigned int src_stride,
|
| - const short *HFilter_aligned16,
|
| - const short *VFilter_aligned16,
|
| - unsigned char *dst_ptr,
|
| + const int16_t *HFilter_aligned16,
|
| + const int16_t *VFilter_aligned16,
|
| + uint8_t *dst_ptr,
|
| unsigned int dst_stride) {
|
| - filter_block2d_8_c(src_ptr, src_stride,
|
| - HFilter_aligned16, VFilter_aligned16,
|
| + filter_block2d_8_c(src_ptr, src_stride, HFilter_aligned16, VFilter_aligned16,
|
| VPX_FILTER_8x4, dst_ptr, dst_stride);
|
| }
|
|
|
| -void vp9_filter_block2d_8x8_8_c(const unsigned char *src_ptr,
|
| +void vp9_filter_block2d_8x8_8_c(const uint8_t *src_ptr,
|
| const unsigned int src_stride,
|
| - const short *HFilter_aligned16,
|
| - const short *VFilter_aligned16,
|
| - unsigned char *dst_ptr,
|
| + const int16_t *HFilter_aligned16,
|
| + const int16_t *VFilter_aligned16,
|
| + uint8_t *dst_ptr,
|
| unsigned int dst_stride) {
|
| - filter_block2d_8_c(src_ptr, src_stride,
|
| - HFilter_aligned16, VFilter_aligned16,
|
| + filter_block2d_8_c(src_ptr, src_stride, HFilter_aligned16, VFilter_aligned16,
|
| VPX_FILTER_8x8, dst_ptr, dst_stride);
|
| }
|
|
|
| -void vp9_filter_block2d_16x16_8_c(const unsigned char *src_ptr,
|
| +void vp9_filter_block2d_16x16_8_c(const uint8_t *src_ptr,
|
| const unsigned int src_stride,
|
| - const short *HFilter_aligned16,
|
| - const short *VFilter_aligned16,
|
| - unsigned char *dst_ptr,
|
| + const int16_t *HFilter_aligned16,
|
| + const int16_t *VFilter_aligned16,
|
| + uint8_t *dst_ptr,
|
| unsigned int dst_stride) {
|
| - filter_block2d_8_c(src_ptr, src_stride,
|
| - HFilter_aligned16, VFilter_aligned16,
|
| + filter_block2d_8_c(src_ptr, src_stride, HFilter_aligned16, VFilter_aligned16,
|
| VPX_FILTER_16x16, dst_ptr, dst_stride);
|
| }
|
|
|
| -static void block2d_average_c(unsigned char *src,
|
| - unsigned int src_stride,
|
| - unsigned char *output_ptr,
|
| +static void block2d_average_c(uint8_t *src,
|
| + unsigned int src_stride,
|
| + uint8_t *output_ptr,
|
| unsigned int output_stride,
|
| const filter_size_t filter_size) {
|
| const unsigned int output_width = filter_size_to_wh[filter_size][0];
|
| @@ -652,231 +620,319 @@
|
|
|
| #define block2d_average block2d_average_c
|
|
|
| -void vp9_eighttap_predict_c(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;
|
| +void vp9_eighttap_predict4x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_sub_pel_filters_8[xoffset];
|
| VFilter = vp9_sub_pel_filters_8[yoffset];
|
|
|
| - vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| + vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict_avg4x4_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| +void vp9_eighttap_predict_avg4x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| - unsigned char tmp[4 * 4];
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| + uint8_t tmp[4 * 4];
|
|
|
| - vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - tmp, 4);
|
| + vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter, tmp,
|
| + 4);
|
| block2d_average(tmp, 4, dst_ptr, dst_pitch, VPX_FILTER_4x4);
|
| }
|
|
|
| -void vp9_eighttap_predict_sharp_c(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;
|
| +void vp9_eighttap_predict4x4_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| VFilter = vp9_sub_pel_filters_8s[yoffset];
|
|
|
| + vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + dst_ptr, dst_pitch);
|
| +}
|
| +
|
| +void vp9_eighttap_predict4x4_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
| +
|
| + HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
| +
|
| vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line,
|
| HFilter, VFilter,
|
| dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict_avg4x4_sharp_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| +void vp9_eighttap_predict_avg4x4_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| - unsigned char tmp[4 * 4];
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| + uint8_t tmp[4 * 4];
|
|
|
| - vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - tmp, 4);
|
| + vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter, tmp,
|
| + 4);
|
| block2d_average(tmp, 4, dst_ptr, dst_pitch, VPX_FILTER_4x4);
|
| }
|
|
|
| -void vp9_eighttap_predict8x8_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +void vp9_eighttap_predict_avg4x4_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
| + uint8_t tmp[4 * 4];
|
|
|
| - vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| + vp9_filter_block2d_4x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter, tmp,
|
| + 4);
|
| + block2d_average(tmp, 4, dst_ptr, dst_pitch, VPX_FILTER_4x4);
|
| +}
|
| +
|
| +
|
| +void vp9_eighttap_predict8x8_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +
|
| + vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict8x8_sharp_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| +void vp9_eighttap_predict8x8_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
|
|
| - vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| + vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict_avg8x8_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - unsigned char tmp[8 * 8];
|
| - const short *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +void vp9_eighttap_predict8x8_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
|
|
| - vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - tmp, 8);
|
| + vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + dst_ptr, dst_pitch);
|
| +}
|
| +
|
| +void vp9_eighttap_predict_avg8x8_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + uint8_t tmp[8 * 8];
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +
|
| + vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line, HFilter, VFilter, tmp,
|
| + 8);
|
| block2d_average(tmp, 8, dst_ptr, dst_pitch, VPX_FILTER_8x8);
|
| }
|
|
|
| -void vp9_eighttap_predict_avg8x8_sharp_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - unsigned char tmp[8 * 8];
|
| - const short *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| +void vp9_eighttap_predict_avg8x8_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + uint8_t tmp[8 * 8];
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
|
|
| - vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - tmp, 8);
|
| + vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line, HFilter, VFilter, tmp,
|
| + 8);
|
| block2d_average(tmp, 8, dst_ptr, dst_pitch, VPX_FILTER_8x8);
|
| }
|
|
|
| -void vp9_eighttap_predict8x4_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +void vp9_eighttap_predict_avg8x8_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + uint8_t tmp[8 * 8];
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
|
|
| - vp9_filter_block2d_8x4_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| + vp9_filter_block2d_8x8_8(src_ptr, src_pixels_per_line, HFilter, VFilter, tmp,
|
| + 8);
|
| + block2d_average(tmp, 8, dst_ptr, dst_pitch, VPX_FILTER_8x8);
|
| +}
|
| +
|
| +void vp9_eighttap_predict8x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +
|
| + vp9_filter_block2d_8x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict8x4_sharp_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| +void vp9_eighttap_predict8x4_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
|
|
| - vp9_filter_block2d_8x4_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| + vp9_filter_block2d_8x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict16x16_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +void vp9_eighttap_predict8x4_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
|
|
| - vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - dst_ptr, dst_pitch);
|
| + vp9_filter_block2d_8x4_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict16x16_sharp_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - const short *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| +void vp9_eighttap_predict16x16_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8[yoffset];
|
|
|
| - vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - dst_ptr, dst_pitch);
|
| + vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + dst_ptr, dst_pitch);
|
| }
|
|
|
| -void vp9_eighttap_predict_avg16x16_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - DECLARE_ALIGNED_ARRAY(16, unsigned char, tmp, 16 * 16);
|
| - const short *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +void vp9_eighttap_predict16x16_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
|
|
| - vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - tmp, 16);
|
| + vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + dst_ptr, dst_pitch);
|
| +}
|
| +
|
| +void vp9_eighttap_predict16x16_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
| +
|
| + vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + dst_ptr, dst_pitch);
|
| +}
|
| +
|
| +void vp9_eighttap_predict_avg16x16_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + DECLARE_ALIGNED_ARRAY(16, uint8_t, tmp, 16 * 16);
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8[yoffset];
|
| +
|
| + vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + tmp, 16);
|
| block2d_average(tmp, 16, dst_ptr, dst_pitch, VPX_FILTER_16x16);
|
| }
|
|
|
| -void vp9_eighttap_predict_avg16x16_sharp_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch) {
|
| - DECLARE_ALIGNED_ARRAY(16, unsigned char, tmp, 16 * 16);
|
| - const short *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| - const short *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
| +void vp9_eighttap_predict_avg16x16_sharp_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + DECLARE_ALIGNED_ARRAY(16, uint8_t, tmp, 16 * 16);
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8s[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8s[yoffset];
|
|
|
| - vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line,
|
| - HFilter, VFilter,
|
| - tmp, 16);
|
| + vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + tmp, 16);
|
| block2d_average(tmp, 16, dst_ptr, dst_pitch, VPX_FILTER_16x16);
|
| }
|
|
|
| +void vp9_eighttap_predict_avg16x16_smooth_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + DECLARE_ALIGNED_ARRAY(16, uint8_t, tmp, 16 * 16);
|
| + const int16_t *HFilter = vp9_sub_pel_filters_8lp[xoffset];
|
| + const int16_t *VFilter = vp9_sub_pel_filters_8lp[yoffset];
|
| +
|
| + vp9_filter_block2d_16x16_8(src_ptr, src_pixels_per_line, HFilter, VFilter,
|
| + tmp, 16);
|
| + block2d_average(tmp, 16, dst_ptr, dst_pitch, VPX_FILTER_16x16);
|
| +}
|
| +
|
| /****************************************************************************
|
| *
|
| * ROUTINE : filter_block2d_bil_first_pass
|
| *
|
| - * INPUTS : UINT8 *src_ptr : Pointer to source block.
|
| - * UINT32 src_stride : Stride of source block.
|
| - * UINT32 height : Block height.
|
| - * UINT32 width : Block width.
|
| - * INT32 *vp9_filter : Array of 2 bi-linear filter taps.
|
| + * INPUTS : uint8_t *src_ptr : Pointer to source block.
|
| + * uint32_t src_stride : Stride of source block.
|
| + * uint32_t height : Block height.
|
| + * uint32_t width : Block width.
|
| + * int32_t *vp9_filter : Array of 2 bi-linear filter taps.
|
| *
|
| - * OUTPUTS : INT32 *dst_ptr : Pointer to filtered block.
|
| + * OUTPUTS : int32_t *dst_ptr : Pointer to filtered block.
|
| *
|
| * RETURNS : void
|
| *
|
| @@ -884,16 +940,16 @@
|
| * in the horizontal direction to produce the filtered output
|
| * block. Used to implement first-pass of 2-D separable filter.
|
| *
|
| - * SPECIAL NOTES : Produces INT32 output to retain precision for next pass.
|
| + * SPECIAL NOTES : Produces int32_t output to retain precision for next pass.
|
| * Two filter taps should sum to VP9_FILTER_WEIGHT.
|
| *
|
| ****************************************************************************/
|
| -static void filter_block2d_bil_first_pass(unsigned char *src_ptr,
|
| - unsigned short *dst_ptr,
|
| - unsigned int src_stride,
|
| - unsigned int height,
|
| - unsigned int width,
|
| - const short *vp9_filter) {
|
| +static void filter_block2d_bil_first_pass(uint8_t *src_ptr,
|
| + uint16_t *dst_ptr,
|
| + unsigned int src_stride,
|
| + unsigned int height,
|
| + unsigned int width,
|
| + const int16_t *vp9_filter) {
|
| unsigned int i, j;
|
|
|
| for (i = 0; i < height; i++) {
|
| @@ -915,13 +971,13 @@
|
| *
|
| * ROUTINE : filter_block2d_bil_second_pass
|
| *
|
| - * INPUTS : INT32 *src_ptr : Pointer to source block.
|
| - * UINT32 dst_pitch : Destination block pitch.
|
| - * UINT32 height : Block height.
|
| - * UINT32 width : Block width.
|
| - * INT32 *vp9_filter : Array of 2 bi-linear filter taps.
|
| + * INPUTS : int32_t *src_ptr : Pointer to source block.
|
| + * uint32_t dst_pitch : Destination block pitch.
|
| + * uint32_t height : Block height.
|
| + * uint32_t width : Block width.
|
| + * int32_t *vp9_filter : Array of 2 bi-linear filter taps.
|
| *
|
| - * OUTPUTS : UINT16 *dst_ptr : Pointer to filtered block.
|
| + * OUTPUTS : uint16_t *dst_ptr : Pointer to filtered block.
|
| *
|
| * RETURNS : void
|
| *
|
| @@ -933,22 +989,22 @@
|
| * Two filter taps should sum to VP9_FILTER_WEIGHT.
|
| *
|
| ****************************************************************************/
|
| -static void filter_block2d_bil_second_pass(unsigned short *src_ptr,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch,
|
| - unsigned int height,
|
| - unsigned int width,
|
| - const short *vp9_filter) {
|
| - unsigned int i, j;
|
| - int Temp;
|
| +static void filter_block2d_bil_second_pass(uint16_t *src_ptr,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch,
|
| + unsigned int height,
|
| + unsigned int width,
|
| + const int16_t *vp9_filter) {
|
| + unsigned int i, j;
|
| + int temp;
|
|
|
| for (i = 0; i < height; i++) {
|
| for (j = 0; j < width; j++) {
|
| /* Apply filter */
|
| - Temp = ((int)src_ptr[0] * vp9_filter[0]) +
|
| + temp = ((int)src_ptr[0] * vp9_filter[0]) +
|
| ((int)src_ptr[width] * vp9_filter[1]) +
|
| (VP9_FILTER_WEIGHT / 2);
|
| - dst_ptr[j] = (unsigned int)(Temp >> VP9_FILTER_SHIFT);
|
| + dst_ptr[j] = (unsigned int)(temp >> VP9_FILTER_SHIFT);
|
| src_ptr++;
|
| }
|
|
|
| @@ -966,22 +1022,22 @@
|
| * with the values already present in the output and stores the result of
|
| * that back into the output ((filter_result + dest + 1) >> 1).
|
| */
|
| -static void filter_block2d_bil_second_pass_avg(unsigned short *src_ptr,
|
| - unsigned char *dst_ptr,
|
| - int dst_pitch,
|
| - unsigned int height,
|
| - unsigned int width,
|
| - const short *vp9_filter) {
|
| - unsigned int i, j;
|
| - int Temp;
|
| +static void filter_block2d_bil_second_pass_avg(uint16_t *src_ptr,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch,
|
| + unsigned int height,
|
| + unsigned int width,
|
| + const int16_t *vp9_filter) {
|
| + unsigned int i, j;
|
| + int temp;
|
|
|
| for (i = 0; i < height; i++) {
|
| for (j = 0; j < width; j++) {
|
| /* Apply filter */
|
| - Temp = ((int)src_ptr[0] * vp9_filter[0]) +
|
| - ((int)src_ptr[width] * vp9_filter[1]) +
|
| - (VP9_FILTER_WEIGHT / 2);
|
| - dst_ptr[j] = (unsigned int)(((Temp >> VP9_FILTER_SHIFT) + dst_ptr[j] + 1) >> 1);
|
| + temp = (((int)src_ptr[0] * vp9_filter[0]) +
|
| + ((int)src_ptr[width] * vp9_filter[1]) +
|
| + (VP9_FILTER_WEIGHT / 2)) >> VP9_FILTER_SHIFT;
|
| + dst_ptr[j] = (unsigned int)((temp + dst_ptr[j] + 1) >> 1);
|
| src_ptr++;
|
| }
|
|
|
| @@ -994,15 +1050,15 @@
|
| *
|
| * ROUTINE : filter_block2d_bil
|
| *
|
| - * INPUTS : UINT8 *src_ptr : Pointer to source block.
|
| - * UINT32 src_pitch : Stride of source block.
|
| - * UINT32 dst_pitch : Stride of destination block.
|
| - * INT32 *HFilter : Array of 2 horizontal filter taps.
|
| - * INT32 *VFilter : Array of 2 vertical filter taps.
|
| - * INT32 Width : Block width
|
| - * INT32 Height : Block height
|
| + * INPUTS : uint8_t *src_ptr : Pointer to source block.
|
| + * uint32_t src_pitch : Stride of source block.
|
| + * uint32_t dst_pitch : Stride of destination block.
|
| + * int32_t *HFilter : Array of 2 horizontal filter taps.
|
| + * int32_t *VFilter : Array of 2 vertical filter taps.
|
| + * int32_t Width : Block width
|
| + * int32_t Height : Block height
|
| *
|
| - * OUTPUTS : UINT16 *dst_ptr : Pointer to filtered block.
|
| + * OUTPUTS : uint16_t *dst_ptr : Pointer to filtered block.
|
| *
|
| * RETURNS : void
|
| *
|
| @@ -1013,16 +1069,16 @@
|
| * SPECIAL NOTES : The largest block size can be handled here is 16x16
|
| *
|
| ****************************************************************************/
|
| -static void filter_block2d_bil(unsigned char *src_ptr,
|
| - unsigned char *dst_ptr,
|
| - unsigned int src_pitch,
|
| - unsigned int dst_pitch,
|
| - const short *HFilter,
|
| - const short *VFilter,
|
| - int Width,
|
| - int Height) {
|
| +static void filter_block2d_bil(uint8_t *src_ptr,
|
| + uint8_t *dst_ptr,
|
| + unsigned int src_pitch,
|
| + unsigned int dst_pitch,
|
| + const int16_t *HFilter,
|
| + const int16_t *VFilter,
|
| + int Width,
|
| + int Height) {
|
|
|
| - unsigned short FData[17 * 16]; /* Temp data buffer used in filtering */
|
| + uint16_t FData[17 * 16]; /* Temp data buffer used in filtering */
|
|
|
| /* First filter 1-D horizontally... */
|
| filter_block2d_bil_first_pass(src_ptr, FData, src_pitch, Height + 1, Width, HFilter);
|
| @@ -1031,15 +1087,15 @@
|
| filter_block2d_bil_second_pass(FData, dst_ptr, dst_pitch, Height, Width, VFilter);
|
| }
|
|
|
| -static void filter_block2d_bil_avg(unsigned char *src_ptr,
|
| - unsigned char *dst_ptr,
|
| - unsigned int src_pitch,
|
| - unsigned int dst_pitch,
|
| - const short *HFilter,
|
| - const short *VFilter,
|
| - int Width,
|
| - int Height) {
|
| - unsigned short FData[17 * 16]; /* Temp data buffer used in filtering */
|
| +static void filter_block2d_bil_avg(uint8_t *src_ptr,
|
| + uint8_t *dst_ptr,
|
| + unsigned int src_pitch,
|
| + unsigned int dst_pitch,
|
| + const int16_t *HFilter,
|
| + const int16_t *VFilter,
|
| + int Width,
|
| + int Height) {
|
| + uint16_t FData[17 * 16]; /* Temp data buffer used in filtering */
|
|
|
| /* First filter 1-D horizontally... */
|
| filter_block2d_bil_first_pass(src_ptr, FData, src_pitch, Height + 1, Width, HFilter);
|
| @@ -1048,14 +1104,14 @@
|
| filter_block2d_bil_second_pass_avg(FData, dst_ptr, dst_pitch, Height, Width, VFilter);
|
| }
|
|
|
| -void vp9_bilinear_predict4x4_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| +void vp9_bilinear_predict4x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| int dst_pitch) {
|
| - const short *HFilter;
|
| - const short *VFilter;
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
| @@ -1063,14 +1119,14 @@
|
| filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 4, 4);
|
| }
|
|
|
| -void vp9_bilinear_predict_avg4x4_c(unsigned char *src_ptr,
|
| - int src_pixels_per_line,
|
| - int xoffset,
|
| - int yoffset,
|
| - unsigned char *dst_ptr,
|
| +void vp9_bilinear_predict_avg4x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| int dst_pitch) {
|
| - const short *HFilter;
|
| - const short *VFilter;
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
| @@ -1079,14 +1135,14 @@
|
| dst_pitch, HFilter, VFilter, 4, 4);
|
| }
|
|
|
| -void vp9_bilinear_predict8x8_c(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;
|
| +void vp9_bilinear_predict8x8_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
| @@ -1095,14 +1151,14 @@
|
|
|
| }
|
|
|
| -void vp9_bilinear_predict_avg8x8_c(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;
|
| +void vp9_bilinear_predict_avg8x8_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
| @@ -1111,14 +1167,14 @@
|
| dst_pitch, HFilter, VFilter, 8, 8);
|
| }
|
|
|
| -void vp9_bilinear_predict8x4_c(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;
|
| +void vp9_bilinear_predict8x4_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
| @@ -1127,14 +1183,14 @@
|
|
|
| }
|
|
|
| -void vp9_bilinear_predict16x16_c(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;
|
| +void vp9_bilinear_predict16x16_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
| @@ -1142,14 +1198,14 @@
|
| filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
|
| }
|
|
|
| -void vp9_bilinear_predict_avg16x16_c(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;
|
| +void vp9_bilinear_predict_avg16x16_c(uint8_t *src_ptr,
|
| + int src_pixels_per_line,
|
| + int xoffset,
|
| + int yoffset,
|
| + uint8_t *dst_ptr,
|
| + int dst_pitch) {
|
| + const int16_t *HFilter;
|
| + const int16_t *VFilter;
|
|
|
| HFilter = vp9_bilinear_filters[xoffset];
|
| VFilter = vp9_bilinear_filters[yoffset];
|
|
|