
Weighted single motion search is implemented for obmc predictor. When NEWMV mode is used, to determine the MV for the current block, we run weighted motion search to compare the weighted prediction with (source - weighted prediction using neighbors' MVs), in which the distortion is the actual prediction error of obmc prediction. Coding gain: 0.404/0.425/0.366 for lowres/midres/hdres Speed impact: +14% encoding time (obmc w/o mv search 13%-> obmc w/ mv search 27%) Change-Id: Id7ad3fc6ba295b23d9c53c8a16a4ac1677ad835c
184 lines
7.5 KiB
C
184 lines
7.5 KiB
C
/*
|
|
* Copyright (c) 2015 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.
|
|
*/
|
|
|
|
#ifndef VPX_DSP_VARIANCE_H_
|
|
#define VPX_DSP_VARIANCE_H_
|
|
|
|
#include "./vpx_config.h"
|
|
|
|
#include "vpx/vpx_integer.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define FILTER_BITS 7
|
|
#define FILTER_WEIGHT 128
|
|
|
|
typedef unsigned int(*vpx_sad_fn_t)(const uint8_t *a, int a_stride,
|
|
const uint8_t *b, int b_stride);
|
|
|
|
typedef unsigned int(*vpx_sad_avg_fn_t)(const uint8_t *a, int a_stride,
|
|
const uint8_t *b, int b_stride,
|
|
const uint8_t *second_pred);
|
|
|
|
typedef void (*vp8_copy32xn_fn_t)(const uint8_t *a, int a_stride,
|
|
uint8_t *b, int b_stride, int n);
|
|
|
|
typedef void (*vpx_sad_multi_fn_t)(const uint8_t *a, int a_stride,
|
|
const uint8_t *b, int b_stride,
|
|
unsigned int *sad_array);
|
|
|
|
typedef void (*vpx_sad_multi_d_fn_t)(const uint8_t *a, int a_stride,
|
|
const uint8_t *const b_array[],
|
|
int b_stride,
|
|
unsigned int *sad_array);
|
|
|
|
typedef unsigned int (*vpx_variance_fn_t)(const uint8_t *a, int a_stride,
|
|
const uint8_t *b, int b_stride,
|
|
unsigned int *sse);
|
|
|
|
typedef unsigned int (*vpx_subpixvariance_fn_t)(const uint8_t *a, int a_stride,
|
|
int xoffset, int yoffset,
|
|
const uint8_t *b, int b_stride,
|
|
unsigned int *sse);
|
|
|
|
typedef unsigned int (*vpx_subp_avg_variance_fn_t)(const uint8_t *a,
|
|
int a_stride,
|
|
int xoffset, int yoffset,
|
|
const uint8_t *b,
|
|
int b_stride,
|
|
unsigned int *sse,
|
|
const uint8_t *second_pred);
|
|
#if CONFIG_VP8
|
|
typedef struct variance_vtable {
|
|
vpx_sad_fn_t sdf;
|
|
vpx_variance_fn_t vf;
|
|
vpx_subpixvariance_fn_t svf;
|
|
vpx_variance_fn_t svf_halfpix_h;
|
|
vpx_variance_fn_t svf_halfpix_v;
|
|
vpx_variance_fn_t svf_halfpix_hv;
|
|
vpx_sad_multi_fn_t sdx3f;
|
|
vpx_sad_multi_fn_t sdx8f;
|
|
vpx_sad_multi_d_fn_t sdx4df;
|
|
#if ARCH_X86 || ARCH_X86_64
|
|
vp8_copy32xn_fn_t copymem;
|
|
#endif
|
|
} vp8_variance_fn_ptr_t;
|
|
#endif // CONFIG_VP8
|
|
|
|
#if CONFIG_VP10 && CONFIG_EXT_INTER
|
|
typedef unsigned int(*vpx_masked_sad_fn_t)(const uint8_t *src,
|
|
int src_stride,
|
|
const uint8_t *ref,
|
|
int ref_stride,
|
|
const uint8_t *msk_ptr,
|
|
int msk_stride);
|
|
typedef unsigned int (*vpx_masked_variance_fn_t)(const uint8_t *src,
|
|
int src_stride,
|
|
const uint8_t *ref,
|
|
int ref_stride,
|
|
const uint8_t *msk,
|
|
int msk_stride,
|
|
unsigned int *sse);
|
|
typedef unsigned int (*vpx_masked_subpixvariance_fn_t)(const uint8_t *src,
|
|
int src_stride,
|
|
int xoffset, int yoffset,
|
|
const uint8_t *ref,
|
|
int ref_stride,
|
|
const uint8_t *msk,
|
|
int msk_stride,
|
|
unsigned int *sse);
|
|
#endif // CONFIG_VP10 && CONFIG_EXT_INTER
|
|
|
|
#if CONFIG_VP10 && CONFIG_OBMC
|
|
typedef unsigned int(*vpx_obmc_sad_fn_t)(const uint8_t *pred,
|
|
int pred_stride,
|
|
const int *wsrc,
|
|
int wsrc_stride,
|
|
const int *msk,
|
|
int msk_stride);
|
|
typedef unsigned int (*vpx_obmc_variance_fn_t)(const uint8_t *pred,
|
|
int pred_stride,
|
|
const int *wsrc,
|
|
int wsrc_stride,
|
|
const int *msk,
|
|
int msk_stride,
|
|
unsigned int *sse);
|
|
typedef unsigned int (*vpx_obmc_subpixvariance_fn_t)(const uint8_t *pred,
|
|
int pred_stride,
|
|
int xoffset, int yoffset,
|
|
const int *wsrc,
|
|
int wsrc_stride,
|
|
const int *msk,
|
|
int msk_stride,
|
|
unsigned int *sse);
|
|
#endif // CONFIG_VP10 && CONFIG_OBMC
|
|
|
|
#if CONFIG_VP9
|
|
typedef struct vp9_variance_vtable {
|
|
vpx_sad_fn_t sdf;
|
|
vpx_sad_avg_fn_t sdaf;
|
|
vpx_variance_fn_t vf;
|
|
vpx_subpixvariance_fn_t svf;
|
|
vpx_subp_avg_variance_fn_t svaf;
|
|
vpx_sad_multi_fn_t sdx3f;
|
|
vpx_sad_multi_fn_t sdx8f;
|
|
vpx_sad_multi_d_fn_t sdx4df;
|
|
} vp9_variance_fn_ptr_t;
|
|
#endif // CONFIG_VP9
|
|
|
|
#if CONFIG_VP10
|
|
typedef struct vp10_variance_vtable {
|
|
vpx_sad_fn_t sdf;
|
|
vpx_sad_avg_fn_t sdaf;
|
|
vpx_variance_fn_t vf;
|
|
vpx_subpixvariance_fn_t svf;
|
|
vpx_subp_avg_variance_fn_t svaf;
|
|
vpx_sad_multi_fn_t sdx3f;
|
|
vpx_sad_multi_fn_t sdx8f;
|
|
vpx_sad_multi_d_fn_t sdx4df;
|
|
#if CONFIG_EXT_INTER
|
|
vpx_masked_sad_fn_t msdf;
|
|
vpx_masked_variance_fn_t mvf;
|
|
vpx_masked_subpixvariance_fn_t msvf;
|
|
#endif // CONFIG_EXT_INTER
|
|
#if CONFIG_OBMC
|
|
vpx_obmc_sad_fn_t osdf;
|
|
vpx_obmc_variance_fn_t ovf;
|
|
vpx_obmc_subpixvariance_fn_t osvf;
|
|
#endif // CONFIG_OBMC
|
|
} vp10_variance_fn_ptr_t;
|
|
#endif // CONFIG_VP10
|
|
|
|
void vpx_highbd_var_filter_block2d_bil_first_pass(
|
|
const uint8_t *src_ptr8,
|
|
uint16_t *output_ptr,
|
|
unsigned int src_pixels_per_line,
|
|
int pixel_step,
|
|
unsigned int output_height,
|
|
unsigned int output_width,
|
|
const uint8_t *filter);
|
|
|
|
void vpx_highbd_var_filter_block2d_bil_second_pass(
|
|
const uint16_t *src_ptr,
|
|
uint16_t *output_ptr,
|
|
unsigned int src_pixels_per_line,
|
|
unsigned int pixel_step,
|
|
unsigned int output_height,
|
|
unsigned int output_width,
|
|
const uint8_t *filter);
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif // VPX_DSP_VARIANCE_H_
|