| Index: source/libvpx/vp9/encoder/vp9_temporal_filter.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_temporal_filter.c (revision 251189)
|
| +++ source/libvpx/vp9/encoder/vp9_temporal_filter.c (working copy)
|
| @@ -29,7 +29,6 @@
|
| #include "vpx_scale/vpx_scale.h"
|
|
|
| #define ALT_REF_MC_ENABLED 1 // dis/enable MC in AltRef filtering
|
| -#define ALT_REF_SUBPEL_ENABLED 1 // dis/enable subpel in MC AltRef filtering
|
|
|
| static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
|
| uint8_t *y_mb_ptr,
|
| @@ -134,17 +133,16 @@
|
| int sadpb = x->sadperbit16;
|
| int bestsme = INT_MAX;
|
|
|
| - int_mv best_ref_mv1;
|
| - int_mv best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
|
| - int_mv *ref_mv;
|
| + MV best_ref_mv1 = {0, 0};
|
| + MV best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
|
| + MV *ref_mv = &x->e_mbd.mi_8x8[0]->bmi[0].as_mv[0].as_mv;
|
|
|
| // Save input state
|
| struct buf_2d src = x->plane[0].src;
|
| struct buf_2d pre = xd->plane[0].pre[0];
|
|
|
| - best_ref_mv1.as_int = 0;
|
| - best_ref_mv1_full.as_mv.col = best_ref_mv1.as_mv.col >> 3;
|
| - best_ref_mv1_full.as_mv.row = best_ref_mv1.as_mv.row >> 3;
|
| + best_ref_mv1_full.col = best_ref_mv1.col >> 3;
|
| + best_ref_mv1_full.row = best_ref_mv1.row >> 3;
|
|
|
| // Setup frame pointers
|
| x->plane[0].src.buf = arf_frame_buf;
|
| @@ -161,21 +159,17 @@
|
|
|
| /*cpi->sf.search_method == HEX*/
|
| // Ignore mv costing by sending NULL pointer instead of cost arrays
|
| - ref_mv = &x->e_mbd.mi_8x8[0]->bmi[0].as_mv[0];
|
| - bestsme = vp9_hex_search(x, &best_ref_mv1_full.as_mv,
|
| - step_param, sadpb, 1,
|
| - &cpi->fn_ptr[BLOCK_16X16],
|
| - 0, &best_ref_mv1.as_mv, &ref_mv->as_mv);
|
| + vp9_hex_search(x, &best_ref_mv1_full, step_param, sadpb, 1,
|
| + &cpi->fn_ptr[BLOCK_16X16], 0, &best_ref_mv1, ref_mv);
|
|
|
| -#if ALT_REF_SUBPEL_ENABLED
|
| // Try sub-pixel MC?
|
| // if (bestsme > error_thresh && bestsme < INT_MAX)
|
| {
|
| int distortion;
|
| unsigned int sse;
|
| // Ignore mv costing by sending NULL pointer instead of cost array
|
| - bestsme = cpi->find_fractional_mv_step(x, &ref_mv->as_mv,
|
| - &best_ref_mv1.as_mv,
|
| + bestsme = cpi->find_fractional_mv_step(x, ref_mv,
|
| + &best_ref_mv1,
|
| cpi->common.allow_high_precision_mv,
|
| x->errorperbit,
|
| &cpi->fn_ptr[BLOCK_16X16],
|
| @@ -183,7 +177,6 @@
|
| NULL, NULL,
|
| &distortion, &sse);
|
| }
|
| -#endif
|
|
|
| // Restore input state
|
| x->plane[0].src = src;
|
| @@ -392,7 +385,6 @@
|
| const int num_frames_backward = distance;
|
| const int num_frames_forward = vp9_lookahead_depth(cpi->lookahead)
|
| - (num_frames_backward + 1);
|
| -
|
| struct scale_factors sf;
|
|
|
| switch (blur_type) {
|
| @@ -408,7 +400,6 @@
|
|
|
| case 2:
|
| // Forward Blur
|
| -
|
| frames_to_blur_forward = num_frames_forward;
|
|
|
| if (frames_to_blur_forward >= max_frames)
|
| @@ -471,22 +462,24 @@
|
| strength, &sf);
|
| }
|
|
|
| -void configure_arnr_filter(VP9_COMP *cpi, const unsigned int this_frame,
|
| - const int group_boost) {
|
| +void vp9_configure_arnr_filter(VP9_COMP *cpi,
|
| + const unsigned int frames_to_arnr,
|
| + const int group_boost) {
|
| int half_gf_int;
|
| int frames_after_arf;
|
| int frames_bwd = cpi->oxcf.arnr_max_frames - 1;
|
| int frames_fwd = cpi->oxcf.arnr_max_frames - 1;
|
| int q;
|
|
|
| - // Define the arnr filter width for this group of frames:
|
| - // We only filter frames that lie within a distance of half
|
| - // the GF interval from the ARF frame. We also have to trap
|
| - // cases where the filter extends beyond the end of clip.
|
| - // Note: this_frame->frame has been updated in the loop
|
| - // so it now points at the ARF frame.
|
| + // Define the arnr filter width for this group of frames. We only
|
| + // filter frames that lie within a distance of half the GF interval
|
| + // from the ARF frame. We also have to trap cases where the filter
|
| + // extends beyond the end of the lookahead buffer.
|
| + // Note: frames_to_arnr parameter is the offset of the arnr
|
| + // frame from the current frame.
|
| half_gf_int = cpi->rc.baseline_gf_interval >> 1;
|
| - frames_after_arf = (int)(cpi->twopass.total_stats.count - this_frame - 1);
|
| + frames_after_arf = vp9_lookahead_depth(cpi->lookahead)
|
| + - frames_to_arnr - 1;
|
|
|
| switch (cpi->oxcf.arnr_type) {
|
| case 1: // Backward filter
|
| @@ -523,11 +516,16 @@
|
| cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd;
|
|
|
| // Adjust the strength based on active max q
|
| - q = ((int)vp9_convert_qindex_to_q(cpi->rc.active_worst_quality) >> 1);
|
| - if (q > 8) {
|
| + if (cpi->common.current_video_frame > 1)
|
| + q = ((int)vp9_convert_qindex_to_q(
|
| + cpi->rc.avg_frame_qindex[INTER_FRAME]));
|
| + else
|
| + q = ((int)vp9_convert_qindex_to_q(
|
| + cpi->rc.avg_frame_qindex[KEY_FRAME]));
|
| + if (q > 16) {
|
| cpi->active_arnr_strength = cpi->oxcf.arnr_strength;
|
| } else {
|
| - cpi->active_arnr_strength = cpi->oxcf.arnr_strength - (8 - q);
|
| + cpi->active_arnr_strength = cpi->oxcf.arnr_strength - ((16 - q) / 2);
|
| if (cpi->active_arnr_strength < 0)
|
| cpi->active_arnr_strength = 0;
|
| }
|
|
|