From f8d4492d2249744b34cfdd4bb1adc13f14a14906 Mon Sep 17 00:00:00 2001 From: Jerome Jiang Date: Thu, 9 Aug 2018 21:46:27 -0700 Subject: [PATCH] Refactor: Move code updating ref frames for svc & denoiser. Make new functions and move them to vp9_denoiser.c and vp9_svc_layercontext.c Change-Id: Ia34266ee2831d0f1316b7a641cbbf40fe64e1a0c --- vp9/encoder/vp9_denoiser.c | 38 +++++++++++++++ vp9/encoder/vp9_denoiser.h | 2 + vp9/encoder/vp9_encoder.c | 75 +----------------------------- vp9/encoder/vp9_svc_layercontext.c | 39 +++++++++++++++- vp9/encoder/vp9_svc_layercontext.h | 2 +- 5 files changed, 81 insertions(+), 75 deletions(-) diff --git a/vp9/encoder/vp9_denoiser.c b/vp9/encoder/vp9_denoiser.c index 6abb082cd..29311c79a 100644 --- a/vp9/encoder/vp9_denoiser.c +++ b/vp9/encoder/vp9_denoiser.c @@ -717,6 +717,44 @@ int64_t vp9_scale_acskip_thresh(int64_t threshold, return threshold; } +void vp9_denoiser_update_ref_frame(VP9_COMP *const cpi) { + VP9_COMMON *const cm = &cpi->common; + SVC *const svc = &cpi->svc; + if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc(cpi) && + cpi->denoiser.denoising_level > kDenLowLow) { + int svc_refresh_denoiser_buffers = 0; + int denoise_svc_second_layer = 0; + FRAME_TYPE frame_type = cm->intra_only ? KEY_FRAME : cm->frame_type; + if (cpi->use_svc) { + const int svc_buf_shift = + svc->number_spatial_layers - svc->spatial_layer_id == 2 + ? cpi->denoiser.num_ref_frames + : 0; + int layer = + LAYER_IDS_TO_IDX(svc->spatial_layer_id, svc->temporal_layer_id, + svc->number_temporal_layers); + LAYER_CONTEXT *const lc = &svc->layer_context[layer]; + svc_refresh_denoiser_buffers = + lc->is_key_frame || svc->spatial_layer_sync[svc->spatial_layer_id]; + denoise_svc_second_layer = + svc->number_spatial_layers - svc->spatial_layer_id == 2 ? 1 : 0; + // Check if we need to allocate extra buffers in the denoiser + // for refreshed frames. + if (vp9_denoiser_realloc_svc( + cm, &cpi->denoiser, svc_buf_shift, cpi->refresh_alt_ref_frame, + cpi->refresh_golden_frame, cpi->refresh_last_frame, + cpi->alt_fb_idx, cpi->gld_fb_idx, cpi->lst_fb_idx)) + vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, + "Failed to re-allocate denoiser for SVC"); + } + vp9_denoiser_update_frame_info( + &cpi->denoiser, *cpi->Source, frame_type, cpi->refresh_alt_ref_frame, + cpi->refresh_golden_frame, cpi->refresh_last_frame, cpi->alt_fb_idx, + cpi->gld_fb_idx, cpi->lst_fb_idx, cpi->resize_pending, + svc_refresh_denoiser_buffers, denoise_svc_second_layer); + } +} + #ifdef OUTPUT_YUV_DENOISED static void make_grayscale(YV12_BUFFER_CONFIG *yuv) { int r, c; diff --git a/vp9/encoder/vp9_denoiser.h b/vp9/encoder/vp9_denoiser.h index d25fe7edc..13f0abd6a 100644 --- a/vp9/encoder/vp9_denoiser.h +++ b/vp9/encoder/vp9_denoiser.h @@ -120,6 +120,8 @@ int64_t vp9_scale_acskip_thresh(int64_t threshold, VP9_DENOISER_LEVEL noise_level, int abs_sumdiff, int temporal_layer_id); +void vp9_denoiser_update_ref_frame(struct VP9_COMP *const cpi); + #ifdef __cplusplus } // extern "C" #endif diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index a6441c686..40ea13a9c 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -3228,87 +3228,16 @@ void update_ref_frames(VP9_COMP *cpi) { } void vp9_update_reference_frames(VP9_COMP *cpi) { - VP9_COMMON *const cm = &cpi->common; - BufferPool *const pool = cm->buffer_pool; - SVC *const svc = &cpi->svc; - if (cpi->extra_arf_allowed) update_multi_arf_ref_frames(cpi); else update_ref_frames(cpi); #if CONFIG_VP9_TEMPORAL_DENOISING - if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc(cpi) && - cpi->denoiser.denoising_level > kDenLowLow) { - int svc_refresh_denoiser_buffers = 0; - int denoise_svc_second_layer = 0; - FRAME_TYPE frame_type = cm->intra_only ? KEY_FRAME : cm->frame_type; - if (cpi->use_svc) { - int realloc_fail = 0; - const int svc_buf_shift = - svc->number_spatial_layers - svc->spatial_layer_id == 2 - ? cpi->denoiser.num_ref_frames - : 0; - int layer = - LAYER_IDS_TO_IDX(svc->spatial_layer_id, svc->temporal_layer_id, - svc->number_temporal_layers); - LAYER_CONTEXT *const lc = &svc->layer_context[layer]; - svc_refresh_denoiser_buffers = - lc->is_key_frame || svc->spatial_layer_sync[svc->spatial_layer_id]; - denoise_svc_second_layer = - svc->number_spatial_layers - svc->spatial_layer_id == 2 ? 1 : 0; - // Check if we need to allocate extra buffers in the denoiser - // for - // refreshed frames. - realloc_fail = vp9_denoiser_realloc_svc( - cm, &cpi->denoiser, svc_buf_shift, cpi->refresh_alt_ref_frame, - cpi->refresh_golden_frame, cpi->refresh_last_frame, cpi->alt_fb_idx, - cpi->gld_fb_idx, cpi->lst_fb_idx); - if (realloc_fail) - vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, - "Failed to re-allocate denoiser for SVC"); - } - vp9_denoiser_update_frame_info( - &cpi->denoiser, *cpi->Source, frame_type, cpi->refresh_alt_ref_frame, - cpi->refresh_golden_frame, cpi->refresh_last_frame, cpi->alt_fb_idx, - cpi->gld_fb_idx, cpi->lst_fb_idx, cpi->resize_pending, - svc_refresh_denoiser_buffers, denoise_svc_second_layer); - } + vp9_denoiser_update_ref_frame(cpi); #endif - if (is_one_pass_cbr_svc(cpi)) { - if (svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) { - vp9_svc_update_ref_frame_bypass_mode(cpi); - } else if (cm->frame_type == KEY_FRAME) { - // Keep track of frame index for each reference frame. - int i; - // On key frame update all reference frame slots. - for (i = 0; i < REF_FRAMES; i++) { - svc->fb_idx_spatial_layer_id[i] = svc->spatial_layer_id; - svc->fb_idx_temporal_layer_id[i] = svc->temporal_layer_id; - // LAST/GOLDEN/ALTREF is already updated above. - if (i != cpi->lst_fb_idx && i != cpi->gld_fb_idx && - i != cpi->alt_fb_idx) - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[i], cm->new_fb_idx); - } - } else { - if (cpi->refresh_last_frame) { - svc->fb_idx_spatial_layer_id[cpi->lst_fb_idx] = svc->spatial_layer_id; - svc->fb_idx_temporal_layer_id[cpi->lst_fb_idx] = svc->temporal_layer_id; - } - if (cpi->refresh_golden_frame) { - svc->fb_idx_spatial_layer_id[cpi->gld_fb_idx] = svc->spatial_layer_id; - svc->fb_idx_temporal_layer_id[cpi->gld_fb_idx] = svc->temporal_layer_id; - } - if (cpi->refresh_alt_ref_frame) { - svc->fb_idx_spatial_layer_id[cpi->alt_fb_idx] = svc->spatial_layer_id; - svc->fb_idx_temporal_layer_id[cpi->alt_fb_idx] = svc->temporal_layer_id; - } - } - // Copy flags from encoder to SVC struct. - vp9_copy_flags_ref_update_idx(cpi); - vp9_svc_update_ref_frame_buffer_idx(cpi); - } + if (is_one_pass_cbr_svc(cpi)) vp9_svc_update_ref_frame(cpi); } static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c index 2154d144a..0bd4fd29a 100644 --- a/vp9/encoder/vp9_svc_layercontext.c +++ b/vp9/encoder/vp9_svc_layercontext.c @@ -1126,7 +1126,7 @@ void vp9_svc_update_ref_frame_buffer_idx(VP9_COMP *const cpi) { } } -void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) { +static void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) { // For non-flexible/bypass SVC mode: check for refreshing other buffer // slots. SVC *const svc = &cpi->svc; @@ -1142,3 +1142,40 @@ void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) { } } } + +void vp9_svc_update_ref_frame(VP9_COMP *const cpi) { + VP9_COMMON *const cm = &cpi->common; + SVC *const svc = &cpi->svc; + BufferPool *const pool = cm->buffer_pool; + + if (svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) { + vp9_svc_update_ref_frame_bypass_mode(cpi); + } else if (cm->frame_type == KEY_FRAME) { + // Keep track of frame index for each reference frame. + int i; + // On key frame update all reference frame slots. + for (i = 0; i < REF_FRAMES; i++) { + svc->fb_idx_spatial_layer_id[i] = svc->spatial_layer_id; + svc->fb_idx_temporal_layer_id[i] = svc->temporal_layer_id; + // LAST/GOLDEN/ALTREF is already updated above. + if (i != cpi->lst_fb_idx && i != cpi->gld_fb_idx && i != cpi->alt_fb_idx) + ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[i], cm->new_fb_idx); + } + } else { + if (cpi->refresh_last_frame) { + svc->fb_idx_spatial_layer_id[cpi->lst_fb_idx] = svc->spatial_layer_id; + svc->fb_idx_temporal_layer_id[cpi->lst_fb_idx] = svc->temporal_layer_id; + } + if (cpi->refresh_golden_frame) { + svc->fb_idx_spatial_layer_id[cpi->gld_fb_idx] = svc->spatial_layer_id; + svc->fb_idx_temporal_layer_id[cpi->gld_fb_idx] = svc->temporal_layer_id; + } + if (cpi->refresh_alt_ref_frame) { + svc->fb_idx_spatial_layer_id[cpi->alt_fb_idx] = svc->spatial_layer_id; + svc->fb_idx_temporal_layer_id[cpi->alt_fb_idx] = svc->temporal_layer_id; + } + } + // Copy flags from encoder to SVC struct. + vp9_copy_flags_ref_update_idx(cpi); + vp9_svc_update_ref_frame_buffer_idx(cpi); +} diff --git a/vp9/encoder/vp9_svc_layercontext.h b/vp9/encoder/vp9_svc_layercontext.h index 6eba7c8c2..82d5cdca6 100644 --- a/vp9/encoder/vp9_svc_layercontext.h +++ b/vp9/encoder/vp9_svc_layercontext.h @@ -232,7 +232,7 @@ void vp9_svc_check_spatial_layer_sync(struct VP9_COMP *const cpi); void vp9_svc_update_ref_frame_buffer_idx(struct VP9_COMP *const cpi); -void vp9_svc_update_ref_frame_bypass_mode(struct VP9_COMP *const cpi); +void vp9_svc_update_ref_frame(struct VP9_COMP *const cpi); #ifdef __cplusplus } // extern "C" -- 2.40.0