| Index: source/libvpx/vp9/encoder/vp9_temporal_filter.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_temporal_filter.c (revision 282873)
|
| +++ source/libvpx/vp9/encoder/vp9_temporal_filter.c (working copy)
|
| @@ -178,7 +178,7 @@
|
| &cpi->fn_ptr[BLOCK_16X16],
|
| 0, mv_sf->subpel_iters_per_step,
|
| NULL, NULL,
|
| - &distortion, &sse);
|
| + &distortion, &sse, NULL, 0, 0);
|
|
|
| // Restore input state
|
| x->plane[0].src = src;
|
| @@ -355,150 +355,32 @@
|
| mbd->plane[i].pre[0].buf = input_buffer[i];
|
| }
|
|
|
| -void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) {
|
| - VP9_COMMON *const cm = &cpi->common;
|
| - int frame = 0;
|
| - int frames_to_blur_backward = 0;
|
| - int frames_to_blur_forward = 0;
|
| - int frames_to_blur = 0;
|
| - int start_frame = 0;
|
| - int strength = cpi->active_arnr_strength;
|
| - int blur_type = cpi->oxcf.arnr_type;
|
| - int max_frames = cpi->active_arnr_frames;
|
| - 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) {
|
| - case 1:
|
| - // Backward Blur
|
| - frames_to_blur_backward = num_frames_backward;
|
| -
|
| - if (frames_to_blur_backward >= max_frames)
|
| - frames_to_blur_backward = max_frames - 1;
|
| -
|
| - frames_to_blur = frames_to_blur_backward + 1;
|
| - break;
|
| -
|
| - case 2:
|
| - // Forward Blur
|
| - frames_to_blur_forward = num_frames_forward;
|
| -
|
| - if (frames_to_blur_forward >= max_frames)
|
| - frames_to_blur_forward = max_frames - 1;
|
| -
|
| - frames_to_blur = frames_to_blur_forward + 1;
|
| - break;
|
| -
|
| - case 3:
|
| - default:
|
| - // Center Blur
|
| - frames_to_blur_forward = num_frames_forward;
|
| - frames_to_blur_backward = num_frames_backward;
|
| -
|
| - if (frames_to_blur_forward > frames_to_blur_backward)
|
| - frames_to_blur_forward = frames_to_blur_backward;
|
| -
|
| - if (frames_to_blur_backward > frames_to_blur_forward)
|
| - frames_to_blur_backward = frames_to_blur_forward;
|
| -
|
| - // When max_frames is even we have 1 more frame backward than forward
|
| - if (frames_to_blur_forward > (max_frames - 1) / 2)
|
| - frames_to_blur_forward = ((max_frames - 1) / 2);
|
| -
|
| - if (frames_to_blur_backward > (max_frames / 2))
|
| - frames_to_blur_backward = (max_frames / 2);
|
| -
|
| - frames_to_blur = frames_to_blur_backward + frames_to_blur_forward + 1;
|
| - break;
|
| - }
|
| -
|
| - start_frame = distance + frames_to_blur_forward;
|
| -
|
| -#ifdef DEBUGFWG
|
| - // DEBUG FWG
|
| - printf(
|
| - "max:%d FBCK:%d FFWD:%d ftb:%d ftbbck:%d ftbfwd:%d sei:%d lasei:%d "
|
| - "start:%d",
|
| - max_frames, num_frames_backward, num_frames_forward, frames_to_blur,
|
| - frames_to_blur_backward, frames_to_blur_forward, cpi->source_encode_index,
|
| - cpi->last_alt_ref_sei, start_frame);
|
| -#endif
|
| -
|
| - // Setup scaling factors. Scaling on each of the arnr frames is not supported
|
| - vp9_setup_scale_factors_for_frame(&sf,
|
| - get_frame_new_buffer(cm)->y_crop_width,
|
| - get_frame_new_buffer(cm)->y_crop_height,
|
| - cm->width, cm->height);
|
| -
|
| - // Setup frame pointers, NULL indicates frame not included in filter
|
| - vp9_zero(cpi->frames);
|
| - for (frame = 0; frame < frames_to_blur; frame++) {
|
| - int which_buffer = start_frame - frame;
|
| - struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead,
|
| - which_buffer);
|
| - cpi->frames[frames_to_blur - 1 - frame] = &buf->img;
|
| - }
|
| -
|
| - temporal_filter_iterate_c(cpi, frames_to_blur, frames_to_blur_backward,
|
| - strength, &sf);
|
| -}
|
| -
|
| -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;
|
| +// Apply buffer limits and context specific adjustments to arnr filter.
|
| +static void adjust_arnr_filter(VP9_COMP *cpi,
|
| + int distance, int group_boost) {
|
| + const int frames_after_arf =
|
| + vp9_lookahead_depth(cpi->lookahead) - distance - 1;
|
| + int frames_fwd = (cpi->oxcf.arnr_max_frames - 1) >> 1;
|
| + int frames_bwd;
|
| 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 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 = vp9_lookahead_depth(cpi->lookahead)
|
| - - frames_to_arnr - 1;
|
| + // Define the forward and backwards filter limits for this arnr group.
|
| + if (frames_fwd > frames_after_arf)
|
| + frames_fwd = frames_after_arf;
|
| + if (frames_fwd > distance)
|
| + frames_fwd = distance;
|
|
|
| - switch (cpi->oxcf.arnr_type) {
|
| - case 1: // Backward filter
|
| - frames_fwd = 0;
|
| - if (frames_bwd > half_gf_int)
|
| - frames_bwd = half_gf_int;
|
| - break;
|
| + frames_bwd = frames_fwd;
|
|
|
| - case 2: // Forward filter
|
| - if (frames_fwd > half_gf_int)
|
| - frames_fwd = half_gf_int;
|
| - if (frames_fwd > frames_after_arf)
|
| - frames_fwd = frames_after_arf;
|
| - frames_bwd = 0;
|
| - break;
|
| + // For even length filter there is one more frame backward
|
| + // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
|
| + if (frames_bwd < distance)
|
| + frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1;
|
|
|
| - case 3: // Centered filter
|
| - default:
|
| - frames_fwd >>= 1;
|
| - if (frames_fwd > frames_after_arf)
|
| - frames_fwd = frames_after_arf;
|
| - if (frames_fwd > half_gf_int)
|
| - frames_fwd = half_gf_int;
|
| -
|
| - frames_bwd = frames_fwd;
|
| -
|
| - // For even length filter there is one more frame backward
|
| - // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
|
| - if (frames_bwd < half_gf_int)
|
| - frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1;
|
| - break;
|
| - }
|
| -
|
| + // Set the baseline active filter size.
|
| cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd;
|
|
|
| - // Adjust the strength based on active max q
|
| + // Adjust the strength based on active max q.
|
| if (cpi->common.current_video_frame > 1)
|
| q = ((int)vp9_convert_qindex_to_q(
|
| cpi->rc.avg_frame_qindex[INTER_FRAME]));
|
| @@ -521,4 +403,50 @@
|
| if (cpi->active_arnr_strength > (group_boost / 300)) {
|
| cpi->active_arnr_strength = (group_boost / 300);
|
| }
|
| +
|
| + // Adjustments for second level arf in multi arf case.
|
| + if (cpi->pass == 2 && cpi->multi_arf_allowed) {
|
| + const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| + if (gf_group->rf_level[gf_group->index] != GF_ARF_STD) {
|
| + cpi->active_arnr_strength >>= 1;
|
| + }
|
| + }
|
| }
|
| +
|
| +void vp9_temporal_filter(VP9_COMP *cpi, int distance) {
|
| + VP9_COMMON *const cm = &cpi->common;
|
| + RATE_CONTROL *const rc = &cpi->rc;
|
| + int frame;
|
| + int frames_to_blur;
|
| + int start_frame;
|
| + int strength;
|
| + int frames_to_blur_backward;
|
| + int frames_to_blur_forward;
|
| + struct scale_factors sf;
|
| +
|
| + // Apply context specific adjustments to the arnr filter parameters.
|
| + adjust_arnr_filter(cpi, distance, rc->gfu_boost);
|
| + strength = cpi->active_arnr_strength;
|
| + frames_to_blur = cpi->active_arnr_frames;
|
| + frames_to_blur_backward = (frames_to_blur / 2);
|
| + frames_to_blur_forward = ((frames_to_blur - 1) / 2);
|
| + start_frame = distance + frames_to_blur_forward;
|
| +
|
| + // Setup scaling factors. Scaling on each of the arnr frames not supported.
|
| + vp9_setup_scale_factors_for_frame(&sf,
|
| + get_frame_new_buffer(cm)->y_crop_width,
|
| + get_frame_new_buffer(cm)->y_crop_height,
|
| + cm->width, cm->height);
|
| +
|
| + // Setup frame pointers, NULL indicates frame not included in filter.
|
| + vp9_zero(cpi->frames);
|
| + for (frame = 0; frame < frames_to_blur; ++frame) {
|
| + const int which_buffer = start_frame - frame;
|
| + struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead,
|
| + which_buffer);
|
| + cpi->frames[frames_to_blur - 1 - frame] = &buf->img;
|
| + }
|
| +
|
| + temporal_filter_iterate_c(cpi, frames_to_blur, frames_to_blur_backward,
|
| + strength, &sf);
|
| +}
|
|
|