From ae365775e77627d474fa26ae0367c3bb90f4ca1e Mon Sep 17 00:00:00 2001 From: Marco Paniconi Date: Wed, 13 Mar 2019 13:46:12 -0700 Subject: [PATCH] vp9-svc: Reorganize the simulcast mode Set the lst/gld/alt_fb_idx and refresh flags for key frames at the start of encoding (in svc_set_params). This then avoids new code/function in update_references() and in copy_flags_ref_update(). Change-Id: Id3503c0c628540c20f11a540c118c4ee4cf04848 --- vp9/encoder/vp9_encoder.c | 6 +-- vp9/encoder/vp9_ratectrl.c | 46 ++++++++++++++++++++--- vp9/encoder/vp9_svc_layercontext.c | 60 +----------------------------- 3 files changed, 43 insertions(+), 69 deletions(-) diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 36dea81cd..a9b2507de 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -3114,11 +3114,7 @@ static void update_ref_frames(VP9_COMP *cpi) { } void vp9_update_reference_frames(VP9_COMP *cpi) { - if (cpi->svc.simulcast_mode && is_one_pass_cbr_svc(cpi) && - cpi->common.frame_type == KEY_FRAME) - vp9_svc_update_ref_frame_key_simulcast(cpi); - else - update_ref_frames(cpi); + update_ref_frames(cpi); #if CONFIG_VP9_TEMPORAL_DENOISING vp9_denoiser_update_ref_frame(cpi); diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index aa263711a..23d586f43 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -2209,11 +2209,47 @@ void vp9_rc_get_svc_params(VP9_COMP *cpi) { } } - if (svc->simulcast_mode && svc->spatial_layer_id > 0 && - svc->layer_context[layer].is_key_frame == 1) { - cm->frame_type = KEY_FRAME; - cpi->ref_frame_flags &= (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG); - target = calc_iframe_target_size_one_pass_cbr(cpi); + if (svc->simulcast_mode) { + if (svc->spatial_layer_id > 0 && + svc->layer_context[layer].is_key_frame == 1) { + cm->frame_type = KEY_FRAME; + cpi->ref_frame_flags &= (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG); + target = calc_iframe_target_size_one_pass_cbr(cpi); + } + // Set the buffer idx and refresh flags for key frames in simulcast mode. + // Note the buffer slot for long-term reference is set below (line 2255), + // and alt_ref is used for that on key frame. So use last and golden for + // the other two normal slots. + if (cm->frame_type == KEY_FRAME) { + if (svc->number_spatial_layers == 2) { + if (svc->spatial_layer_id == 0) { + cpi->lst_fb_idx = 0; + cpi->gld_fb_idx = 2; + cpi->alt_fb_idx = 6; + } else if (svc->spatial_layer_id == 1) { + cpi->lst_fb_idx = 1; + cpi->gld_fb_idx = 3; + cpi->alt_fb_idx = 6; + } + } else if (svc->number_spatial_layers == 3) { + if (svc->spatial_layer_id == 0) { + cpi->lst_fb_idx = 0; + cpi->gld_fb_idx = 3; + cpi->alt_fb_idx = 6; + } else if (svc->spatial_layer_id == 1) { + cpi->lst_fb_idx = 1; + cpi->gld_fb_idx = 4; + cpi->alt_fb_idx = 6; + } else if (svc->spatial_layer_id == 2) { + cpi->lst_fb_idx = 2; + cpi->gld_fb_idx = 5; + cpi->alt_fb_idx = 7; + } + } + cpi->ext_refresh_last_frame = 1; + cpi->ext_refresh_golden_frame = 1; + cpi->ext_refresh_alt_ref_frame = 1; + } } // Check if superframe contains a sync layer request. diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c index 83c59934d..311363c79 100644 --- a/vp9/encoder/vp9_svc_layercontext.c +++ b/vp9/encoder/vp9_svc_layercontext.c @@ -733,26 +733,6 @@ void vp9_copy_flags_ref_update_idx(VP9_COMP *const cpi) { } } - if (svc->simulcast_mode && cpi->common.frame_type == KEY_FRAME) { - const int index = svc->number_spatial_layers == 3 ? sl - 1 : sl; - const int ltf = svc->buffer_gf_temporal_ref[index].idx; - if (svc->number_spatial_layers == 2) { - if (sl == 0) - svc->update_buffer_slot[sl] = 1 + 4; // 0, 2 - else if (sl == 1) - svc->update_buffer_slot[sl] = 2 + 8; // 1, 3 - } else if (svc->number_spatial_layers == 3) { - if (sl == 0) - svc->update_buffer_slot[sl] = 1 + 8; // 0, 3 - else if (sl == 1) - svc->update_buffer_slot[sl] = 2 + 16; // 1, 4 - else if (sl == 2) - svc->update_buffer_slot[sl] = 4 + 32; // 2, 5 - } - if (svc->use_gf_temporal_ref_current_layer) - svc->update_buffer_slot[sl] += (1 << ltf); - } - // TODO(jianj): Remove these 3, deprecated. svc->update_last[sl] = (uint8_t)cpi->refresh_last_frame; svc->update_golden[sl] = (uint8_t)cpi->refresh_golden_frame; @@ -1233,44 +1213,6 @@ static void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) { } } -void vp9_svc_update_ref_frame_key_simulcast(VP9_COMP *const cpi) { - VP9_COMMON *const cm = &cpi->common; - SVC *const svc = &cpi->svc; - BufferPool *const pool = cm->buffer_pool; - const int sl_id = svc->spatial_layer_id; - const int tl_id = svc->temporal_layer_id; - const int num_sl = svc->number_spatial_layers; - // SL0: - // 3 spatial layers: update slot 0 and 3 - // 2 spatial layers: update slot 0 and 2 - // 1 spatial layer: update slot 0 and 1 - // SL1: - // 3 spatial layers: update slot 1, 4, and 6 - // 2 spatial layers: update slot 1, 3, and 6 - // slot 6 is for golden frame long temporal prediction. - // SL2: update slot 2, 5 and 7 - // slot 7 is for golden frame long temporal prediction. - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[sl_id], cm->new_fb_idx); - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[num_sl + sl_id], - cm->new_fb_idx); - svc->fb_idx_spatial_layer_id[sl_id] = sl_id; - svc->fb_idx_temporal_layer_id[sl_id] = tl_id; - svc->fb_idx_spatial_layer_id[num_sl + sl_id] = sl_id; - svc->fb_idx_temporal_layer_id[num_sl + sl_id] = tl_id; - // Update slots for golden frame long temporal prediction. - if (svc->use_gf_temporal_ref_current_layer) { - const int index = num_sl == 3 ? sl_id - 1 : sl_id; - const int lt_buffer_index = svc->buffer_gf_temporal_ref[index].idx; - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[lt_buffer_index], - cm->new_fb_idx); - svc->fb_idx_spatial_layer_id[lt_buffer_index] = sl_id; - svc->fb_idx_temporal_layer_id[lt_buffer_index] = tl_id; - } - - vp9_copy_flags_ref_update_idx(cpi); - vp9_svc_update_ref_frame_buffer_idx(cpi); -} - void vp9_svc_update_ref_frame(VP9_COMP *const cpi) { VP9_COMMON *const cm = &cpi->common; SVC *const svc = &cpi->svc; @@ -1290,7 +1232,7 @@ void vp9_svc_update_ref_frame(VP9_COMP *const cpi) { 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 (cm->frame_type != KEY_FRAME) { + } 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; -- 2.40.0