From f6255dbb530d5a07851501851a4cea4ca563030a Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 5 Aug 2015 13:53:26 -0700 Subject: [PATCH] Bugfix for svc. Condition usage of rc.frames_since_golden to non-svc mode. rc.frames_since_golden, which is used in non-svc mode to add second reference, was causing, under certain condiiton, the turning off of golden reference for svc case. Change-Id: Icec644d235d0471e56d8ff73d6c37278bd6ecd3b --- vp9/encoder/vp9_encodeframe.c | 4 +++- vp9/encoder/vp9_pickmode.c | 3 +-- vp9/encoder/vp9_ratectrl.c | 16 +++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index e7f14eb7e..feef12d1e 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -3925,7 +3925,9 @@ static void encode_frame_internal(VP9_COMP *cpi) { } vp9_zero(x->zcoeff_blk); - if (cm->frame_type != KEY_FRAME && cpi->rc.frames_since_golden == 0) + if (cm->frame_type != KEY_FRAME && + cpi->rc.frames_since_golden == 0 && + !cpi->use_svc) cpi->ref_frame_flags &= (~VP9_GOLD_FLAG); if (sf->partition_search_type == SOURCE_VAR_BASED_PARTITION) diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 6831be8d5..2493bd7c7 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -1157,12 +1157,11 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, vp9_denoiser_reset_frame_stats(ctx); #endif - if (cpi->rc.frames_since_golden == 0) { + if (cpi->rc.frames_since_golden == 0 && !cpi->use_svc) { usable_ref_frame = LAST_FRAME; } else { usable_ref_frame = GOLDEN_FRAME; } - for (ref_frame = LAST_FRAME; ref_frame <= usable_ref_frame; ++ref_frame) { const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 7427ccfb9..d16241642 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -1339,13 +1339,15 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits; - if (is_altref_enabled(cpi) && cpi->refresh_alt_ref_frame && - (cm->frame_type != KEY_FRAME)) - // Update the alternate reference frame stats as appropriate. - update_alt_ref_frame_stats(cpi); - else - // Update the Golden frame stats as appropriate. - update_golden_frame_stats(cpi); + if (!cpi->use_svc) { + if (is_altref_enabled(cpi) && cpi->refresh_alt_ref_frame && + (cm->frame_type != KEY_FRAME)) + // Update the alternate reference frame stats as appropriate. + update_alt_ref_frame_stats(cpi); + else + // Update the Golden frame stats as appropriate. + update_golden_frame_stats(cpi); + } if (cm->frame_type == KEY_FRAME) rc->frames_since_key = 0;