Merge "Rate control changes on active_worst_quality"
This commit is contained in:
commit
9a005c994c
@ -1460,7 +1460,7 @@ static void compute_fast_motion_search_level(VP9_COMP *cpi, BLOCK_SIZE bsize) {
|
||||
// int use_8x8 = (MIN(cpi->common.width, cpi->common.height) < 720) ? 1 : 0;
|
||||
int use_8x8 = 1;
|
||||
|
||||
if (cm->frame_type && !cpi->is_src_frame_alt_ref &&
|
||||
if (cm->frame_type && !cpi->rc.is_src_frame_alt_ref &&
|
||||
((use_8x8 && bsize == BLOCK_16X16) ||
|
||||
bsize == BLOCK_32X32 || bsize == BLOCK_64X64)) {
|
||||
int ref0 = 0, ref1 = 0, ref2 = 0, ref3 = 0;
|
||||
@ -1949,7 +1949,7 @@ static void encode_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|| cm->prev_mi == 0
|
||||
|| cpi->common.show_frame == 0
|
||||
|| cpi->common.frame_type == KEY_FRAME
|
||||
|| cpi->is_src_frame_alt_ref
|
||||
|| cpi->rc.is_src_frame_alt_ref
|
||||
|| ((cpi->sf.use_lastframe_partitioning ==
|
||||
LAST_FRAME_PARTITION_LOW_MOTION) &&
|
||||
sb_has_motion(cpi, prev_mi_8x8))) {
|
||||
@ -2279,7 +2279,7 @@ static int get_frame_type(VP9_COMP *cpi) {
|
||||
int frame_type;
|
||||
if (frame_is_intra_only(&cpi->common))
|
||||
frame_type = 0;
|
||||
else if (cpi->is_src_frame_alt_ref && cpi->refresh_golden_frame)
|
||||
else if (cpi->rc.is_src_frame_alt_ref && cpi->refresh_golden_frame)
|
||||
frame_type = 3;
|
||||
else if (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)
|
||||
frame_type = 1;
|
||||
|
@ -1514,6 +1514,8 @@ void define_fixed_arf_period(VP9_COMP *cpi) {
|
||||
cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number];
|
||||
assert(cpi->this_frame_weight >= 0);
|
||||
|
||||
cpi->twopass.gf_zeromotion_pct = 0;
|
||||
|
||||
// Initialize frame coding order variables.
|
||||
cpi->new_frame_coding_order_period = 0;
|
||||
cpi->next_frame_in_order = 0;
|
||||
@ -1522,14 +1524,14 @@ void define_fixed_arf_period(VP9_COMP *cpi) {
|
||||
vp9_zero(cpi->arf_buffer_idx);
|
||||
vpx_memset(cpi->arf_weight, -1, sizeof(cpi->arf_weight));
|
||||
|
||||
if (cpi->twopass.frames_to_key <= (FIXED_ARF_GROUP_SIZE + 8)) {
|
||||
if (cpi->rc.frames_to_key <= (FIXED_ARF_GROUP_SIZE + 8)) {
|
||||
// Setup a GF group close to the keyframe.
|
||||
cpi->source_alt_ref_pending = 0;
|
||||
cpi->rc.baseline_gf_interval = cpi->twopass.frames_to_key;
|
||||
cpi->rc.source_alt_ref_pending = 0;
|
||||
cpi->rc.baseline_gf_interval = cpi->rc.frames_to_key;
|
||||
schedule_frames(cpi, 0, (cpi->rc.baseline_gf_interval - 1), 2, 0, 0);
|
||||
} else {
|
||||
// Setup a fixed period ARF group.
|
||||
cpi->source_alt_ref_pending = 1;
|
||||
cpi->rc.source_alt_ref_pending = 1;
|
||||
cpi->rc.baseline_gf_interval = FIXED_ARF_GROUP_SIZE;
|
||||
schedule_frames(cpi, 0, -(cpi->rc.baseline_gf_interval - 1), 2, 1, 0);
|
||||
}
|
||||
@ -1627,16 +1629,17 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// bits to spare and are better with a smaller interval and smaller boost.
|
||||
// At high Q when there are few bits to spare we are better with a longer
|
||||
// interval to spread the cost of the GF.
|
||||
//
|
||||
active_max_gf_interval =
|
||||
12 + ((int)vp9_convert_qindex_to_q(cpi->rc.active_worst_quality) >> 5);
|
||||
11 + ((int)vp9_convert_qindex_to_q(cpi->rc.last_q[INTER_FRAME]) >> 5);
|
||||
|
||||
if (active_max_gf_interval > cpi->rc.max_gf_interval)
|
||||
active_max_gf_interval = cpi->rc.max_gf_interval;
|
||||
|
||||
i = 0;
|
||||
while (((i < cpi->twopass.static_scene_max_gf_interval) ||
|
||||
((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) &&
|
||||
(i < cpi->twopass.frames_to_key)) {
|
||||
((cpi->rc.frames_to_key - i) < MIN_GF_INTERVAL)) &&
|
||||
(i < cpi->rc.frames_to_key)) {
|
||||
i++; // Increment the loop counter
|
||||
|
||||
// Accumulate error score of frames in this gf group
|
||||
@ -1691,7 +1694,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// Don't break out with a very short interval
|
||||
(i > MIN_GF_INTERVAL) &&
|
||||
// Don't break out very close to a key frame
|
||||
((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
|
||||
((cpi->rc.frames_to_key - i) >= MIN_GF_INTERVAL) &&
|
||||
((boost_score > 125.0) || (next_frame.pcnt_inter < 0.75)) &&
|
||||
(!flash_detected) &&
|
||||
((mv_ratio_accumulator > mv_ratio_accumulator_thresh) ||
|
||||
@ -1707,17 +1710,17 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
old_boost_score = boost_score;
|
||||
}
|
||||
|
||||
cpi->gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0);
|
||||
cpi->twopass.gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0);
|
||||
|
||||
// Don't allow a gf too near the next kf
|
||||
if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL) {
|
||||
while (i < cpi->twopass.frames_to_key) {
|
||||
if ((cpi->rc.frames_to_key - i) < MIN_GF_INTERVAL) {
|
||||
while (i < cpi->rc.frames_to_key) {
|
||||
i++;
|
||||
|
||||
if (EOF == input_stats(cpi, this_frame))
|
||||
break;
|
||||
|
||||
if (i < cpi->twopass.frames_to_key) {
|
||||
if (i < cpi->rc.frames_to_key) {
|
||||
mod_frame_err = calculate_modified_err(cpi, this_frame);
|
||||
gf_group_err += mod_frame_err;
|
||||
}
|
||||
@ -1744,7 +1747,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
(i < cpi->oxcf.lag_in_frames) &&
|
||||
(i >= MIN_GF_INTERVAL) &&
|
||||
// dont use ARF very near next kf
|
||||
(i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
|
||||
(i <= (cpi->rc.frames_to_key - MIN_GF_INTERVAL)) &&
|
||||
((next_frame.pcnt_inter > 0.75) ||
|
||||
(next_frame.pcnt_second_ref > 0.5)) &&
|
||||
((mv_in_out_accumulator / (double)i > -0.2) ||
|
||||
@ -1753,7 +1756,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// Alternative boost calculation for alt ref
|
||||
cpi->rc.gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost,
|
||||
&b_boost);
|
||||
cpi->source_alt_ref_pending = 1;
|
||||
cpi->rc.source_alt_ref_pending = 1;
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
// Set the ARF schedule.
|
||||
@ -1763,7 +1766,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
#endif
|
||||
} else {
|
||||
cpi->rc.gfu_boost = (int)boost_score;
|
||||
cpi->source_alt_ref_pending = 0;
|
||||
cpi->rc.source_alt_ref_pending = 0;
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
// Set the GF schedule.
|
||||
if (cpi->multi_arf_enabled) {
|
||||
@ -1818,7 +1821,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left.
|
||||
// This is also important for short clips where there may only be one
|
||||
// key frame.
|
||||
if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count -
|
||||
if (cpi->rc.frames_to_key >= (int)(cpi->twopass.total_stats.count -
|
||||
cpi->common.current_video_frame)) {
|
||||
cpi->twopass.kf_group_bits =
|
||||
(cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0;
|
||||
@ -1854,7 +1857,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
|
||||
// Assign bits to the arf or gf.
|
||||
for (i = 0;
|
||||
i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME);
|
||||
i <= (cpi->rc.source_alt_ref_pending &&
|
||||
cpi->common.frame_type != KEY_FRAME);
|
||||
++i) {
|
||||
int allocation_chunks;
|
||||
int q = cpi->rc.last_q[INTER_FRAME];
|
||||
@ -1865,7 +1869,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// Set max and minimum boost and hence minimum allocation
|
||||
boost = clamp(boost, 125, (cpi->rc.baseline_gf_interval + 1) * 200);
|
||||
|
||||
if (cpi->source_alt_ref_pending && i == 0)
|
||||
if (cpi->rc.source_alt_ref_pending && i == 0)
|
||||
allocation_chunks = ((cpi->rc.baseline_gf_interval + 1) * 100) + boost;
|
||||
else
|
||||
allocation_chunks = (cpi->rc.baseline_gf_interval * 100) + (boost - 100);
|
||||
@ -1918,7 +1922,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
if (i == 0) {
|
||||
cpi->twopass.gf_bits = gf_bits;
|
||||
}
|
||||
if (i == 1 || (!cpi->source_alt_ref_pending
|
||||
if (i == 1 || (!cpi->rc.source_alt_ref_pending
|
||||
&& (cpi->common.frame_type != KEY_FRAME))) {
|
||||
// Per frame bit target for this frame
|
||||
cpi->rc.per_frame_bandwidth = gf_bits;
|
||||
@ -1937,7 +1941,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// For normal GFs we want to remove the error score for the first frame
|
||||
// of the group (except in Key frame case where this has already
|
||||
// happened)
|
||||
if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
|
||||
if (!cpi->rc.source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
|
||||
cpi->twopass.gf_group_error_left = (int64_t)(gf_group_err
|
||||
- gf_first_frame_err);
|
||||
else
|
||||
@ -1953,7 +1957,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// despite (MIN_GF_INTERVAL) and would cause a divide by 0 in the
|
||||
// calculation of alt_extra_bits.
|
||||
if (cpi->rc.baseline_gf_interval >= 3) {
|
||||
const int boost = cpi->source_alt_ref_pending ?
|
||||
const int boost = cpi->rc.source_alt_ref_pending ?
|
||||
b_boost : cpi->rc.gfu_boost;
|
||||
|
||||
if (boost >= 150) {
|
||||
@ -2095,7 +2099,7 @@ void vp9_second_pass(VP9_COMP *cpi) {
|
||||
// estimate for the clip is bad, but helps prevent excessive
|
||||
// variation in Q, especially near the end of a clip
|
||||
// where for example a small overspend may cause Q to crash
|
||||
adjust_maxq_qrange(cpi);
|
||||
// adjust_maxq_qrange(cpi);
|
||||
}
|
||||
vp9_zero(this_frame);
|
||||
if (EOF == input_stats(cpi, &this_frame))
|
||||
@ -2105,7 +2109,7 @@ void vp9_second_pass(VP9_COMP *cpi) {
|
||||
this_frame_coded_error = this_frame.coded_error;
|
||||
|
||||
// keyframe and section processing !
|
||||
if (cpi->twopass.frames_to_key == 0) {
|
||||
if (cpi->rc.frames_to_key == 0) {
|
||||
// Define next KF group and assign bits to it
|
||||
this_frame_copy = this_frame;
|
||||
find_next_key_frame(cpi, &this_frame_copy);
|
||||
@ -2116,8 +2120,6 @@ void vp9_second_pass(VP9_COMP *cpi) {
|
||||
// Define next gf group and assign bits to it
|
||||
this_frame_copy = this_frame;
|
||||
|
||||
cpi->gf_zeromotion_pct = 0;
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
if (cpi->multi_arf_enabled) {
|
||||
define_fixed_arf_period(cpi);
|
||||
@ -2128,7 +2130,7 @@ void vp9_second_pass(VP9_COMP *cpi) {
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cpi->gf_zeromotion_pct > 995) {
|
||||
if (cpi->twopass.gf_zeromotion_pct > 995) {
|
||||
// As long as max_thresh for encode breakout is small enough, it is ok
|
||||
// to enable it for no-show frame, i.e. set enable_encode_breakout to 2.
|
||||
if (!cpi->common.show_frame)
|
||||
@ -2143,7 +2145,8 @@ void vp9_second_pass(VP9_COMP *cpi) {
|
||||
// from that arf boost and it should not be given extra bits
|
||||
// If the previous group was NOT coded using arf we may want to apply
|
||||
// some boost to this GF as well
|
||||
if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)) {
|
||||
if (cpi->rc.source_alt_ref_pending &&
|
||||
cpi->common.frame_type != KEY_FRAME) {
|
||||
// Assign a standard frames worth of bits from those allocated
|
||||
// to the GF group
|
||||
int bak = cpi->rc.per_frame_bandwidth;
|
||||
@ -2175,7 +2178,7 @@ void vp9_second_pass(VP9_COMP *cpi) {
|
||||
if (cpi->target_bandwidth < 0)
|
||||
cpi->target_bandwidth = 0;
|
||||
|
||||
cpi->twopass.frames_to_key--;
|
||||
cpi->rc.frames_to_key--;
|
||||
|
||||
// Update the total stats remaining structure
|
||||
subtract_stats(&cpi->twopass.total_left_stats, &this_frame);
|
||||
@ -2271,6 +2274,7 @@ static int test_candidate_kf(VP9_COMP *cpi,
|
||||
|
||||
return is_viable_kf;
|
||||
}
|
||||
|
||||
static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
int i, j;
|
||||
FIRSTPASS_STATS last_frame;
|
||||
@ -2297,15 +2301,15 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
cpi->common.frame_type = KEY_FRAME;
|
||||
|
||||
// is this a forced key frame by interval
|
||||
cpi->this_key_frame_forced = cpi->next_key_frame_forced;
|
||||
cpi->rc.this_key_frame_forced = cpi->rc.next_key_frame_forced;
|
||||
|
||||
// Clear the alt ref active flag as this can never be active on a key frame
|
||||
cpi->source_alt_ref_active = 0;
|
||||
cpi->rc.source_alt_ref_active = 0;
|
||||
|
||||
// Kf is always a gf so clear frames till next gf counter
|
||||
cpi->rc.frames_till_gf_update_due = 0;
|
||||
|
||||
cpi->twopass.frames_to_key = 1;
|
||||
cpi->rc.frames_to_key = 1;
|
||||
|
||||
// Take a copy of the initial frame details
|
||||
first_frame = *this_frame;
|
||||
@ -2357,14 +2361,14 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
break;
|
||||
|
||||
// Step on to the next frame
|
||||
cpi->twopass.frames_to_key++;
|
||||
cpi->rc.frames_to_key++;
|
||||
|
||||
// If we don't have a real key frame within the next two
|
||||
// forcekeyframeevery intervals then break out of the loop.
|
||||
if (cpi->twopass.frames_to_key >= 2 * (int)cpi->key_frame_frequency)
|
||||
if (cpi->rc.frames_to_key >= 2 * (int)cpi->key_frame_frequency)
|
||||
break;
|
||||
} else {
|
||||
cpi->twopass.frames_to_key++;
|
||||
cpi->rc.frames_to_key++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
@ -2374,11 +2378,11 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// This code centers the extra kf if the actual natural
|
||||
// interval is between 1x and 2x
|
||||
if (cpi->oxcf.auto_key
|
||||
&& cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency) {
|
||||
&& cpi->rc.frames_to_key > (int)cpi->key_frame_frequency) {
|
||||
FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in;
|
||||
FIRSTPASS_STATS tmp_frame;
|
||||
|
||||
cpi->twopass.frames_to_key /= 2;
|
||||
cpi->rc.frames_to_key /= 2;
|
||||
|
||||
// Copy first frame details
|
||||
tmp_frame = first_frame;
|
||||
@ -2391,7 +2395,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
kf_group_coded_err = 0;
|
||||
|
||||
// Rescan to get the correct error data for the forced kf group
|
||||
for (i = 0; i < cpi->twopass.frames_to_key; i++) {
|
||||
for (i = 0; i < cpi->rc.frames_to_key; i++) {
|
||||
// Accumulate kf group errors
|
||||
kf_group_err += calculate_modified_err(cpi, &tmp_frame);
|
||||
kf_group_intra_err += tmp_frame.intra_error;
|
||||
@ -2404,9 +2408,9 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// Reset to the start of the group
|
||||
reset_fpf_position(cpi, current_pos);
|
||||
|
||||
cpi->next_key_frame_forced = 1;
|
||||
cpi->rc.next_key_frame_forced = 1;
|
||||
} else {
|
||||
cpi->next_key_frame_forced = 0;
|
||||
cpi->rc.next_key_frame_forced = 0;
|
||||
}
|
||||
// Special case for the last frame of the file
|
||||
if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) {
|
||||
@ -2436,7 +2440,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
cpi->twopass.modified_error_left));
|
||||
|
||||
// Clip based on maximum per frame rate defined by the user.
|
||||
max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key;
|
||||
max_grp_bits = (int64_t)max_bits * (int64_t)cpi->rc.frames_to_key;
|
||||
if (cpi->twopass.kf_group_bits > max_grp_bits)
|
||||
cpi->twopass.kf_group_bits = max_grp_bits;
|
||||
} else {
|
||||
@ -2452,7 +2456,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
loop_decay_rate = 1.00; // Starting decay rate
|
||||
|
||||
// Scan through the kf group collating various stats.
|
||||
for (i = 0; i < cpi->twopass.frames_to_key; i++) {
|
||||
for (i = 0; i < cpi->rc.frames_to_key; i++) {
|
||||
double r;
|
||||
|
||||
if (EOF == input_stats(cpi, &next_frame))
|
||||
@ -2495,7 +2499,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
zero_stats(§ionstats);
|
||||
reset_fpf_position(cpi, start_position);
|
||||
|
||||
for (i = 0; i < cpi->twopass.frames_to_key; i++) {
|
||||
for (i = 0; i < cpi->rc.frames_to_key; i++) {
|
||||
input_stats(cpi, &next_frame);
|
||||
accumulate_stats(§ionstats, &next_frame);
|
||||
}
|
||||
@ -2516,8 +2520,8 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
int allocation_chunks;
|
||||
int alt_kf_bits;
|
||||
|
||||
if (kf_boost < (cpi->twopass.frames_to_key * 3))
|
||||
kf_boost = (cpi->twopass.frames_to_key * 3);
|
||||
if (kf_boost < (cpi->rc.frames_to_key * 3))
|
||||
kf_boost = (cpi->rc.frames_to_key * 3);
|
||||
|
||||
if (kf_boost < 300) // Min KF boost
|
||||
kf_boost = 300;
|
||||
@ -2525,7 +2529,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// Make a note of baseline boost and the zero motion
|
||||
// accumulator value for use elsewhere.
|
||||
cpi->rc.kf_boost = kf_boost;
|
||||
cpi->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0);
|
||||
cpi->twopass.kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0);
|
||||
|
||||
// We do three calculations for kf size.
|
||||
// The first is based on the error score for the whole kf group.
|
||||
@ -2537,14 +2541,14 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// Special case if the sequence appears almost totaly static
|
||||
// In this case we want to spend almost all of the bits on the
|
||||
// key frame.
|
||||
// cpi->twopass.frames_to_key-1 because key frame itself is taken
|
||||
// cpi->rc.frames_to_key-1 because key frame itself is taken
|
||||
// care of by kf_boost.
|
||||
if (zero_motion_accumulator >= 0.99) {
|
||||
allocation_chunks =
|
||||
((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;
|
||||
((cpi->rc.frames_to_key - 1) * 10) + kf_boost;
|
||||
} else {
|
||||
allocation_chunks =
|
||||
((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
|
||||
((cpi->rc.frames_to_key - 1) * 100) + kf_boost;
|
||||
}
|
||||
|
||||
// Prevent overflow
|
||||
@ -2566,10 +2570,10 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
// kf group (which does sometimes happen... eg a blank intro frame)
|
||||
// Then use an alternate calculation based on the kf error score
|
||||
// which should give a smaller key frame.
|
||||
if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key) {
|
||||
if (kf_mod_err < kf_group_err / cpi->rc.frames_to_key) {
|
||||
double alt_kf_grp_bits =
|
||||
((double)cpi->twopass.bits_left *
|
||||
(kf_mod_err * (double)cpi->twopass.frames_to_key) /
|
||||
(kf_mod_err * (double)cpi->rc.frames_to_key) /
|
||||
DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left));
|
||||
|
||||
alt_kf_bits = (int)((double)kf_boost *
|
||||
|
@ -399,8 +399,7 @@ void vp9_update_mbgraph_stats(VP9_COMP *cpi) {
|
||||
// being a GF - so exit if we don't look ahead beyond that
|
||||
if (n_frames <= cpi->rc.frames_till_gf_update_due)
|
||||
return;
|
||||
if (n_frames > (int)cpi->frames_till_alt_ref_frame)
|
||||
n_frames = cpi->frames_till_alt_ref_frame;
|
||||
|
||||
if (n_frames > MAX_LAG_BUFFERS)
|
||||
n_frames = MAX_LAG_BUFFERS;
|
||||
|
||||
|
@ -302,7 +302,7 @@ static void setup_in_frame_q_adj(VP9_COMP *cpi) {
|
||||
|
||||
if (cm->frame_type == KEY_FRAME ||
|
||||
cpi->refresh_alt_ref_frame ||
|
||||
(cpi->refresh_golden_frame && !cpi->is_src_frame_alt_ref)) {
|
||||
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
|
||||
// Clear down the segment map
|
||||
vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
|
||||
|
||||
@ -389,7 +389,7 @@ static void configure_static_seg_features(VP9_COMP *cpi) {
|
||||
// First normal frame in a valid gf or alt ref group
|
||||
if (cpi->rc.frames_since_golden == 0) {
|
||||
// Set up segment features for normal frames in an arf group
|
||||
if (cpi->source_alt_ref_active) {
|
||||
if (cpi->rc.source_alt_ref_active) {
|
||||
seg->update_map = 0;
|
||||
seg->update_data = 1;
|
||||
seg->abs_delta = SEGMENT_DELTADATA;
|
||||
@ -421,7 +421,7 @@ static void configure_static_seg_features(VP9_COMP *cpi) {
|
||||
|
||||
vp9_clearall_segfeatures(seg);
|
||||
}
|
||||
} else if (cpi->is_src_frame_alt_ref) {
|
||||
} else if (cpi->rc.is_src_frame_alt_ref) {
|
||||
// Special case where we are coding over the top of a previous
|
||||
// alt ref frame.
|
||||
// Segment coding disabled for compred testing
|
||||
@ -1048,6 +1048,7 @@ int vp9_reverse_trans(int x) {
|
||||
|
||||
return 63;
|
||||
};
|
||||
|
||||
void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
|
||||
if (framerate < 0.1)
|
||||
framerate = 30;
|
||||
@ -1124,7 +1125,15 @@ static void init_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
|
||||
// Initialize active best and worst q and average q values.
|
||||
cpi->rc.active_worst_quality = cpi->oxcf.worst_allowed_q;
|
||||
|
||||
cpi->rc.avg_frame_qindex = cpi->oxcf.worst_allowed_q;
|
||||
cpi->rc.avg_frame_qindex[0] = (cpi->oxcf.worst_allowed_q +
|
||||
cpi->oxcf.best_allowed_q) / 2;
|
||||
cpi->rc.avg_frame_qindex[1] = (cpi->oxcf.worst_allowed_q +
|
||||
cpi->oxcf.best_allowed_q) / 2;
|
||||
cpi->rc.avg_frame_qindex[2] = (cpi->oxcf.worst_allowed_q +
|
||||
cpi->oxcf.best_allowed_q) / 2;
|
||||
cpi->rc.last_q[0] = cpi->oxcf.best_allowed_q;
|
||||
cpi->rc.last_q[1] = cpi->oxcf.best_allowed_q;
|
||||
cpi->rc.last_q[2] = cpi->oxcf.best_allowed_q;
|
||||
|
||||
// Initialise the starting buffer levels
|
||||
cpi->rc.buffer_level = cpi->oxcf.starting_buffer_level;
|
||||
@ -1288,6 +1297,7 @@ void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
|
||||
if (cpi->oxcf.fixed_q >= 0) {
|
||||
cpi->rc.last_q[0] = cpi->oxcf.fixed_q;
|
||||
cpi->rc.last_q[1] = cpi->oxcf.fixed_q;
|
||||
cpi->rc.last_q[2] = cpi->oxcf.fixed_q;
|
||||
cpi->rc.last_boosted_qindex = cpi->oxcf.fixed_q;
|
||||
}
|
||||
|
||||
@ -1307,7 +1317,7 @@ void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
|
||||
#else
|
||||
cpi->alt_ref_source = NULL;
|
||||
#endif
|
||||
cpi->is_src_frame_alt_ref = 0;
|
||||
cpi->rc.is_src_frame_alt_ref = 0;
|
||||
|
||||
#if 0
|
||||
// Experimental RD Code
|
||||
@ -1567,14 +1577,14 @@ VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) {
|
||||
|
||||
/*Initialize the feed-forward activity masking.*/
|
||||
cpi->activity_avg = 90 << 12;
|
||||
|
||||
cpi->frames_since_key = 8; // Sensible default for first frame.
|
||||
cpi->key_frame_frequency = cpi->oxcf.key_freq;
|
||||
cpi->this_key_frame_forced = 0;
|
||||
cpi->next_key_frame_forced = 0;
|
||||
|
||||
cpi->source_alt_ref_pending = 0;
|
||||
cpi->source_alt_ref_active = 0;
|
||||
cpi->rc.frames_since_key = 8; // Sensible default for first frame.
|
||||
cpi->rc.this_key_frame_forced = 0;
|
||||
cpi->rc.next_key_frame_forced = 0;
|
||||
|
||||
cpi->rc.source_alt_ref_pending = 0;
|
||||
cpi->rc.source_alt_ref_active = 0;
|
||||
cpi->refresh_alt_ref_frame = 0;
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
@ -1627,7 +1637,6 @@ VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) {
|
||||
cpi->first_time_stamp_ever = INT64_MAX;
|
||||
|
||||
cpi->rc.frames_till_gf_update_due = 0;
|
||||
cpi->rc.key_frame_count = 1;
|
||||
|
||||
cpi->rc.ni_av_qi = cpi->oxcf.worst_allowed_q;
|
||||
cpi->rc.ni_tot_qi = 0;
|
||||
@ -1652,9 +1661,6 @@ VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) {
|
||||
cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
|
||||
cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
|
||||
|
||||
for (i = 0; i < KEY_FRAME_CONTEXT; i++)
|
||||
cpi->rc.prior_key_frame_distance[i] = (int)cpi->output_framerate;
|
||||
|
||||
#ifdef OUTPUT_YUV_SRC
|
||||
yuv_file = fopen("bd.yuv", "ab");
|
||||
#endif
|
||||
@ -2309,11 +2315,12 @@ static void update_alt_ref_frame_stats(VP9_COMP *cpi) {
|
||||
if (!cpi->multi_arf_enabled)
|
||||
#endif
|
||||
// Clear the alternate reference update pending flag.
|
||||
cpi->source_alt_ref_pending = 0;
|
||||
cpi->rc.source_alt_ref_pending = 0;
|
||||
|
||||
// Set the alternate reference frame active flag
|
||||
cpi->source_alt_ref_active = 1;
|
||||
cpi->rc.source_alt_ref_active = 1;
|
||||
}
|
||||
|
||||
static void update_golden_frame_stats(VP9_COMP *cpi) {
|
||||
// Update the Golden frame usage counts.
|
||||
if (cpi->refresh_golden_frame) {
|
||||
@ -2326,7 +2333,7 @@ static void update_golden_frame_stats(VP9_COMP *cpi) {
|
||||
// set a flag to say so.
|
||||
if (cpi->oxcf.fixed_q >= 0 &&
|
||||
cpi->oxcf.play_alternate && !cpi->refresh_alt_ref_frame) {
|
||||
cpi->source_alt_ref_pending = 1;
|
||||
cpi->rc.source_alt_ref_pending = 1;
|
||||
cpi->rc.frames_till_gf_update_due = cpi->rc.baseline_gf_interval;
|
||||
|
||||
// TODO(ivan): For SVC encoder, GF automatic update is disabled by using
|
||||
@ -2336,8 +2343,8 @@ static void update_golden_frame_stats(VP9_COMP *cpi) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!cpi->source_alt_ref_pending)
|
||||
cpi->source_alt_ref_active = 0;
|
||||
if (!cpi->rc.source_alt_ref_pending)
|
||||
cpi->rc.source_alt_ref_active = 0;
|
||||
|
||||
// Decrement count down till next gf
|
||||
if (cpi->rc.frames_till_gf_update_due > 0)
|
||||
@ -2348,9 +2355,6 @@ static void update_golden_frame_stats(VP9_COMP *cpi) {
|
||||
if (cpi->rc.frames_till_gf_update_due > 0)
|
||||
cpi->rc.frames_till_gf_update_due--;
|
||||
|
||||
if (cpi->frames_till_alt_ref_frame)
|
||||
cpi->frames_till_alt_ref_frame--;
|
||||
|
||||
cpi->rc.frames_since_golden++;
|
||||
}
|
||||
}
|
||||
@ -2642,7 +2646,7 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) {
|
||||
(double)cpi->twopass.bits_left /
|
||||
(1 + cpi->twopass.total_left_stats.coded_error),
|
||||
cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
|
||||
cpi->kf_zeromotion_pct);
|
||||
cpi->twopass.kf_zeromotion_pct);
|
||||
|
||||
fclose(f);
|
||||
|
||||
@ -2736,7 +2740,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
|
||||
loop = 0;
|
||||
} else {
|
||||
// Special case handling for forced key frames
|
||||
if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
|
||||
if ((cm->frame_type == KEY_FRAME) && cpi->rc.this_key_frame_forced) {
|
||||
int last_q = *q;
|
||||
int kf_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
|
||||
|
||||
@ -2850,7 +2854,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
|
||||
}
|
||||
}
|
||||
|
||||
if (cpi->is_src_frame_alt_ref)
|
||||
if (cpi->rc.is_src_frame_alt_ref)
|
||||
loop = 0;
|
||||
|
||||
if (loop) {
|
||||
@ -2873,7 +2877,6 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
int frame_over_shoot_limit;
|
||||
int frame_under_shoot_limit;
|
||||
int top_index;
|
||||
int top_index_prop;
|
||||
int bottom_index;
|
||||
|
||||
SPEED_FEATURES *const sf = &cpi->sf;
|
||||
@ -2912,14 +2915,14 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
cpi->zbin_mode_boost_enabled = 0;
|
||||
|
||||
// Current default encoder behavior for the altref sign bias.
|
||||
cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = cpi->source_alt_ref_active;
|
||||
cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = cpi->rc.source_alt_ref_active;
|
||||
|
||||
// Check to see if a key frame is signaled.
|
||||
// For two pass with auto key frame enabled cm->frame_type may already be
|
||||
// set, but not for one pass.
|
||||
if ((cm->current_video_frame == 0) ||
|
||||
(cm->frame_flags & FRAMEFLAGS_KEY) ||
|
||||
(cpi->oxcf.auto_key && (cpi->frames_since_key %
|
||||
(cpi->oxcf.auto_key && (cpi->rc.frames_since_key %
|
||||
cpi->key_frame_frequency == 0))) {
|
||||
// Set frame type to key frame for the force key frame, if we exceed the
|
||||
// maximum distance in an automatic keyframe selection or for the first
|
||||
@ -2962,7 +2965,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
}
|
||||
|
||||
// The alternate reference frame cannot be active for a key frame.
|
||||
cpi->source_alt_ref_active = 0;
|
||||
cpi->rc.source_alt_ref_active = 0;
|
||||
|
||||
cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0);
|
||||
cm->frame_parallel_decoding_mode =
|
||||
@ -3029,8 +3032,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
// Decide q and q bounds
|
||||
q = vp9_rc_pick_q_and_adjust_q_bounds(cpi,
|
||||
&bottom_index,
|
||||
&top_index,
|
||||
&top_index_prop);
|
||||
&top_index);
|
||||
|
||||
if (!frame_is_intra_only(cm)) {
|
||||
cm->mcomp_filter_type = DEFAULT_INTERP_FILTER;
|
||||
@ -3050,7 +3052,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
// Special case code to reduce pulsing when key frames are forced at a
|
||||
// fixed interval. Note the reconstruction error if it is the frame before
|
||||
// the force key frame
|
||||
if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
|
||||
if (cpi->rc.next_key_frame_forced && (cpi->rc.frames_to_key == 0)) {
|
||||
cpi->ambient_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
|
||||
}
|
||||
|
||||
@ -3122,7 +3124,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
* needed in motion search besides loopfilter */
|
||||
cm->last_frame_type = cm->frame_type;
|
||||
|
||||
vp9_rc_postencode_update(cpi, *size, top_index_prop);
|
||||
vp9_rc_postencode_update(cpi, *size);
|
||||
|
||||
#if 0
|
||||
output_frame_level_debug_stats(cpi);
|
||||
@ -3187,6 +3189,8 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
|
||||
// As this frame is a key frame the next defaults to an inter frame.
|
||||
cm->frame_type = INTER_FRAME;
|
||||
vp9_clear_system_state();
|
||||
cpi->rc.frames_since_key = 0;
|
||||
} else {
|
||||
*frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
|
||||
|
||||
@ -3236,7 +3240,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
// Don't increment frame counters if this was an altref buffer
|
||||
// update not a real frame
|
||||
++cm->current_video_frame;
|
||||
++cpi->frames_since_key;
|
||||
++cpi->rc.frames_since_key;
|
||||
}
|
||||
// restore prev_mi
|
||||
cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
|
||||
@ -3343,7 +3347,7 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
|
||||
|
||||
// Should we code an alternate reference frame.
|
||||
if (cpi->oxcf.play_alternate && cpi->source_alt_ref_pending) {
|
||||
if (cpi->oxcf.play_alternate && cpi->rc.source_alt_ref_pending) {
|
||||
int frames_to_arf;
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
@ -3357,7 +3361,7 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
#endif
|
||||
frames_to_arf = cpi->rc.frames_till_gf_update_due;
|
||||
|
||||
assert(frames_to_arf < cpi->twopass.frames_to_key);
|
||||
assert(frames_to_arf < cpi->rc.frames_to_key);
|
||||
|
||||
if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) {
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
@ -3381,15 +3385,12 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
cpi->refresh_alt_ref_frame = 1;
|
||||
cpi->refresh_golden_frame = 0;
|
||||
cpi->refresh_last_frame = 0;
|
||||
cpi->is_src_frame_alt_ref = 0;
|
||||
|
||||
// TODO(agrange) This needs to vary depending on where the next ARF is.
|
||||
cpi->frames_till_alt_ref_frame = frames_to_arf;
|
||||
cpi->rc.is_src_frame_alt_ref = 0;
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
if (!cpi->multi_arf_enabled)
|
||||
#endif
|
||||
cpi->source_alt_ref_pending = 0; // Clear Pending altf Ref flag.
|
||||
cpi->rc.source_alt_ref_pending = 0; // Clear Pending altf Ref flag.
|
||||
}
|
||||
}
|
||||
|
||||
@ -3403,19 +3404,19 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
// Is this frame the ARF overlay.
|
||||
cpi->is_src_frame_alt_ref = 0;
|
||||
cpi->rc.is_src_frame_alt_ref = 0;
|
||||
for (i = 0; i < cpi->arf_buffered; ++i) {
|
||||
if (cpi->source == cpi->alt_ref_source[i]) {
|
||||
cpi->is_src_frame_alt_ref = 1;
|
||||
cpi->rc.is_src_frame_alt_ref = 1;
|
||||
cpi->refresh_golden_frame = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
cpi->is_src_frame_alt_ref = cpi->alt_ref_source
|
||||
&& (cpi->source == cpi->alt_ref_source);
|
||||
cpi->rc.is_src_frame_alt_ref = cpi->alt_ref_source
|
||||
&& (cpi->source == cpi->alt_ref_source);
|
||||
#endif
|
||||
if (cpi->is_src_frame_alt_ref) {
|
||||
if (cpi->rc.is_src_frame_alt_ref) {
|
||||
// Current frame is an ARF overlay frame.
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
cpi->alt_ref_source[i] = NULL;
|
||||
@ -3453,7 +3454,7 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
if ((cm->frame_type != KEY_FRAME) && (cpi->pass == 2))
|
||||
cpi->source_alt_ref_pending = is_next_frame_arf(cpi);
|
||||
cpi->rc.source_alt_ref_pending = is_next_frame_arf(cpi);
|
||||
#endif
|
||||
} else {
|
||||
*size = 0;
|
||||
@ -3546,7 +3547,7 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
cm->active_ref_idx[0], cm->active_ref_idx[1], cm->active_ref_idx[2]);
|
||||
if (cpi->refresh_alt_ref_frame)
|
||||
fprintf(fp_out, " type:ARF");
|
||||
if (cpi->is_src_frame_alt_ref)
|
||||
if (cpi->rc.is_src_frame_alt_ref)
|
||||
fprintf(fp_out, " type:OVERLAY[%d]", cpi->alt_fb_idx);
|
||||
fprintf(fp_out, "\n");
|
||||
}
|
||||
|
@ -294,7 +294,7 @@ typedef struct {
|
||||
int this_frame_target;
|
||||
int projected_frame_size;
|
||||
int sb64_target_rate;
|
||||
int last_q[2]; // Separate values for Intra/Inter
|
||||
int last_q[3]; // Separate values for Intra/Inter/ARF-GF
|
||||
int last_boosted_qindex; // Last boosted GF/KF/ARF q
|
||||
|
||||
int gfu_boost;
|
||||
@ -306,13 +306,17 @@ typedef struct {
|
||||
double gf_rate_correction_factor;
|
||||
|
||||
unsigned int frames_since_golden;
|
||||
int frames_till_gf_update_due; // Count down till next GF
|
||||
unsigned int frames_till_gf_update_due; // Count down till next GF
|
||||
unsigned int max_gf_interval;
|
||||
unsigned int baseline_gf_interval;
|
||||
unsigned int frames_to_key;
|
||||
unsigned int frames_since_key;
|
||||
unsigned int this_key_frame_forced;
|
||||
unsigned int next_key_frame_forced;
|
||||
unsigned int source_alt_ref_pending;
|
||||
unsigned int source_alt_ref_active;
|
||||
unsigned int is_src_frame_alt_ref;
|
||||
|
||||
int max_gf_interval;
|
||||
int baseline_gf_interval;
|
||||
|
||||
int64_t key_frame_count;
|
||||
int prior_key_frame_distance[KEY_FRAME_CONTEXT];
|
||||
int per_frame_bandwidth; // Current section per frame bandwidth target
|
||||
int av_per_frame_bandwidth; // Average frame size target for clip
|
||||
int min_frame_bandwidth; // Minimum allocation used for any frame
|
||||
@ -320,7 +324,7 @@ typedef struct {
|
||||
int ni_av_qi;
|
||||
int ni_tot_qi;
|
||||
int ni_frames;
|
||||
int avg_frame_qindex;
|
||||
int avg_frame_qindex[3]; // 0 - KEY, 1 - INTER, 2 - ARF/GF
|
||||
double tot_q;
|
||||
double avg_q;
|
||||
|
||||
@ -376,11 +380,7 @@ typedef struct VP9_COMP {
|
||||
YV12_BUFFER_CONFIG *un_scaled_source;
|
||||
YV12_BUFFER_CONFIG scaled_source;
|
||||
|
||||
unsigned int frames_till_alt_ref_frame;
|
||||
int source_alt_ref_pending;
|
||||
int source_alt_ref_active;
|
||||
|
||||
int is_src_frame_alt_ref;
|
||||
unsigned int key_frame_frequency;
|
||||
|
||||
int gold_is_last; // gold same as last frame ( short circuit gold searches)
|
||||
int alt_is_last; // Alt same as last ( short circuit altref search)
|
||||
@ -405,11 +405,6 @@ typedef struct VP9_COMP {
|
||||
TOKENEXTRA *tok;
|
||||
unsigned int tok_count[4][1 << 6];
|
||||
|
||||
|
||||
unsigned int frames_since_key;
|
||||
unsigned int key_frame_frequency;
|
||||
unsigned int this_key_frame_forced;
|
||||
unsigned int next_key_frame_forced;
|
||||
#if CONFIG_MULTIPLE_ARF
|
||||
// Position within a frame coding order (including any additional ARF frames).
|
||||
unsigned int sequence_number;
|
||||
@ -472,9 +467,6 @@ typedef struct VP9_COMP {
|
||||
vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES];
|
||||
vp9_coeff_stats frame_branch_ct[TX_SIZES][PLANE_TYPES];
|
||||
|
||||
int kf_zeromotion_pct;
|
||||
int gf_zeromotion_pct;
|
||||
|
||||
int64_t target_bandwidth;
|
||||
struct vpx_codec_pkt_list *output_pkt_list;
|
||||
|
||||
@ -547,7 +539,6 @@ typedef struct VP9_COMP {
|
||||
double modified_error_left;
|
||||
double kf_intra_err_min;
|
||||
double gf_intra_err_min;
|
||||
int frames_to_key;
|
||||
int maxq_max_limit;
|
||||
int maxq_min_limit;
|
||||
int static_scene_max_gf_interval;
|
||||
@ -568,6 +559,9 @@ typedef struct VP9_COMP {
|
||||
int alt_extra_bits;
|
||||
|
||||
int sr_update_lag;
|
||||
|
||||
int kf_zeromotion_pct;
|
||||
int gf_zeromotion_pct;
|
||||
} twopass;
|
||||
|
||||
YV12_BUFFER_CONFIG alt_ref_buffer;
|
||||
|
@ -34,9 +34,6 @@
|
||||
// Bits Per MB at different Q (Multiplied by 512)
|
||||
#define BPER_MB_NORMBITS 9
|
||||
|
||||
static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] =
|
||||
{ 1, 2, 3, 4, 5 };
|
||||
|
||||
// Tables relating active max Q to active min Q
|
||||
static int kf_low_motion_minq[QINDEX_RANGE];
|
||||
static int kf_high_motion_minq[QINDEX_RANGE];
|
||||
@ -275,7 +272,7 @@ static void calc_pframe_target_size(VP9_COMP *cpi) {
|
||||
// If we are using alternate ref instead of gf then do not apply the boost
|
||||
// It will instead be applied to the altref update
|
||||
// Jims modified boost
|
||||
if (!cpi->source_alt_ref_active) {
|
||||
if (!cpi->rc.source_alt_ref_active) {
|
||||
// The spend on the GF is defined in the two pass code
|
||||
// for two pass encodes
|
||||
cpi->rc.this_frame_target = cpi->rc.per_frame_bandwidth;
|
||||
@ -443,8 +440,7 @@ static int get_active_quality(int q,
|
||||
|
||||
int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
int *bottom_index,
|
||||
int *top_index,
|
||||
int *top_index_prop) {
|
||||
int *top_index) {
|
||||
const VP9_COMMON *const cm = &cpi->common;
|
||||
int active_best_quality;
|
||||
int active_worst_quality = cpi->rc.active_worst_quality;
|
||||
@ -456,7 +452,7 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
// Handle the special case for key frames forced when we have75 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 (cpi->this_key_frame_forced) {
|
||||
if (cpi->rc.this_key_frame_forced) {
|
||||
int delta_qindex;
|
||||
int qindex = cpi->rc.last_boosted_qindex;
|
||||
double last_boosted_q = vp9_convert_qindex_to_q(qindex);
|
||||
@ -483,7 +479,7 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
}
|
||||
|
||||
// Make a further adjustment based on the kf zero motion measure.
|
||||
q_adj_factor += 0.05 - (0.001 * (double)cpi->kf_zeromotion_pct);
|
||||
q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
|
||||
|
||||
// Convert the adjustment factor to a qindex delta
|
||||
// on active_best_quality.
|
||||
@ -498,15 +494,15 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
active_best_quality = active_worst_quality
|
||||
+ vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
|
||||
#endif
|
||||
} else if (!cpi->is_src_frame_alt_ref &&
|
||||
} else if (!cpi->rc.is_src_frame_alt_ref &&
|
||||
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
|
||||
|
||||
// Use the lower of active_worst_quality and recent
|
||||
// average Q as basis for GF/ARF best Q limit unless last frame was
|
||||
// a key frame.
|
||||
if (cpi->frames_since_key > 1 &&
|
||||
cpi->rc.avg_frame_qindex < active_worst_quality) {
|
||||
q = cpi->rc.avg_frame_qindex;
|
||||
if (cpi->rc.frames_since_key > 1 &&
|
||||
cpi->rc.avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
|
||||
q = cpi->rc.avg_frame_qindex[INTER_FRAME];
|
||||
} else {
|
||||
q = active_worst_quality;
|
||||
}
|
||||
@ -514,7 +510,7 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
|
||||
if (q < cpi->cq_target_quality)
|
||||
q = cpi->cq_target_quality;
|
||||
if (cpi->frames_since_key > 1) {
|
||||
if (cpi->rc.frames_since_key > 1) {
|
||||
active_best_quality = get_active_quality(q, cpi->rc.gfu_boost,
|
||||
gf_low, gf_high,
|
||||
afq_low_motion_minq,
|
||||
@ -532,7 +528,7 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
if (!cpi->refresh_alt_ref_frame) {
|
||||
active_best_quality = cpi->cq_target_quality;
|
||||
} else {
|
||||
if (cpi->frames_since_key > 1) {
|
||||
if (cpi->rc.frames_since_key > 1) {
|
||||
active_best_quality = get_active_quality(
|
||||
q, cpi->rc.gfu_boost, gf_low, gf_high,
|
||||
afq_low_motion_minq, afq_high_motion_minq);
|
||||
@ -552,10 +548,10 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
active_best_quality = cpi->cq_target_quality;
|
||||
} else {
|
||||
if (cpi->pass == 0 &&
|
||||
cpi->rc.avg_frame_qindex < active_worst_quality)
|
||||
cpi->rc.avg_frame_qindex[INTER_FRAME] < active_worst_quality)
|
||||
// 1-pass: for now, use the average Q for the active_best, if its lower
|
||||
// than active_worst.
|
||||
active_best_quality = inter_minq[cpi->rc.avg_frame_qindex];
|
||||
active_best_quality = inter_minq[cpi->rc.avg_frame_qindex[INTER_FRAME]];
|
||||
else
|
||||
active_best_quality = inter_minq[active_worst_quality];
|
||||
|
||||
@ -587,19 +583,18 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
if (active_worst_quality < active_best_quality)
|
||||
active_worst_quality = active_best_quality;
|
||||
|
||||
*top_index_prop = active_worst_quality;
|
||||
*top_index = active_worst_quality;
|
||||
*bottom_index = active_best_quality;
|
||||
|
||||
#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
|
||||
// Limit Q range for the adaptive loop.
|
||||
if (cm->frame_type == KEY_FRAME && !cpi->this_key_frame_forced) {
|
||||
if (cm->frame_type == KEY_FRAME && !cpi->rc.this_key_frame_forced) {
|
||||
if (!(cpi->pass == 0 && cpi->common.current_video_frame == 0)) {
|
||||
*top_index = active_worst_quality;
|
||||
*top_index =
|
||||
(active_worst_quality + active_best_quality * 3) / 4;
|
||||
}
|
||||
} else if (!cpi->is_src_frame_alt_ref &&
|
||||
} else if (!cpi->rc.is_src_frame_alt_ref &&
|
||||
(cpi->oxcf.end_usage != USAGE_STREAM_FROM_SERVER) &&
|
||||
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
|
||||
*top_index =
|
||||
@ -610,7 +605,7 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
|
||||
q = active_best_quality;
|
||||
// Special case code to try and match quality with forced key frames
|
||||
} else if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
|
||||
} else if ((cm->frame_type == KEY_FRAME) && cpi->rc.this_key_frame_forced) {
|
||||
q = cpi->rc.last_boosted_qindex;
|
||||
} else {
|
||||
// Determine initial Q to try.
|
||||
@ -647,61 +642,6 @@ int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
return q;
|
||||
}
|
||||
|
||||
static int estimate_keyframe_frequency(VP9_COMP *cpi) {
|
||||
int i;
|
||||
|
||||
// Average key frame frequency
|
||||
int av_key_frame_frequency = 0;
|
||||
|
||||
/* First key frame at start of sequence is a special case. We have no
|
||||
* frequency data.
|
||||
*/
|
||||
if (cpi->rc.key_frame_count == 1) {
|
||||
/* Assume a default of 1 kf every 2 seconds, or the max kf interval,
|
||||
* whichever is smaller.
|
||||
*/
|
||||
int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
|
||||
av_key_frame_frequency = (int)cpi->output_framerate * 2;
|
||||
|
||||
if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
|
||||
av_key_frame_frequency = cpi->oxcf.key_freq;
|
||||
|
||||
cpi->rc.prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
|
||||
= av_key_frame_frequency;
|
||||
} else {
|
||||
unsigned int total_weight = 0;
|
||||
int last_kf_interval =
|
||||
(cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
|
||||
|
||||
/* reset keyframe context and calculate weighted average of last
|
||||
* KEY_FRAME_CONTEXT keyframes
|
||||
*/
|
||||
for (i = 0; i < KEY_FRAME_CONTEXT; i++) {
|
||||
if (i < KEY_FRAME_CONTEXT - 1)
|
||||
cpi->rc.prior_key_frame_distance[i]
|
||||
= cpi->rc.prior_key_frame_distance[i + 1];
|
||||
else
|
||||
cpi->rc.prior_key_frame_distance[i] = last_kf_interval;
|
||||
|
||||
av_key_frame_frequency += prior_key_frame_weight[i]
|
||||
* cpi->rc.prior_key_frame_distance[i];
|
||||
total_weight += prior_key_frame_weight[i];
|
||||
}
|
||||
|
||||
av_key_frame_frequency /= total_weight;
|
||||
}
|
||||
return av_key_frame_frequency;
|
||||
}
|
||||
|
||||
|
||||
static void adjust_key_frame_context(VP9_COMP *cpi) {
|
||||
// Clear down mmx registers to allow floating point in what follows
|
||||
vp9_clear_system_state();
|
||||
|
||||
cpi->frames_since_key = 0;
|
||||
cpi->rc.key_frame_count++;
|
||||
}
|
||||
|
||||
void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
|
||||
int this_frame_target,
|
||||
int *frame_under_shoot_limit,
|
||||
@ -755,8 +695,7 @@ int vp9_rc_pick_frame_size_target(VP9_COMP *cpi) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used,
|
||||
int worst_q) {
|
||||
void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
// Update rate control heuristics
|
||||
cpi->rc.projected_frame_size = (bytes_used << 3);
|
||||
@ -766,8 +705,29 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used,
|
||||
cpi, (cpi->sf.recode_loop ||
|
||||
cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ? 2 : 0);
|
||||
|
||||
cpi->rc.last_q[cm->frame_type] = cm->base_qindex;
|
||||
cpi->rc.active_worst_quality = worst_q;
|
||||
// Keep a record of last Q and ambient average Q.
|
||||
if (cm->frame_type == KEY_FRAME) {
|
||||
cpi->rc.last_q[KEY_FRAME] = cm->base_qindex;
|
||||
cpi->rc.avg_frame_qindex[KEY_FRAME] =
|
||||
(2 + 3 * cpi->rc.avg_frame_qindex[KEY_FRAME] + cm->base_qindex) >> 2;
|
||||
} else if (!cpi->rc.is_src_frame_alt_ref &&
|
||||
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
|
||||
cpi->rc.last_q[2] = cm->base_qindex;
|
||||
cpi->rc.avg_frame_qindex[2] =
|
||||
(2 + 3 * cpi->rc.avg_frame_qindex[2] + cm->base_qindex) >> 2;
|
||||
} else {
|
||||
cpi->rc.last_q[INTER_FRAME] = cm->base_qindex;
|
||||
cpi->rc.avg_frame_qindex[INTER_FRAME] =
|
||||
(2 + 3 * cpi->rc.avg_frame_qindex[INTER_FRAME] +
|
||||
cm->base_qindex) >> 2;
|
||||
cpi->rc.ni_frames++;
|
||||
cpi->rc.tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
|
||||
cpi->rc.avg_q = cpi->rc.tot_q / (double)cpi->rc.ni_frames;
|
||||
|
||||
// Calculate the average Q for normal inter frames (not key or GFU frames).
|
||||
cpi->rc.ni_tot_qi += cm->base_qindex;
|
||||
cpi->rc.ni_av_qi = cpi->rc.ni_tot_qi / cpi->rc.ni_frames;
|
||||
}
|
||||
|
||||
// Keep record of last boosted (KF/KF/ARF) Q value.
|
||||
// If the current frame is coded at a lower Q then we also update it.
|
||||
@ -777,32 +737,10 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used,
|
||||
if ((cm->base_qindex < cpi->rc.last_boosted_qindex) ||
|
||||
((cpi->static_mb_pct < 100) &&
|
||||
((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
|
||||
(cpi->refresh_golden_frame && !cpi->is_src_frame_alt_ref)))) {
|
||||
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)))) {
|
||||
cpi->rc.last_boosted_qindex = cm->base_qindex;
|
||||
}
|
||||
|
||||
if (cm->frame_type == KEY_FRAME) {
|
||||
adjust_key_frame_context(cpi);
|
||||
}
|
||||
|
||||
// Keep a record of ambient average Q.
|
||||
if (cm->frame_type != KEY_FRAME)
|
||||
cpi->rc.avg_frame_qindex = (2 + 3 * cpi->rc.avg_frame_qindex +
|
||||
cm->base_qindex) >> 2;
|
||||
|
||||
// Keep a record from which we can calculate the average Q excluding GF
|
||||
// updates and key frames.
|
||||
if (cm->frame_type != KEY_FRAME &&
|
||||
!cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame) {
|
||||
cpi->rc.ni_frames++;
|
||||
cpi->rc.tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
|
||||
cpi->rc.avg_q = cpi->rc.tot_q / (double)cpi->rc.ni_frames;
|
||||
|
||||
// Calculate the average Q for normal inter frames (not key or GFU frames).
|
||||
cpi->rc.ni_tot_qi += cm->base_qindex;
|
||||
cpi->rc.ni_av_qi = cpi->rc.ni_tot_qi / cpi->rc.ni_frames;
|
||||
}
|
||||
|
||||
// Update the buffer level variable.
|
||||
// Non-viewable frames are a special case and are treated as pure overhead.
|
||||
if (!cm->show_frame)
|
||||
|
@ -42,18 +42,16 @@ void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
|
||||
// Picks q and q bounds given the target for bits
|
||||
int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
|
||||
int *bottom_index,
|
||||
int *top_index,
|
||||
int *top_index_prop);
|
||||
int *top_index);
|
||||
|
||||
// Estimates q to achieve a target bits per frame
|
||||
int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
|
||||
int active_best_quality, int active_worst_quality);
|
||||
|
||||
// Post encode update of the rate control parameters based
|
||||
// on bytes used and q used for the frame
|
||||
// on bytes used
|
||||
void vp9_rc_postencode_update(VP9_COMP *cpi,
|
||||
uint64_t bytes_used,
|
||||
int worst_q);
|
||||
uint64_t bytes_used);
|
||||
|
||||
// estimates bits per mb for a given qindex and correction factor
|
||||
int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
|
||||
|
@ -3351,7 +3351,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
// unless ARNR filtering is enabled in which case we want
|
||||
// an unfiltered alternative. We allow near/nearest as well
|
||||
// because they may result in zero-zero MVs but be cheaper.
|
||||
if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) {
|
||||
if (cpi->rc.is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) {
|
||||
if ((this_mode != ZEROMV &&
|
||||
!(this_mode == NEARMV &&
|
||||
frame_mv[NEARMV][ALTREF_FRAME].as_int == 0) &&
|
||||
@ -3998,7 +3998,7 @@ int64_t vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
// unless ARNR filtering is enabled in which case we want
|
||||
// an unfiltered alternative. We allow near/nearest as well
|
||||
// because they may result in zero-zero MVs but be cheaper.
|
||||
if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
|
||||
if (cpi->rc.is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user