Index: source/libvpx/vp9/encoder/vp9_ratectrl.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_ratectrl.c (revision 284462) |
+++ source/libvpx/vp9/encoder/vp9_ratectrl.c (working copy) |
@@ -424,6 +424,16 @@ |
} |
} |
+static int get_kf_active_quality(const RATE_CONTROL *const rc, int q) { |
+ return get_active_quality(q, rc->kf_boost, kf_low, kf_high, |
+ kf_low_motion_minq, kf_high_motion_minq); |
+} |
+ |
+static int get_gf_active_quality(const RATE_CONTROL *const rc, int q) { |
+ return get_active_quality(q, rc->gfu_boost, gf_low, gf_high, |
+ arfgf_low_motion_minq, arfgf_high_motion_minq); |
+} |
+ |
static int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) { |
const RATE_CONTROL *const rc = &cpi->rc; |
const unsigned int curr_frame = cpi->common.current_video_frame; |
@@ -523,11 +533,8 @@ |
double q_adj_factor = 1.0; |
double q_val; |
- active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME], |
- rc->kf_boost, |
- kf_low, kf_high, |
- kf_low_motion_minq, |
- kf_high_motion_minq); |
+ active_best_quality = |
+ get_kf_active_quality(rc, rc->avg_frame_qindex[KEY_FRAME]); |
// Allow somewhat lower kf minq with small image formats. |
if ((cm->width * cm->height) <= (352 * 288)) { |
@@ -552,9 +559,7 @@ |
} else { |
q = active_worst_quality; |
} |
- active_best_quality = get_active_quality( |
- q, rc->gfu_boost, gf_low, gf_high, |
- arfgf_low_motion_minq, arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
} else { |
// Use the lower of active_worst_quality and recent/average Q. |
if (cm->current_video_frame > 1) { |
@@ -657,11 +662,8 @@ |
double q_adj_factor = 1.0; |
double q_val; |
- active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME], |
- rc->kf_boost, |
- kf_low, kf_high, |
- kf_low_motion_minq, |
- kf_high_motion_minq); |
+ active_best_quality = |
+ get_kf_active_quality(rc, rc->avg_frame_qindex[KEY_FRAME]); |
// Allow somewhat lower kf minq with small image formats. |
if ((cm->width * cm->height) <= (352 * 288)) { |
@@ -690,10 +692,7 @@ |
if (q < cq_level) |
q = cq_level; |
- active_best_quality = get_active_quality(q, rc->gfu_boost, |
- gf_low, gf_high, |
- arfgf_low_motion_minq, |
- arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
// Constrained quality use slightly lower active best. |
active_best_quality = active_best_quality * 15 / 16; |
@@ -702,14 +701,10 @@ |
if (!cpi->refresh_alt_ref_frame) { |
active_best_quality = cq_level; |
} else { |
- active_best_quality = get_active_quality( |
- q, rc->gfu_boost, gf_low, gf_high, |
- arfgf_low_motion_minq, arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
} |
} else { |
- active_best_quality = get_active_quality( |
- q, rc->gfu_boost, gf_low, gf_high, |
- arfgf_low_motion_minq, arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
} |
} else { |
if (oxcf->rc_mode == VPX_Q) { |
@@ -810,11 +805,7 @@ |
double q_adj_factor = 1.0; |
double q_val; |
// Baseline value derived from cpi->active_worst_quality and kf boost. |
- active_best_quality = get_active_quality(active_worst_quality, |
- rc->kf_boost, |
- kf_low, kf_high, |
- kf_low_motion_minq, |
- kf_high_motion_minq); |
+ active_best_quality = get_kf_active_quality(rc, active_worst_quality); |
// Allow somewhat lower kf minq with small image formats. |
if ((cm->width * cm->height) <= (352 * 288)) { |
@@ -846,10 +837,7 @@ |
if (q < cq_level) |
q = cq_level; |
- active_best_quality = get_active_quality(q, rc->gfu_boost, |
- gf_low, gf_high, |
- arfgf_low_motion_minq, |
- arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
// Constrained quality use slightly lower active best. |
active_best_quality = active_best_quality * 15 / 16; |
@@ -858,14 +846,10 @@ |
if (!cpi->refresh_alt_ref_frame) { |
active_best_quality = cq_level; |
} else { |
- active_best_quality = get_active_quality( |
- q, rc->gfu_boost, gf_low, gf_high, |
- arfgf_low_motion_minq, arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
} |
} else { |
- active_best_quality = get_active_quality( |
- q, rc->gfu_boost, gf_low, gf_high, |
- arfgf_low_motion_minq, arfgf_high_motion_minq); |
+ active_best_quality = get_gf_active_quality(rc, q); |
} |
} else { |
if (oxcf->rc_mode == VPX_Q) { |
@@ -1097,7 +1081,7 @@ |
rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits; |
- if (is_altref_enabled(oxcf) && cpi->refresh_alt_ref_frame && |
+ 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); |
@@ -1349,8 +1333,9 @@ |
return target_index - qindex; |
} |
-void vp9_rc_set_gf_max_interval(const VP9EncoderConfig *const oxcf, |
+void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, |
RATE_CONTROL *const rc) { |
+ const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
// Set Maximum gf/arf interval |
rc->max_gf_interval = 16; |
@@ -1359,7 +1344,7 @@ |
if (rc->static_scene_max_gf_interval > (MAX_LAG_BUFFERS * 2)) |
rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2; |
- if (is_altref_enabled(oxcf)) { |
+ if (is_altref_enabled(cpi)) { |
if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1) |
rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1; |
} |
@@ -1392,5 +1377,5 @@ |
rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), |
vbr_max_bits); |
- vp9_rc_set_gf_max_interval(oxcf, rc); |
+ vp9_rc_set_gf_max_interval(cpi, rc); |
} |