From acadcec5c51d1c6ded8765f80053a2dc6c796024 Mon Sep 17 00:00:00 2001 From: Yaowu Xu <yaowu@google.com> Date: Tue, 6 Nov 2012 15:17:20 -0800 Subject: [PATCH] group refmv experiment related functions Change-Id: Iedaa108ddb65f54d768424f9c47ad4d069b656fd --- vp9/common/findnearmv.c | 71 ++++++++++++++ vp9/common/subpelvar.h | 147 ++++++++++++++++++++++++++++ vp9/encoder/variance_c.c | 202 +-------------------------------------- vp9/vp9_common.mk | 1 + 4 files changed, 220 insertions(+), 201 deletions(-) create mode 100644 vp9/common/subpelvar.h diff --git a/vp9/common/findnearmv.c b/vp9/common/findnearmv.c index 5270abf6ab..52cf07b2f2 100644 --- a/vp9/common/findnearmv.c +++ b/vp9/common/findnearmv.c @@ -11,6 +11,7 @@ #include "findnearmv.h" #include "vp9/common/sadmxn.h" +#include "vp9/common/subpelvar.h" #include <limits.h> const unsigned char vp9_mbsplit_offset[4][16] = { @@ -186,6 +187,76 @@ unsigned int vp9_sad16x3_c( return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 3); } +#if CONFIG_SUBPELREFMV +unsigned int vp9_variance2x16_c(const unsigned char *src_ptr, + const int source_stride, + const unsigned char *ref_ptr, + const int recon_stride, + unsigned int *sse) { + unsigned int var; + int avg; + + variance(src_ptr, source_stride, ref_ptr, recon_stride, 2, 16, &var, &avg); + *sse = var; + return (var - ((avg * avg) >> 5)); +} + +unsigned int vp9_variance16x2_c(const unsigned char *src_ptr, + const int source_stride, + const unsigned char *ref_ptr, + const int recon_stride, + unsigned int *sse) { + unsigned int var; + int avg; + + variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 2, &var, &avg); + *sse = var; + return (var - ((avg * avg) >> 5)); +} + +unsigned int vp9_sub_pixel_variance16x2_c(const unsigned char *src_ptr, + const int src_pixels_per_line, + const int xoffset, + const int yoffset, + const unsigned char *dst_ptr, + const int dst_pixels_per_line, + unsigned int *sse) { + unsigned short FData3[16 * 3]; // Temp data bufffer used in filtering + unsigned char temp2[20 * 16]; + const short *HFilter, *VFilter; + + HFilter = vp9_bilinear_filters[xoffset]; + VFilter = vp9_bilinear_filters[yoffset]; + + var_filter_block2d_bil_first_pass(src_ptr, FData3, + src_pixels_per_line, 1, 3, 16, HFilter); + var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 2, 16, VFilter); + + return vp9_variance16x2_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); +} + +unsigned int vp9_sub_pixel_variance2x16_c(const unsigned char *src_ptr, + const int src_pixels_per_line, + const int xoffset, + const int yoffset, + const unsigned char *dst_ptr, + const int dst_pixels_per_line, + unsigned int *sse) { + unsigned short FData3[2 * 17]; // Temp data bufffer used in filtering + unsigned char temp2[2 * 16]; + const short *HFilter, *VFilter; + + HFilter = vp9_bilinear_filters[xoffset]; + VFilter = vp9_bilinear_filters[yoffset]; + + var_filter_block2d_bil_first_pass(src_ptr, FData3, + src_pixels_per_line, 1, 17, 2, HFilter); + var_filter_block2d_bil_second_pass(FData3, temp2, 2, 2, 16, 2, VFilter); + + return vp9_variance2x16_c(temp2, 2, dst_ptr, dst_pixels_per_line, sse); +} +#endif + /* check a list of motion vectors by sad score using a number rows of pixels * above and a number cols of pixels in the left to select the one with best * score to use as ref motion vector diff --git a/vp9/common/subpelvar.h b/vp9/common/subpelvar.h new file mode 100644 index 0000000000..83cc2a7ce0 --- /dev/null +++ b/vp9/common/subpelvar.h @@ -0,0 +1,147 @@ +/* + * 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 "vp9/common/filter.h" + + + +static void variance(const unsigned char *src_ptr, + int source_stride, + const unsigned char *ref_ptr, + int recon_stride, + int w, + int h, + unsigned int *sse, + int *sum) { + int i, j; + int diff; + + *sum = 0; + *sse = 0; + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + diff = src_ptr[j] - ref_ptr[j]; + *sum += diff; + *sse += diff * diff; + } + + src_ptr += source_stride; + ref_ptr += recon_stride; + } +} + +/**************************************************************************** + * + * ROUTINE : filter_block2d_bil_first_pass + * + * INPUTS : UINT8 *src_ptr : Pointer to source block. + * UINT32 src_pixels_per_line : Stride of input block. + * UINT32 pixel_step : Offset between filter input samples (see notes). + * UINT32 output_height : Input block height. + * UINT32 output_width : Input block width. + * INT32 *vp9_filter : Array of 2 bi-linear filter taps. + * + * OUTPUTS : INT32 *output_ptr : Pointer to filtered block. + * + * RETURNS : void + * + * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in + * either horizontal or vertical 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. + * Two filter taps should sum to VP9_FILTER_WEIGHT. + * pixel_step defines whether the filter is applied + * horizontally (pixel_step=1) or vertically (pixel_step=stride). + * It defines the offset required to move from one input + * to the next. + * + ****************************************************************************/ +static void var_filter_block2d_bil_first_pass(const unsigned char *src_ptr, + unsigned short *output_ptr, + unsigned int src_pixels_per_line, + int pixel_step, + unsigned int output_height, + unsigned int output_width, + const short *vp9_filter) { + unsigned int i, j; + + for (i = 0; i < output_height; i++) { + for (j = 0; j < output_width; j++) { + // Apply bilinear filter + output_ptr[j] = (((int)src_ptr[0] * vp9_filter[0]) + + ((int)src_ptr[pixel_step] * vp9_filter[1]) + + (VP9_FILTER_WEIGHT / 2)) >> VP9_FILTER_SHIFT; + src_ptr++; + } + + // Next row... + src_ptr += src_pixels_per_line - output_width; + output_ptr += output_width; + } +} + +/**************************************************************************** + * + * ROUTINE : filter_block2d_bil_second_pass + * + * INPUTS : INT32 *src_ptr : Pointer to source block. + * UINT32 src_pixels_per_line : Stride of input block. + * UINT32 pixel_step : Offset between filter input samples (see notes). + * UINT32 output_height : Input block height. + * UINT32 output_width : Input block width. + * INT32 *vp9_filter : Array of 2 bi-linear filter taps. + * + * OUTPUTS : UINT16 *output_ptr : Pointer to filtered block. + * + * RETURNS : void + * + * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in + * either horizontal or vertical direction to produce the + * filtered output block. Used to implement second-pass + * of 2-D separable filter. + * + * SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass. + * Two filter taps should sum to VP9_FILTER_WEIGHT. + * pixel_step defines whether the filter is applied + * horizontally (pixel_step=1) or vertically (pixel_step=stride). + * It defines the offset required to move from one input + * to the next. + * + ****************************************************************************/ +static void var_filter_block2d_bil_second_pass(const unsigned short *src_ptr, + unsigned char *output_ptr, + unsigned int src_pixels_per_line, + unsigned int pixel_step, + unsigned int output_height, + unsigned int output_width, + const short *vp9_filter) { + unsigned int i, j; + int Temp; + + for (i = 0; i < output_height; i++) { + for (j = 0; j < output_width; j++) { + // Apply filter + Temp = ((int)src_ptr[0] * vp9_filter[0]) + + ((int)src_ptr[pixel_step] * vp9_filter[1]) + + (VP9_FILTER_WEIGHT / 2); + output_ptr[j] = (unsigned int)(Temp >> VP9_FILTER_SHIFT); + src_ptr++; + } + + // Next row... + src_ptr += src_pixels_per_line - output_width; + output_ptr += output_width; + } +} + diff --git a/vp9/encoder/variance_c.c b/vp9/encoder/variance_c.c index 1577cac8c1..62de703014 100644 --- a/vp9/encoder/variance_c.c +++ b/vp9/encoder/variance_c.c @@ -11,6 +11,7 @@ #include "variance.h" #include "vp9/common/filter.h" +#include "vp9/common/subpelvar.h" unsigned int vp9_get_mb_ss_c(const short *src_ptr) { @@ -24,31 +25,6 @@ unsigned int vp9_get_mb_ss_c(const short *src_ptr) { } -static void variance(const unsigned char *src_ptr, - int source_stride, - const unsigned char *ref_ptr, - int recon_stride, - int w, - int h, - unsigned int *sse, - int *sum) { - int i, j; - int diff; - - *sum = 0; - *sse = 0; - - for (i = 0; i < h; i++) { - for (j = 0; j < w; j++) { - diff = src_ptr[j] - ref_ptr[j]; - *sum += diff; - *sse += diff * diff; - } - - src_ptr += source_stride; - ref_ptr += recon_stride; - } -} #if CONFIG_SUPERBLOCKS unsigned int vp9_variance32x32_c(const unsigned char *src_ptr, @@ -146,113 +122,6 @@ unsigned int vp9_mse16x16_c(const unsigned char *src_ptr, } -/**************************************************************************** - * - * ROUTINE : filter_block2d_bil_first_pass - * - * INPUTS : UINT8 *src_ptr : Pointer to source block. - * UINT32 src_pixels_per_line : Stride of input block. - * UINT32 pixel_step : Offset between filter input samples (see notes). - * UINT32 output_height : Input block height. - * UINT32 output_width : Input block width. - * INT32 *vp9_filter : Array of 2 bi-linear filter taps. - * - * OUTPUTS : INT32 *output_ptr : Pointer to filtered block. - * - * RETURNS : void - * - * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in - * either horizontal or vertical 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. - * Two filter taps should sum to VP9_FILTER_WEIGHT. - * pixel_step defines whether the filter is applied - * horizontally (pixel_step=1) or vertically (pixel_step=stride). - * It defines the offset required to move from one input - * to the next. - * - ****************************************************************************/ -static void var_filter_block2d_bil_first_pass(const unsigned char *src_ptr, - unsigned short *output_ptr, - unsigned int src_pixels_per_line, - int pixel_step, - unsigned int output_height, - unsigned int output_width, - const short *vp9_filter) { - unsigned int i, j; - - for (i = 0; i < output_height; i++) { - for (j = 0; j < output_width; j++) { - // Apply bilinear filter - output_ptr[j] = (((int)src_ptr[0] * vp9_filter[0]) + - ((int)src_ptr[pixel_step] * vp9_filter[1]) + - (VP9_FILTER_WEIGHT / 2)) >> VP9_FILTER_SHIFT; - src_ptr++; - } - - // Next row... - src_ptr += src_pixels_per_line - output_width; - output_ptr += output_width; - } -} - -/**************************************************************************** - * - * ROUTINE : filter_block2d_bil_second_pass - * - * INPUTS : INT32 *src_ptr : Pointer to source block. - * UINT32 src_pixels_per_line : Stride of input block. - * UINT32 pixel_step : Offset between filter input samples (see notes). - * UINT32 output_height : Input block height. - * UINT32 output_width : Input block width. - * INT32 *vp9_filter : Array of 2 bi-linear filter taps. - * - * OUTPUTS : UINT16 *output_ptr : Pointer to filtered block. - * - * RETURNS : void - * - * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in - * either horizontal or vertical direction to produce the - * filtered output block. Used to implement second-pass - * of 2-D separable filter. - * - * SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass. - * Two filter taps should sum to VP9_FILTER_WEIGHT. - * pixel_step defines whether the filter is applied - * horizontally (pixel_step=1) or vertically (pixel_step=stride). - * It defines the offset required to move from one input - * to the next. - * - ****************************************************************************/ -static void var_filter_block2d_bil_second_pass(const unsigned short *src_ptr, - unsigned char *output_ptr, - unsigned int src_pixels_per_line, - unsigned int pixel_step, - unsigned int output_height, - unsigned int output_width, - const short *vp9_filter) { - unsigned int i, j; - int Temp; - - for (i = 0; i < output_height; i++) { - for (j = 0; j < output_width; j++) { - // Apply filter - Temp = ((int)src_ptr[0] * vp9_filter[0]) + - ((int)src_ptr[pixel_step] * vp9_filter[1]) + - (VP9_FILTER_WEIGHT / 2); - output_ptr[j] = (unsigned int)(Temp >> VP9_FILTER_SHIFT); - src_ptr++; - } - - // Next row... - src_ptr += src_pixels_per_line - output_width; - output_ptr += output_width; - } -} - - unsigned int vp9_sub_pixel_variance4x4_c(const unsigned char *src_ptr, int src_pixels_per_line, int xoffset, @@ -469,72 +338,3 @@ unsigned int vp9_sub_pixel_variance8x16_c(const unsigned char *src_ptr, return vp9_variance8x16_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); } -#if CONFIG_NEWBESTREFMV -unsigned int vp9_variance2x16_c(const unsigned char *src_ptr, - const int source_stride, - const unsigned char *ref_ptr, - const int recon_stride, - unsigned int *sse) { - unsigned int var; - int avg; - - variance(src_ptr, source_stride, ref_ptr, recon_stride, 2, 16, &var, &avg); - *sse = var; - return (var - ((avg * avg) >> 5)); -} - -unsigned int vp9_variance16x2_c(const unsigned char *src_ptr, - const int source_stride, - const unsigned char *ref_ptr, - const int recon_stride, - unsigned int *sse) { - unsigned int var; - int avg; - - variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 2, &var, &avg); - *sse = var; - return (var - ((avg * avg) >> 5)); -} - -unsigned int vp9_sub_pixel_variance16x2_c(const unsigned char *src_ptr, - const int src_pixels_per_line, - const int xoffset, - const int yoffset, - const unsigned char *dst_ptr, - const int dst_pixels_per_line, - unsigned int *sse) { - unsigned short FData3[16 * 3]; // Temp data bufffer used in filtering - unsigned char temp2[20 * 16]; - const short *HFilter, *VFilter; - - HFilter = vp9_bilinear_filters[xoffset]; - VFilter = vp9_bilinear_filters[yoffset]; - - var_filter_block2d_bil_first_pass(src_ptr, FData3, - src_pixels_per_line, 1, 3, 16, HFilter); - var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 2, 16, VFilter); - - return vp9_variance16x2_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); -} - -unsigned int vp9_sub_pixel_variance2x16_c(const unsigned char *src_ptr, - const int src_pixels_per_line, - const int xoffset, - const int yoffset, - const unsigned char *dst_ptr, - const int dst_pixels_per_line, - unsigned int *sse) { - unsigned short FData3[2 * 17]; // Temp data bufffer used in filtering - unsigned char temp2[2 * 16]; - const short *HFilter, *VFilter; - - HFilter = vp9_bilinear_filters[xoffset]; - VFilter = vp9_bilinear_filters[yoffset]; - - var_filter_block2d_bil_first_pass(src_ptr, FData3, - src_pixels_per_line, 1, 17, 2, HFilter); - var_filter_block2d_bil_second_pass(FData3, temp2, 2, 2, 16, 2, VFilter); - - return vp9_variance2x16_c(temp2, 2, dst_ptr, dst_pixels_per_line, sse); -} -#endif diff --git a/vp9/vp9_common.mk b/vp9/vp9_common.mk index c5237d8463..927b887bbc 100644 --- a/vp9/vp9_common.mk +++ b/vp9/vp9_common.mk @@ -53,6 +53,7 @@ VP9_COMMON_SRCS-yes += common/reconintra4x4.h VP9_COMMON_SRCS-yes += common/rtcd.c VP9_COMMON_SRCS-yes += common/rtcd_defs.sh VP9_COMMON_SRCS-yes += common/sadmxn.h +VP9_COMMON_SRCS-yes += common/subpelvar.h VP9_COMMON_SRCS-yes += common/seg_common.h VP9_COMMON_SRCS-yes += common/seg_common.c VP9_COMMON_SRCS-yes += common/setupintrarecon.h -- GitLab