diff options
Diffstat (limited to 'third_party/aom/av1/encoder/temporal_filter.c')
-rw-r--r-- | third_party/aom/av1/encoder/temporal_filter.c | 132 |
1 files changed, 91 insertions, 41 deletions
diff --git a/third_party/aom/av1/encoder/temporal_filter.c b/third_party/aom/av1/encoder/temporal_filter.c index 604647922..daa647689 100644 --- a/third_party/aom/av1/encoder/temporal_filter.c +++ b/third_party/aom/av1/encoder/temporal_filter.c @@ -44,18 +44,13 @@ static void temporal_filter_predictors_mb_c( ConvolveParams conv_params = get_conv_params(which_mv, which_mv, 0); #if USE_TEMPORALFILTER_12TAP -#if CONFIG_DUAL_FILTER - const InterpFilter interp_filter[4] = { TEMPORALFILTER_12TAP, - TEMPORALFILTER_12TAP, - TEMPORALFILTER_12TAP, - TEMPORALFILTER_12TAP }; -#else - const InterpFilter interp_filter = TEMPORALFILTER_12TAP; -#endif + const InterpFilters interp_filters = + av1_broadcast_interp_filter(TEMPORALFILTER_12TAP); (void)xd; #else - const InterpFilter interp_filter = xd->mi[0]->mbmi.interp_filter; + const InterpFilters interp_filters = xd->mi[0]->mbmi.interp_filters; #endif // USE_TEMPORALFILTER_12TAP + #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION WarpTypesAllowed warp_types; memset(&warp_types, 0, sizeof(WarpTypesAllowed)); @@ -72,7 +67,7 @@ static void temporal_filter_predictors_mb_c( #if CONFIG_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { av1_highbd_build_inter_predictor(y_mb_ptr, stride, &pred[0], 16, &mv, scale, - 16, 16, which_mv, interp_filter, + 16, 16, which_mv, interp_filters, #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION &warp_types, x, y, #endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION @@ -80,7 +75,7 @@ static void temporal_filter_predictors_mb_c( av1_highbd_build_inter_predictor(u_mb_ptr, uv_stride, &pred[256], uv_block_width, &mv, scale, uv_block_width, - uv_block_height, which_mv, interp_filter, + uv_block_height, which_mv, interp_filters, #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION &warp_types, x, y, #endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION @@ -88,7 +83,7 @@ static void temporal_filter_predictors_mb_c( av1_highbd_build_inter_predictor(v_mb_ptr, uv_stride, &pred[512], uv_block_width, &mv, scale, uv_block_width, - uv_block_height, which_mv, interp_filter, + uv_block_height, which_mv, interp_filters, #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION &warp_types, x, y, #endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION @@ -97,7 +92,7 @@ static void temporal_filter_predictors_mb_c( } #endif // CONFIG_HIGHBITDEPTH av1_build_inter_predictor(y_mb_ptr, stride, &pred[0], 16, &mv, scale, 16, 16, - &conv_params, interp_filter, + &conv_params, interp_filters, #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION &warp_types, x, y, 0, 0, #endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION @@ -105,7 +100,7 @@ static void temporal_filter_predictors_mb_c( av1_build_inter_predictor(u_mb_ptr, uv_stride, &pred[256], uv_block_width, &mv, scale, uv_block_width, uv_block_height, - &conv_params, interp_filter, + &conv_params, interp_filters, #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION &warp_types, x, y, 1, 0, #endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION @@ -113,7 +108,7 @@ static void temporal_filter_predictors_mb_c( av1_build_inter_predictor(v_mb_ptr, uv_stride, &pred[512], uv_block_width, &mv, scale, uv_block_width, uv_block_height, - &conv_params, interp_filter, + &conv_params, interp_filters, #if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION &warp_types, x, y, 2, 0, #endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION @@ -291,15 +286,30 @@ static int temporal_filter_find_matching_mb_c(AV1_COMP *cpi, x->mv_limits = tmp_mv_limits; - // Ignore mv costing by sending NULL pointer instead of cost array - bestsme = cpi->find_fractional_mv_step( - x, &best_ref_mv1, cpi->common.allow_high_precision_mv, x->errorperbit, - &cpi->fn_ptr[BLOCK_16X16], 0, mv_sf->subpel_iters_per_step, - cond_cost_list(cpi, cost_list), NULL, NULL, &distortion, &sse, NULL, -#if CONFIG_EXT_INTER - NULL, 0, 0, +// Ignore mv costing by sending NULL pointer instead of cost array +#if CONFIG_AMVR + if (cpi->common.cur_frame_mv_precision_level == 1) { + const uint8_t *const src_address = x->plane[0].src.buf; + const int src_stride = x->plane[0].src.stride; + const uint8_t *const y = xd->plane[0].pre[0].buf; + const int y_stride = xd->plane[0].pre[0].stride; + const int offset = x->best_mv.as_mv.row * y_stride + x->best_mv.as_mv.col; + + x->best_mv.as_mv.row *= 8; + x->best_mv.as_mv.col *= 8; + + bestsme = cpi->fn_ptr[BLOCK_16X16].vf(y + offset, y_stride, src_address, + src_stride, &sse); + } else { +#endif + bestsme = cpi->find_fractional_mv_step( + x, &best_ref_mv1, cpi->common.allow_high_precision_mv, x->errorperbit, + &cpi->fn_ptr[BLOCK_16X16], 0, mv_sf->subpel_iters_per_step, + cond_cost_list(cpi, cost_list), NULL, NULL, &distortion, &sse, NULL, + NULL, 0, 0, 0, 0, 0); +#if CONFIG_AMVR + } #endif - 0, 0, 0); x->e_mbd.mi[0]->bmi[0].as_mv[0] = x->best_mv; @@ -311,6 +321,9 @@ static int temporal_filter_find_matching_mb_c(AV1_COMP *cpi, } static void temporal_filter_iterate_c(AV1_COMP *cpi, +#if CONFIG_BGSPRITE + YV12_BUFFER_CONFIG *target, +#endif // CONFIG_BGSPRITE YV12_BUFFER_CONFIG **frames, int frame_count, int alt_ref_index, int strength, @@ -452,9 +465,17 @@ static void temporal_filter_iterate_c(AV1_COMP *cpi, if (mbd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { uint16_t *dst1_16; uint16_t *dst2_16; +#if CONFIG_BGSPRITE + dst1 = target->y_buffer; +#else dst1 = cpi->alt_ref_buffer.y_buffer; +#endif // CONFIG_BGSPRITE dst1_16 = CONVERT_TO_SHORTPTR(dst1); +#if CONFIG_BGSPRITE + stride = target->y_stride; +#else stride = cpi->alt_ref_buffer.y_stride; +#endif // CONFIG_BGSPRITE byte = mb_y_offset; for (i = 0, k = 0; i < 16; i++) { for (j = 0; j < 16; j++, k++) { @@ -494,8 +515,13 @@ static void temporal_filter_iterate_c(AV1_COMP *cpi, } } else { #endif // CONFIG_HIGHBITDEPTH - dst1 = cpi->alt_ref_buffer.y_buffer; - stride = cpi->alt_ref_buffer.y_stride; +#if CONFIG_BGSPRITE + dst1 = target->y_buffer; + stride = target->y_stride; +#else + dst1 = cpi->alt_ref_buffer.y_buffer; + stride = cpi->alt_ref_buffer.y_stride; +#endif // CONFIG_BGSPRITE byte = mb_y_offset; for (i = 0, k = 0; i < 16; i++) { for (j = 0; j < 16; j++, k++) { @@ -507,10 +533,15 @@ static void temporal_filter_iterate_c(AV1_COMP *cpi, } byte += stride - 16; } - - dst1 = cpi->alt_ref_buffer.u_buffer; - dst2 = cpi->alt_ref_buffer.v_buffer; - stride = cpi->alt_ref_buffer.uv_stride; +#if CONFIG_BGSPRITE + dst1 = target->u_buffer; + dst2 = target->v_buffer; + stride = target->uv_stride; +#else + dst1 = cpi->alt_ref_buffer.u_buffer; + dst2 = cpi->alt_ref_buffer.v_buffer; + stride = cpi->alt_ref_buffer.uv_stride; +#endif // CONFIG_BGSPRITE byte = mb_uv_offset; for (i = 0, k = 256; i < mb_uv_height; i++) { for (j = 0; j < mb_uv_width; j++, k++) { @@ -604,7 +635,7 @@ static void adjust_arnr_filter(AV1_COMP *cpi, int distance, int group_boost, void av1_temporal_filter(AV1_COMP *cpi, #if CONFIG_BGSPRITE - YV12_BUFFER_CONFIG *bg, + YV12_BUFFER_CONFIG *bg, YV12_BUFFER_CONFIG *target, #endif // CONFIG_BGSPRITE int distance) { RATE_CONTROL *const rc = &cpi->rc; @@ -618,7 +649,7 @@ void av1_temporal_filter(AV1_COMP *cpi, YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS] = { NULL }; #if CONFIG_EXT_REFS const GF_GROUP *const gf_group = &cpi->twopass.gf_group; -#endif +#endif // CONFIG_EXT_REFS // Apply context specific adjustments to the arnr filter parameters. adjust_arnr_filter(cpi, distance, rc->gfu_boost, &frames_to_blur, &strength); @@ -627,19 +658,34 @@ void av1_temporal_filter(AV1_COMP *cpi, // case it is more beneficial to use non-zero strength // filtering. #if CONFIG_EXT_REFS - if (gf_group->rf_level[gf_group->index] == GF_ARF_LOW) { + if (gf_group->update_type[gf_group->index] == INTNL_ARF_UPDATE) { strength = 0; frames_to_blur = 1; } -#endif -#if CONFIG_EXT_REFS - if (strength == 0 && frames_to_blur == 1) { - cpi->is_arf_filter_off[gf_group->arf_update_idx[gf_group->index]] = 1; - } else { - cpi->is_arf_filter_off[gf_group->arf_update_idx[gf_group->index]] = 0; + int which_arf = gf_group->arf_update_idx[gf_group->index]; + +#if USE_GF16_MULTI_LAYER + if (cpi->rc.baseline_gf_interval == 16) { + // Identify the index to the current ARF. + const int num_arfs_in_gf = cpi->num_extra_arfs + 1; + int arf_idx; + for (arf_idx = 0; arf_idx < num_arfs_in_gf; arf_idx++) { + if (gf_group->index == cpi->arf_pos_in_gf[arf_idx]) { + which_arf = arf_idx; + break; + } + } + assert(arf_idx < num_arfs_in_gf); } -#endif +#endif // USE_GF16_MULTI_LAYER + + // Set the temporal filtering status for the corresponding OVERLAY frame + if (strength == 0 && frames_to_blur == 1) + cpi->is_arf_filter_off[which_arf] = 1; + else + cpi->is_arf_filter_off[which_arf] = 0; +#endif // CONFIG_EXT_REFS frames_to_blur_backward = (frames_to_blur / 2); frames_to_blur_forward = ((frames_to_blur - 1) / 2); @@ -678,6 +724,10 @@ void av1_temporal_filter(AV1_COMP *cpi, #endif // CONFIG_HIGHBITDEPTH } - temporal_filter_iterate_c(cpi, frames, frames_to_blur, - frames_to_blur_backward, strength, &sf); + temporal_filter_iterate_c(cpi, +#if CONFIG_BGSPRITE + target, +#endif // CONFIG_BGSPRITE + frames, frames_to_blur, frames_to_blur_backward, + strength, &sf); } |