diff options
-rw-r--r-- | vp9/encoder/vp9_pickmode.c | 39 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 30 | ||||
-rw-r--r-- | vp9/encoder/vp9_svc_layercontext.c | 1 |
3 files changed, 39 insertions, 31 deletions
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 358bedd33..23575b0ee 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -802,13 +802,14 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, MIN(max_txsize_lookup[bsize], tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); - if (best_pred != NULL && reuse_inter_pred && - best_pred->data == orig_dst.buf) { - this_mode_pred = &tmp[get_pred_buffer(tmp, 3)]; - vp9_convolve_copy(best_pred->data, best_pred->stride, - this_mode_pred->data, this_mode_pred->stride, - NULL, 0, NULL, 0, bw, bh); - best_pred = this_mode_pred; + if (reuse_inter_pred && best_pred != NULL) { + if (best_pred->data == orig_dst.buf) { + this_mode_pred = &tmp[get_pred_buffer(tmp, 3)]; + vp9_convolve_copy(best_pred->data, best_pred->stride, + this_mode_pred->data, this_mode_pred->stride, + NULL, 0, NULL, 0, bw, bh); + best_pred = this_mode_pred; + } } pd->dst = orig_dst; @@ -844,22 +845,24 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } pd->dst = orig_dst; - if (reuse_inter_pred && best_pred->data != orig_dst.buf && - is_inter_mode(mbmi->mode)) { + + if (reuse_inter_pred && best_pred != NULL) { + if (best_pred->data != orig_dst.buf && is_inter_mode(mbmi->mode)) { #if CONFIG_VP9_HIGHBITDEPTH - if (cm->use_highbitdepth) - vp9_highbd_convolve_copy(best_pred->data, best_pred->stride, - pd->dst.buf, pd->dst.stride, NULL, 0, - NULL, 0, bw, bh, xd->bd); - else + if (cm->use_highbitdepth) + vp9_highbd_convolve_copy(best_pred->data, best_pred->stride, + pd->dst.buf, pd->dst.stride, NULL, 0, + NULL, 0, bw, bh, xd->bd); + else + vp9_convolve_copy(best_pred->data, best_pred->stride, + pd->dst.buf, pd->dst.stride, NULL, 0, + NULL, 0, bw, bh); +#else vp9_convolve_copy(best_pred->data, best_pred->stride, pd->dst.buf, pd->dst.stride, NULL, 0, NULL, 0, bw, bh); -#else - vp9_convolve_copy(best_pred->data, best_pred->stride, - pd->dst.buf, pd->dst.stride, NULL, 0, - NULL, 0, bw, bh); #endif + } } if (is_inter_block(mbmi)) diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 2390e6fb7..f1d4774d1 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -581,18 +581,23 @@ static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *rc = &cpi->rc; // Buffer level below which we push active_worst to worst_quality. - int64_t critical_level = rc->optimal_buffer_level >> 2; + int64_t critical_level = rc->optimal_buffer_level >> 3; int64_t buff_lvl_step = 0; int adjustment = 0; int active_worst_quality; + int ambient_qp; if (cm->frame_type == KEY_FRAME) - return rc->worst_quality * 4 / 5; - if (cm->current_video_frame > 1) - active_worst_quality = MIN(rc->worst_quality, - rc->avg_frame_qindex[INTER_FRAME] * 5 / 4); - else - active_worst_quality = MIN(rc->worst_quality, - rc->avg_frame_qindex[KEY_FRAME] * 3 / 2); + return rc->worst_quality; + // For ambient_qp we use minimum of avg_frame_qindex[KEY_FRAME/INTER_FRAME] + // for the first few frames following key frame. These are both initialized + // to worst_quality and updated with (3/4, 1/4) average in postencode_update. + // So for first few frames following key, the qp of that key frame is weighted + // into the active_worst_quality setting. + ambient_qp = (cm->current_video_frame < 5) ? + MIN(rc->avg_frame_qindex[INTER_FRAME], rc->avg_frame_qindex[KEY_FRAME]) : + rc->avg_frame_qindex[INTER_FRAME]; + active_worst_quality = MIN(rc->worst_quality, + ambient_qp * 5 / 4); if (rc->buffer_level > rc->optimal_buffer_level) { // Adjust down. // Maximum limit for down adjustment, ~30%. @@ -610,12 +615,11 @@ static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { if (critical_level) { buff_lvl_step = (rc->optimal_buffer_level - critical_level); if (buff_lvl_step) { - adjustment = - (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) * - (rc->optimal_buffer_level - rc->buffer_level) / - buff_lvl_step); + adjustment = (int)((rc->worst_quality - ambient_qp) * + (rc->optimal_buffer_level - rc->buffer_level) / + buff_lvl_step); } - active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment; + active_worst_quality = ambient_qp + adjustment; } } else { // Set to worst_quality if buffer is below critical level. diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c index 8d3ca0d13..184322f4f 100644 --- a/vp9/encoder/vp9_svc_layercontext.c +++ b/vp9/encoder/vp9_svc_layercontext.c @@ -77,6 +77,7 @@ void vp9_init_layer_context(VP9_COMP *const cpi) { lc->target_bandwidth = oxcf->ts_target_bitrate[layer]; lrc->last_q[INTER_FRAME] = oxcf->worst_allowed_q; lrc->avg_frame_qindex[INTER_FRAME] = oxcf->worst_allowed_q; + lrc->avg_frame_qindex[KEY_FRAME] = oxcf->worst_allowed_q; } else { lc->target_bandwidth = oxcf->ss_target_bitrate[layer]; lrc->last_q[KEY_FRAME] = oxcf->best_allowed_q; |