Merge "Changes to rd balance and multi-arf bug fix."
This commit is contained in:
commit
93960c869e
@ -748,9 +748,6 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf) {
|
|||||||
|
|
||||||
cm->current_video_frame = 0;
|
cm->current_video_frame = 0;
|
||||||
|
|
||||||
// Set reference frame sign bias for ALTREF frame to 1 (for now)
|
|
||||||
cm->ref_frame_sign_bias[ALTREF_FRAME] = 1;
|
|
||||||
|
|
||||||
cpi->gold_is_last = 0;
|
cpi->gold_is_last = 0;
|
||||||
cpi->alt_is_last = 0;
|
cpi->alt_is_last = 0;
|
||||||
cpi->gold_is_alt = 0;
|
cpi->gold_is_alt = 0;
|
||||||
@ -2085,6 +2082,22 @@ static void configure_skippable_frame(VP9_COMP *cpi) {
|
|||||||
twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1);
|
twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_arf_sign_bias(VP9_COMP *cpi) {
|
||||||
|
VP9_COMMON *const cm = &cpi->common;
|
||||||
|
int arf_sign_bias;
|
||||||
|
|
||||||
|
if ((cpi->pass == 2) && cpi->multi_arf_allowed) {
|
||||||
|
const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
||||||
|
arf_sign_bias = cpi->rc.source_alt_ref_active &&
|
||||||
|
(!cpi->refresh_alt_ref_frame ||
|
||||||
|
(gf_group->rf_level[gf_group->index] == GF_ARF_LOW));
|
||||||
|
} else {
|
||||||
|
arf_sign_bias =
|
||||||
|
(cpi->rc.source_alt_ref_active && !cpi->refresh_alt_ref_frame);
|
||||||
|
}
|
||||||
|
cm->ref_frame_sign_bias[ALTREF_FRAME] = arf_sign_bias;
|
||||||
|
}
|
||||||
|
|
||||||
static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||||
size_t *size,
|
size_t *size,
|
||||||
uint8_t *dest,
|
uint8_t *dest,
|
||||||
@ -2117,8 +2130,8 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
|||||||
cpi->zbin_mode_boost = 0;
|
cpi->zbin_mode_boost = 0;
|
||||||
cpi->zbin_mode_boost_enabled = 0;
|
cpi->zbin_mode_boost_enabled = 0;
|
||||||
|
|
||||||
// Current default encoder behavior for the altref sign bias.
|
// Set the arf sign bias for this frame.
|
||||||
cm->ref_frame_sign_bias[ALTREF_FRAME] = cpi->rc.source_alt_ref_active;
|
set_arf_sign_bias(cpi);
|
||||||
|
|
||||||
// Set default state for segment based loop filter update flags.
|
// Set default state for segment based loop filter update flags.
|
||||||
cm->lf.mode_ref_delta_update = 0;
|
cm->lf.mode_ref_delta_update = 0;
|
||||||
|
@ -2206,14 +2206,6 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
|
|||||||
cpi->refresh_golden_frame = 1;
|
cpi->refresh_golden_frame = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
FIRSTPASS_STATS next_frame;
|
|
||||||
if (lookup_next_frame_stats(twopass, &next_frame) != EOF) {
|
|
||||||
twopass->next_iiratio = (int)(next_frame.intra_error /
|
|
||||||
DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_buffer_updates(cpi);
|
configure_buffer_updates(cpi);
|
||||||
|
|
||||||
target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index];
|
target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index];
|
||||||
|
@ -69,7 +69,6 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int section_intra_rating;
|
unsigned int section_intra_rating;
|
||||||
unsigned int next_iiratio;
|
|
||||||
FIRSTPASS_STATS total_stats;
|
FIRSTPASS_STATS total_stats;
|
||||||
FIRSTPASS_STATS this_frame_stats;
|
FIRSTPASS_STATS this_frame_stats;
|
||||||
const FIRSTPASS_STATS *stats_in;
|
const FIRSTPASS_STATS *stats_in;
|
||||||
|
@ -92,13 +92,6 @@ static void fill_token_costs(vp9_coeff_cost *c,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint8_t rd_iifactor[32] = {
|
|
||||||
4, 4, 3, 2, 1, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Values are now correlated to quantizer.
|
// Values are now correlated to quantizer.
|
||||||
static int sad_per_bit16lut[QINDEX_RANGE];
|
static int sad_per_bit16lut[QINDEX_RANGE];
|
||||||
static int sad_per_bit4lut[QINDEX_RANGE];
|
static int sad_per_bit4lut[QINDEX_RANGE];
|
||||||
@ -116,15 +109,25 @@ void vp9_init_me_luts() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const int rd_boost_factor[16] = {
|
||||||
|
64, 32, 32, 32, 24, 16, 12, 12,
|
||||||
|
8, 8, 4, 4, 2, 2, 1, 0
|
||||||
|
};
|
||||||
|
static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = {
|
||||||
|
128, 144, 128, 128, 144
|
||||||
|
};
|
||||||
|
|
||||||
int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) {
|
int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) {
|
||||||
const int q = vp9_dc_quant(qindex, 0);
|
const int q = vp9_dc_quant(qindex, 0);
|
||||||
// TODO(debargha): Adjust the function below.
|
int rdmult = 88 * q * q / 24;
|
||||||
int rdmult = 88 * q * q / 25;
|
|
||||||
if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) {
|
if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) {
|
||||||
if (cpi->twopass.next_iiratio > 31)
|
const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
||||||
rdmult += (rdmult * rd_iifactor[31]) >> 4;
|
const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index];
|
||||||
else
|
const int boost_index = MIN(15, (cpi->rc.gfu_boost / 100));
|
||||||
rdmult += (rdmult * rd_iifactor[cpi->twopass.next_iiratio]) >> 4;
|
|
||||||
|
rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7;
|
||||||
|
rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
|
||||||
}
|
}
|
||||||
return rdmult;
|
return rdmult;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user