Limit key frame quantizer for forced key frames.
Where a key frame occurs because of a minimum interval selected by the user, then these forced key frames ideally need to be more closely matched in quality to the surrounding frame. Change-Id: Ia55b1f047e77dc7fbd78379c45869554f25b3df7
This commit is contained in:
Родитель
6ff2b0883a
Коммит
55acda98f7
|
@ -980,10 +980,10 @@ static int estimate_max_q(VP8_COMP *cpi, double section_err, int section_target_
|
|||
// Restriction on active max q for constrained quality mode.
|
||||
if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
|
||||
(Q < cpi->cq_target_quality) )
|
||||
//(Q < cpi->oxcf.cq_target_quality) )
|
||||
//(Q < cpi->oxcf.cq_level;) )
|
||||
{
|
||||
Q = cpi->cq_target_quality;
|
||||
//Q = cpi->oxcf.cq_target_quality;
|
||||
//Q = cpi->oxcf.cq_level;
|
||||
}
|
||||
|
||||
// Adjust maxq_min_limit and maxq_max_limit limits based on
|
||||
|
@ -2286,6 +2286,9 @@ void vp8_find_next_key_frame(VP8_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;
|
||||
|
||||
// Clear the alt ref active flag as this can never be active on a key frame
|
||||
cpi->source_alt_ref_active = FALSE;
|
||||
|
||||
|
@ -2348,7 +2351,11 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
|
|||
kf_group_err /= 2.0;
|
||||
kf_group_intra_err /= 2.0;
|
||||
kf_group_coded_err /= 2.0;
|
||||
|
||||
cpi->next_key_frame_forced = TRUE;
|
||||
}
|
||||
else
|
||||
cpi->next_key_frame_forced = FALSE;
|
||||
|
||||
// Special case for the last frame of the file
|
||||
if (cpi->stats_in >= cpi->stats_in_end)
|
||||
|
|
|
@ -2272,6 +2272,8 @@ VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf)
|
|||
|
||||
cpi->frames_since_key = 8; // Give a sensible default for the first frame.
|
||||
cpi->key_frame_frequency = cpi->oxcf.key_freq;
|
||||
cpi->this_key_frame_forced = FALSE;
|
||||
cpi->next_key_frame_forced = FALSE;
|
||||
|
||||
cpi->source_alt_ref_pending = FALSE;
|
||||
cpi->source_alt_ref_active = FALSE;
|
||||
|
@ -3817,10 +3819,22 @@ static void encode_frame_to_data_rate
|
|||
// KEY FRAMES
|
||||
else
|
||||
{
|
||||
if (cpi->gfu_boost > 600)
|
||||
cpi->active_best_quality = kf_low_motion_minq[Q];
|
||||
else
|
||||
cpi->active_best_quality = kf_high_motion_minq[Q];
|
||||
// Special case for key frames forced because we have reached
|
||||
// the maximum key frame interval. Here force the Q to a range
|
||||
// close to but just below the ambient Q to reduce the risk
|
||||
// of popping
|
||||
if ( cpi->this_key_frame_forced )
|
||||
{
|
||||
cpi->active_worst_quality = cpi->avg_frame_qindex * 7/8;
|
||||
cpi->active_best_quality = cpi->avg_frame_qindex * 2/3;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cpi->gfu_boost > 600)
|
||||
cpi->active_best_quality = kf_low_motion_minq[Q];
|
||||
else
|
||||
cpi->active_best_quality = kf_high_motion_minq[Q];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -317,7 +317,8 @@ typedef struct
|
|||
|
||||
unsigned int frames_since_key;
|
||||
unsigned int key_frame_frequency;
|
||||
unsigned int next_key;
|
||||
unsigned int this_key_frame_forced;
|
||||
unsigned int next_key_frame_forced;
|
||||
|
||||
unsigned int mode_check_freq[MAX_MODES];
|
||||
unsigned int mode_test_hit_counts[MAX_MODES];
|
||||
|
|
Загрузка…
Ссылка в новой задаче