Fixed interval, fixed Q 1 pass test patch.
For testing implemented a fixed pattern and delta, 1 pass, fixed Q, low delay mode. This has not in any way been tuned or optimized. Change-Id: Idf5ee179b277fa15d07a97f14f2ce5bbaae80a04
This commit is contained in:
parent
cea5e1c1e3
commit
fc50d95b2e
@ -1478,7 +1478,11 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
|
||||
cpi->td.mb.e_mbd.bd = (int)cm->bit_depth;
|
||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||
|
||||
rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
|
||||
if ((oxcf->pass == 0) && (oxcf->rc_mode == VPX_Q)) {
|
||||
rc->baseline_gf_interval = FIXED_GF_INTERVAL;
|
||||
} else {
|
||||
rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
|
||||
}
|
||||
|
||||
cpi->refresh_golden_frame = 0;
|
||||
cpi->refresh_last_frame = 1;
|
||||
|
@ -833,10 +833,16 @@ static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi,
|
||||
ASSIGN_MINQ_TABLE(cm->bit_depth, inter_minq);
|
||||
|
||||
if (frame_is_intra_only(cm)) {
|
||||
// Handle the special case for key frames forced when we have reached
|
||||
// the maximum key frame interval. Here force the Q to a range
|
||||
// based on the ambient Q to reduce the risk of popping.
|
||||
if (rc->this_key_frame_forced) {
|
||||
if (oxcf->rc_mode == VPX_Q) {
|
||||
int qindex = cq_level;
|
||||
double q = vp9_convert_qindex_to_q(qindex, cm->bit_depth);
|
||||
int delta_qindex = vp9_compute_qdelta(rc, q, q * 0.25,
|
||||
cm->bit_depth);
|
||||
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
|
||||
} else if (rc->this_key_frame_forced) {
|
||||
// Handle the special case for key frames forced when we have reached
|
||||
// the maximum key frame interval. Here force the Q to a range
|
||||
// based on the ambient Q to reduce the risk of popping.
|
||||
int qindex = rc->last_boosted_qindex;
|
||||
double last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth);
|
||||
int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q,
|
||||
@ -886,17 +892,28 @@ static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi,
|
||||
active_best_quality = active_best_quality * 15 / 16;
|
||||
|
||||
} else if (oxcf->rc_mode == VPX_Q) {
|
||||
if (!cpi->refresh_alt_ref_frame) {
|
||||
active_best_quality = cq_level;
|
||||
} else {
|
||||
active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth);
|
||||
}
|
||||
int qindex = cq_level;
|
||||
double q = vp9_convert_qindex_to_q(qindex, cm->bit_depth);
|
||||
int delta_qindex;
|
||||
if (cpi->refresh_alt_ref_frame)
|
||||
delta_qindex = vp9_compute_qdelta(rc, q, q * 0.40, cm->bit_depth);
|
||||
else
|
||||
delta_qindex = vp9_compute_qdelta(rc, q, q * 0.50, cm->bit_depth);
|
||||
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
|
||||
} else {
|
||||
active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth);
|
||||
}
|
||||
} else {
|
||||
if (oxcf->rc_mode == VPX_Q) {
|
||||
active_best_quality = cq_level;
|
||||
int qindex = cq_level;
|
||||
double q = vp9_convert_qindex_to_q(qindex, cm->bit_depth);
|
||||
double delta_rate[FIXED_GF_INTERVAL] =
|
||||
{0.50, 1.0, 0.85, 1.0, 0.70, 1.0, 0.85, 1.0};
|
||||
int delta_qindex =
|
||||
vp9_compute_qdelta(rc, q,
|
||||
q * delta_rate[cm->current_video_frame %
|
||||
FIXED_GF_INTERVAL], cm->bit_depth);
|
||||
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
|
||||
} else {
|
||||
// Use the lower of active_worst_quality and recent/average Q.
|
||||
if (cm->current_video_frame > 1)
|
||||
@ -1722,29 +1739,36 @@ void vp9_rc_set_gf_interval_range(const VP9_COMP *const cpi,
|
||||
RATE_CONTROL *const rc) {
|
||||
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
|
||||
|
||||
// Set Maximum gf/arf interval
|
||||
rc->max_gf_interval = oxcf->max_gf_interval;
|
||||
rc->min_gf_interval = oxcf->min_gf_interval;
|
||||
if (rc->min_gf_interval == 0)
|
||||
rc->min_gf_interval = vp9_rc_get_default_min_gf_interval(
|
||||
oxcf->width, oxcf->height, cpi->framerate);
|
||||
if (rc->max_gf_interval == 0)
|
||||
rc->max_gf_interval = vp9_rc_get_default_max_gf_interval(
|
||||
cpi->framerate, rc->min_gf_interval);
|
||||
// Special case code for 1 pass fixed Q mode tests
|
||||
if ((oxcf->pass == 0) && (oxcf->rc_mode == VPX_Q)) {
|
||||
rc->max_gf_interval = FIXED_GF_INTERVAL;
|
||||
rc->min_gf_interval = FIXED_GF_INTERVAL;
|
||||
rc->static_scene_max_gf_interval = FIXED_GF_INTERVAL;
|
||||
} else {
|
||||
// Set Maximum gf/arf interval
|
||||
rc->max_gf_interval = oxcf->max_gf_interval;
|
||||
rc->min_gf_interval = oxcf->min_gf_interval;
|
||||
if (rc->min_gf_interval == 0)
|
||||
rc->min_gf_interval = vp9_rc_get_default_min_gf_interval(
|
||||
oxcf->width, oxcf->height, cpi->framerate);
|
||||
if (rc->max_gf_interval == 0)
|
||||
rc->max_gf_interval = vp9_rc_get_default_max_gf_interval(
|
||||
cpi->framerate, rc->min_gf_interval);
|
||||
|
||||
// Extended interval for genuinely static scenes
|
||||
rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2;
|
||||
// Extended interval for genuinely static scenes
|
||||
rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2;
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
|
||||
rc->max_gf_interval = rc->static_scene_max_gf_interval;
|
||||
|
||||
// Clamp min to max
|
||||
rc->min_gf_interval = VPXMIN(rc->min_gf_interval, rc->max_gf_interval);
|
||||
}
|
||||
|
||||
if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
|
||||
rc->max_gf_interval = rc->static_scene_max_gf_interval;
|
||||
|
||||
// Clamp min to max
|
||||
rc->min_gf_interval = VPXMIN(rc->min_gf_interval, rc->max_gf_interval);
|
||||
}
|
||||
|
||||
void vp9_rc_update_framerate(VP9_COMP *cpi) {
|
||||
|
@ -26,6 +26,7 @@ extern "C" {
|
||||
|
||||
#define MIN_GF_INTERVAL 4
|
||||
#define MAX_GF_INTERVAL 16
|
||||
#define FIXED_GF_INTERVAL 8 // Used in some testing modes only
|
||||
#define ONEHALFONLY_RESIZE 0
|
||||
|
||||
typedef enum {
|
||||
|
Loading…
x
Reference in New Issue
Block a user