From 4ca882f32fb7f45044ccf01db0f4a40c52e5fcca Mon Sep 17 00:00:00 2001 From: Yunqing Wang Date: Wed, 3 Apr 2013 12:22:50 -0700 Subject: [PATCH] Modify vp9_setup_interp_filters function Took vp9_setup_scale_factors_for_frame() out from vp9_setup_interp_filters(), so that it is only called once per frame instead of per macroblock. Decoder tests showed a 1.5% performance gain. Change-Id: I770cb09eb2140ab85132f82aed388ac0bdd3a0aa --- vp9/common/vp9_reconinter.c | 15 --------------- vp9/decoder/vp9_decodframe.c | 20 +++++++++++++------- vp9/encoder/vp9_onyx_if.c | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/vp9/common/vp9_reconinter.c b/vp9/common/vp9_reconinter.c index 30a16d1a9..75b4e7cae 100644 --- a/vp9/common/vp9_reconinter.c +++ b/vp9/common/vp9_reconinter.c @@ -206,20 +206,6 @@ void vp9_setup_scale_factors_for_frame(struct scale_factors *scale, void vp9_setup_interp_filters(MACROBLOCKD *xd, INTERPOLATIONFILTERTYPE mcomp_filter_type, VP9_COMMON *cm) { - int i; - - /* Calculate scaling factors for each of the 3 available references */ - for (i = 0; i < 3; ++i) { - if (cm->active_ref_idx[i] >= NUM_YV12_BUFFERS) { - memset(&cm->active_ref_scale[i], 0, sizeof(cm->active_ref_scale[i])); - continue; - } - - vp9_setup_scale_factors_for_frame(&cm->active_ref_scale[i], - &cm->yv12_fb[cm->active_ref_idx[i]], - cm->width, cm->height); - } - if (xd->mode_info_context) { MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; @@ -229,7 +215,6 @@ void vp9_setup_interp_filters(MACROBLOCKD *xd, cm->active_ref_scale); } - switch (mcomp_filter_type) { case EIGHTTAP: case SWITCHABLE: diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index 90dcdecfa..f0b85fec8 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -1103,13 +1103,6 @@ static void init_frame(VP9D_COMP *pbi) { vp9_setup_past_independence(pc, xd); } - if (pc->frame_type != KEY_FRAME) { - pc->mcomp_filter_type = pc->use_bilinear_mc_filter ? BILINEAR : EIGHTTAP; - - // To enable choice of different interpolation filters - vp9_setup_interp_filters(xd, pc->mcomp_filter_type, pc); - } - xd->mode_info_context = pc->mi; xd->prev_mode_info_context = pc->prev_mi; xd->frame_type = pc->frame_type; @@ -1767,6 +1760,19 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { #if CONFIG_COMP_INTERINTRA_PRED pc->use_interintra = vp9_read_bit(&header_bc); #endif + + /* Calculate scaling factors for each of the 3 available references */ + for (i = 0; i < 3; ++i) { + if (pc->active_ref_idx[i] >= NUM_YV12_BUFFERS) { + memset(&pc->active_ref_scale[i], 0, sizeof(pc->active_ref_scale[i])); + continue; + } + + vp9_setup_scale_factors_for_frame(&pc->active_ref_scale[i], + &pc->yv12_fb[pc->active_ref_idx[i]], + pc->width, pc->height); + } + // To enable choice of different interploation filters vp9_setup_interp_filters(xd, pc->mcomp_filter_type, pc); } diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index 7052c0e87..f74273086 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -3640,6 +3640,7 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags, VP9_COMMON *cm = &cpi->common; struct vpx_usec_timer cmptimer; YV12_BUFFER_CONFIG *force_src_buffer = NULL; + int i; if (!cpi) return -1; @@ -3784,7 +3785,20 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags, cm->width, cm->height, VP9BORDERINPIXELS); + /* Calculate scaling factors for each of the 3 available references */ + for (i = 0; i < 3; ++i) { + if (cm->active_ref_idx[i] >= NUM_YV12_BUFFERS) { + memset(&cm->active_ref_scale[i], 0, sizeof(cm->active_ref_scale[i])); + continue; + } + + vp9_setup_scale_factors_for_frame(&cm->active_ref_scale[i], + &cm->yv12_fb[cm->active_ref_idx[i]], + cm->width, cm->height); + } + vp9_setup_interp_filters(&cpi->mb.e_mbd, DEFAULT_INTERP_FILTER, cm); + if (cpi->pass == 1) { Pass1Encode(cpi, size, dest, frame_flags); } else if (cpi->pass == 2) {