From 1ec44505c9f37b35f3f4e630b7bc564eca7980d6 Mon Sep 17 00:00:00 2001 From: Minghai Shang Date: Fri, 18 Apr 2014 10:59:15 -0700 Subject: [PATCH] Bug fix for svc first pass rate control. 1. We didn't scale source image in lower layers so that the stats are incorrect. 2. We didn't extend borders for re-constructed image. Change-Id: Ia8d7bafbdb695ffa7f504e171f9449812e7bb0a3 --- vp9/encoder/vp9_firstpass.c | 7 +++++-- vp9/encoder/vp9_onyx_if.c | 13 +++++++------ vp9/encoder/vp9_onyx_int.h | 4 ++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 726b804..e250c20 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -532,6 +532,9 @@ void vp9_first_pass(VP9_COMP *cpi) { // Disable golden frame for svc first pass for now. gld_yv12 = NULL; set_ref_ptrs(cm, xd, ref_frame, NONE); + + cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source, + &cpi->scaled_source); } vp9_setup_src_planes(x, cpi->Source, 0, 0); @@ -848,6 +851,8 @@ void vp9_first_pass(VP9_COMP *cpi) { ++twopass->sr_update_lag; } + vp9_extend_frame_borders(new_yv12); + if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { vp9_update_reference_frames(cpi); } else { @@ -855,8 +860,6 @@ void vp9_first_pass(VP9_COMP *cpi) { swap_yv12(lst_yv12, new_yv12); } - vp9_extend_frame_borders(lst_yv12); - // Special case for the first frame. Copy into the GF buffer as a second // reference. if (cm->current_video_frame == 0 && gld_yv12 != NULL) { diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index 78372b8..0aba911 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -2209,8 +2209,9 @@ static void set_ext_overrides(VP9_COMP *cpi) { } } -static YV12_BUFFER_CONFIG *scale_if_required(VP9_COMMON *cm, - YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled) { +YV12_BUFFER_CONFIG *vp9_scale_if_required(VP9_COMMON *cm, + YV12_BUFFER_CONFIG *unscaled, + YV12_BUFFER_CONFIG *scaled) { if (cm->mi_cols * MI_SIZE != unscaled->y_width || cm->mi_rows * MI_SIZE != unscaled->y_height) { scale_and_extend_frame_nonnormative(unscaled, scaled); @@ -2235,12 +2236,12 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi, struct segmentation *const seg = &cm->seg; set_ext_overrides(cpi); - cpi->Source = scale_if_required(cm, cpi->un_scaled_source, - &cpi->scaled_source); + cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source, + &cpi->scaled_source); if (cpi->unscaled_last_source != NULL) - cpi->Last_Source = scale_if_required(cm, cpi->unscaled_last_source, - &cpi->scaled_last_source); + cpi->Last_Source = vp9_scale_if_required(cm, cpi->unscaled_last_source, + &cpi->scaled_last_source); vp9_scale_references(cpi); diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h index 5f59f1d..7cad0cc 100644 --- a/vp9/encoder/vp9_onyx_int.h +++ b/vp9/encoder/vp9_onyx_int.h @@ -618,6 +618,10 @@ void vp9_update_reference_frames(VP9_COMP *cpi); int64_t vp9_rescale(int64_t val, int64_t num, int denom); +YV12_BUFFER_CONFIG *vp9_scale_if_required(VP9_COMMON *cm, + YV12_BUFFER_CONFIG *unscaled, + YV12_BUFFER_CONFIG *scaled); + static INLINE void set_ref_ptrs(VP9_COMMON *cm, MACROBLOCKD *xd, MV_REFERENCE_FRAME ref0, MV_REFERENCE_FRAME ref1) { -- 2.7.4