| Index: source/libvpx/vp9/common/vp9_scale.c
|
| diff --git a/source/libvpx/vp9/common/vp9_scale.c b/source/libvpx/vp9/common/vp9_scale.c
|
| index 8f5c72e7c6c067a80411a657764fcbd8adde3db0..b763b925b3ea49ccf682e1948350dcef67fd21cd 100644
|
| --- a/source/libvpx/vp9/common/vp9_scale.c
|
| +++ b/source/libvpx/vp9/common/vp9_scale.c
|
| @@ -79,6 +79,7 @@ void vp9_setup_scale_factors_for_frame(struct scale_factors *sf,
|
| // applied in one direction only, and not at all for 0,0, seems to give the
|
| // best quality, but it may be worth trying an additional mode that does
|
| // do the filtering on full-pel.
|
| +
|
| if (sf->x_step_q4 == 16) {
|
| if (sf->y_step_q4 == 16) {
|
| // No scaling in either direction.
|
| @@ -90,35 +91,43 @@ void vp9_setup_scale_factors_for_frame(struct scale_factors *sf,
|
| sf->predict[1][0][1] = vpx_convolve8_avg_horiz;
|
| } else {
|
| // No scaling in x direction. Must always scale in the y direction.
|
| - sf->predict[0][0][0] = vpx_convolve8_vert;
|
| - sf->predict[0][0][1] = vpx_convolve8_avg_vert;
|
| - sf->predict[0][1][0] = vpx_convolve8_vert;
|
| - sf->predict[0][1][1] = vpx_convolve8_avg_vert;
|
| - sf->predict[1][0][0] = vpx_convolve8;
|
| - sf->predict[1][0][1] = vpx_convolve8_avg;
|
| + sf->predict[0][0][0] = vpx_scaled_vert;
|
| + sf->predict[0][0][1] = vpx_scaled_avg_vert;
|
| + sf->predict[0][1][0] = vpx_scaled_vert;
|
| + sf->predict[0][1][1] = vpx_scaled_avg_vert;
|
| + sf->predict[1][0][0] = vpx_scaled_2d;
|
| + sf->predict[1][0][1] = vpx_scaled_avg_2d;
|
| }
|
| } else {
|
| if (sf->y_step_q4 == 16) {
|
| // No scaling in the y direction. Must always scale in the x direction.
|
| - sf->predict[0][0][0] = vpx_convolve8_horiz;
|
| - sf->predict[0][0][1] = vpx_convolve8_avg_horiz;
|
| - sf->predict[0][1][0] = vpx_convolve8;
|
| - sf->predict[0][1][1] = vpx_convolve8_avg;
|
| - sf->predict[1][0][0] = vpx_convolve8_horiz;
|
| - sf->predict[1][0][1] = vpx_convolve8_avg_horiz;
|
| + sf->predict[0][0][0] = vpx_scaled_horiz;
|
| + sf->predict[0][0][1] = vpx_scaled_avg_horiz;
|
| + sf->predict[0][1][0] = vpx_scaled_2d;
|
| + sf->predict[0][1][1] = vpx_scaled_avg_2d;
|
| + sf->predict[1][0][0] = vpx_scaled_horiz;
|
| + sf->predict[1][0][1] = vpx_scaled_avg_horiz;
|
| } else {
|
| // Must always scale in both directions.
|
| - sf->predict[0][0][0] = vpx_convolve8;
|
| - sf->predict[0][0][1] = vpx_convolve8_avg;
|
| - sf->predict[0][1][0] = vpx_convolve8;
|
| - sf->predict[0][1][1] = vpx_convolve8_avg;
|
| - sf->predict[1][0][0] = vpx_convolve8;
|
| - sf->predict[1][0][1] = vpx_convolve8_avg;
|
| + sf->predict[0][0][0] = vpx_scaled_2d;
|
| + sf->predict[0][0][1] = vpx_scaled_avg_2d;
|
| + sf->predict[0][1][0] = vpx_scaled_2d;
|
| + sf->predict[0][1][1] = vpx_scaled_avg_2d;
|
| + sf->predict[1][0][0] = vpx_scaled_2d;
|
| + sf->predict[1][0][1] = vpx_scaled_avg_2d;
|
| }
|
| }
|
| +
|
| // 2D subpel motion always gets filtered in both directions
|
| - sf->predict[1][1][0] = vpx_convolve8;
|
| - sf->predict[1][1][1] = vpx_convolve8_avg;
|
| +
|
| + if ((sf->x_step_q4 != 16) || (sf->y_step_q4 != 16)) {
|
| + sf->predict[1][1][0] = vpx_scaled_2d;
|
| + sf->predict[1][1][1] = vpx_scaled_avg_2d;
|
| + } else {
|
| + sf->predict[1][1][0] = vpx_convolve8;
|
| + sf->predict[1][1][1] = vpx_convolve8_avg;
|
| + }
|
| +
|
| #if CONFIG_VP9_HIGHBITDEPTH
|
| if (use_highbd) {
|
| if (sf->x_step_q4 == 16) {
|
|
|