diff options
author | James Zern <jzern@google.com> | 2018-05-30 21:25:55 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-05-30 21:25:55 +0000 |
commit | 7f7782bebdcb43708bda2f88e4ae21e4319bdf29 (patch) | |
tree | dbb2b31f3d10285798fcabb7d26d42249ccb58de /vp9/encoder | |
parent | eb012d74f89cdd40579803e90fa59c07e66a45c4 (diff) | |
parent | 39fa0777e3445b04090f35ac396a33ad3a583351 (diff) | |
download | libvpx-7f7782bebdcb43708bda2f88e4ae21e4319bdf29.tar libvpx-7f7782bebdcb43708bda2f88e4ae21e4319bdf29.tar.gz libvpx-7f7782bebdcb43708bda2f88e4ae21e4319bdf29.tar.bz2 libvpx-7f7782bebdcb43708bda2f88e4ae21e4319bdf29.zip |
Merge "Revert 3 slide show coding changes"
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 64 | ||||
-rw-r--r-- | vp9/encoder/vp9_firstpass.h | 12 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 12 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.h | 8 |
4 files changed, 30 insertions, 66 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 453879fb8..c76dfd351 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -2201,8 +2201,7 @@ static void allocate_gf_group_bits(VP9_COMP *cpi, int64_t gf_group_bits, // Define middle frame mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; - normal_frames = - rc->baseline_gf_interval - (key_frame || rc->source_alt_ref_pending); + normal_frames = (rc->baseline_gf_interval - rc->source_alt_ref_pending); if (normal_frames > 1) normal_frame_bits = (int)(total_group_bits / normal_frames); else @@ -2441,9 +2440,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); // Monitor for static sections. - if ((rc->frames_since_key + i - 1) > 1) { - zero_motion_accumulator *= get_zero_motion_factor(cpi, &next_frame); - } + zero_motion_accumulator = VPXMIN( + zero_motion_accumulator, get_zero_motion_factor(cpi, &next_frame)); // Break clause to detect very still sections after motion. For example, // a static image after a fade or other transition. @@ -2464,18 +2462,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { } // Break out conditions. - // Break at maximum of active_max_gf_interval unless almost totally static. - // - // Note that the addition of a test of rc->source_alt_ref_active is - // deliberate. The effect of this is that after a normal altref group even - // if the material is static there will be one normal length GF group - // before allowing longer GF groups. The reason for this is that in cases - // such as slide shows where slides are separated by a complex transition - // such as a fade, the arf group spanning the transition may not be coded - // at a very high quality and hence this frame (with its overlay) is a - // poor golden frame to use for an extended group. - if (((i >= active_max_gf_interval) && - ((zero_motion_accumulator < 0.995) || (rc->source_alt_ref_active))) || + if ( + // Break at active_max_gf_interval unless almost totally static. + ((i >= active_max_gf_interval) && (zero_motion_accumulator < 0.995)) || ( // Don't break out with a very short interval. (i >= active_min_gf_interval) && @@ -2495,8 +2484,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { rc->constrained_gf_group = (i >= rc->frames_to_key) ? 1 : 0; // Should we use the alternate reference frame. - if ((zero_motion_accumulator < 0.995) && allow_alt_ref && - (i < cpi->oxcf.lag_in_frames) && (i >= rc->min_gf_interval)) { + if (allow_alt_ref && (i < cpi->oxcf.lag_in_frames) && + (i >= rc->min_gf_interval)) { const int forward_frames = (rc->frames_to_key - i >= i - 1) ? i - 1 : VPXMAX(0, rc->frames_to_key - i); @@ -2523,11 +2512,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { rc->gfu_boost = VPXMIN((int)rc->gfu_boost, i * 200); #endif - rc->baseline_gf_interval = - ((twopass->kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH) && - (i >= rc->frames_to_key)) - ? i - : (i - (is_key_frame || rc->source_alt_ref_pending)); + // Set the interval until the next gf. + rc->baseline_gf_interval = i - (is_key_frame || rc->source_alt_ref_pending); rc->frames_till_gf_update_due = rc->baseline_gf_interval; @@ -2774,7 +2760,6 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { vp9_zero(next_frame); cpi->common.frame_type = KEY_FRAME; - rc->frames_since_key = 0; // Reset the GF group data structures. vp9_zero(*gf_group); @@ -2919,22 +2904,13 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { for (i = 0; i < (rc->frames_to_key - 1); ++i) { if (EOF == input_stats(twopass, &next_frame)) break; - // The zero motion test here insures that if we mark a kf group as static - // it is static throughout not just the first KF_BOOST_SCAN_MAX_FRAMES. - // It also allows for a larger boost on long static groups. - if ((i <= KF_BOOST_SCAN_MAX_FRAMES) || (zero_motion_accumulator >= 0.99)) { + if (i <= KF_BOOST_SCAN_MAX_FRAMES) { double frame_boost; double zm_factor; // Monitor for static sections. - // First frame in kf group the second ref indicator is invalid. - if (i > 0) { - zero_motion_accumulator = VPXMIN( - zero_motion_accumulator, get_zero_motion_factor(cpi, &next_frame)); - } else { - zero_motion_accumulator = - next_frame.pcnt_inter - next_frame.pcnt_motion; - } + zero_motion_accumulator = VPXMIN( + zero_motion_accumulator, get_zero_motion_factor(cpi, &next_frame)); // Factor 0.75-1.25 based on how much of frame is static. zm_factor = (0.75 + (zero_motion_accumulator / 2.0)); @@ -2971,16 +2947,10 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { twopass->section_intra_rating = calculate_section_intra_ratio( start_position, twopass->stats_in_end, rc->frames_to_key); - // Special case for static / slide show content but dont apply - // if the kf group is very short. - if ((zero_motion_accumulator > 0.99) && (rc->frames_to_key > 8)) { - rc->kf_boost = VPXMAX((rc->frames_to_key * 100), MAX_KF_TOT_BOOST); - } else { - // Apply various clamps for min and max boost - rc->kf_boost = VPXMAX((int)boost_score, (rc->frames_to_key * 3)); - rc->kf_boost = VPXMAX(rc->kf_boost, MIN_KF_TOT_BOOST); - rc->kf_boost = VPXMIN(rc->kf_boost, MAX_KF_TOT_BOOST); - } + // Apply various clamps for min and max boost + rc->kf_boost = VPXMAX((int)boost_score, (rc->frames_to_key * 3)); + rc->kf_boost = VPXMAX(rc->kf_boost, MIN_KF_TOT_BOOST); + rc->kf_boost = VPXMIN(rc->kf_boost, MAX_KF_TOT_BOOST); // Work out how many bits to allocate for the key frame itself. kf_bits = calculate_boost_bits((rc->frames_to_key - 1), rc->kf_boost, diff --git a/vp9/encoder/vp9_firstpass.h b/vp9/encoder/vp9_firstpass.h index aa497e3da..000ecd779 100644 --- a/vp9/encoder/vp9_firstpass.h +++ b/vp9/encoder/vp9_firstpass.h @@ -120,12 +120,12 @@ typedef enum { typedef struct { unsigned char index; unsigned char first_inter_index; - RATE_FACTOR_LEVEL rf_level[MAX_STATIC_GF_GROUP_LENGTH + 1]; - FRAME_UPDATE_TYPE update_type[MAX_STATIC_GF_GROUP_LENGTH + 1]; - unsigned char arf_src_offset[MAX_STATIC_GF_GROUP_LENGTH + 1]; - unsigned char arf_update_idx[MAX_STATIC_GF_GROUP_LENGTH + 1]; - unsigned char arf_ref_idx[MAX_STATIC_GF_GROUP_LENGTH + 1]; - int bit_allocation[MAX_STATIC_GF_GROUP_LENGTH + 1]; + RATE_FACTOR_LEVEL rf_level[(MAX_LAG_BUFFERS * 2) + 1]; + FRAME_UPDATE_TYPE update_type[(MAX_LAG_BUFFERS * 2) + 1]; + unsigned char arf_src_offset[(MAX_LAG_BUFFERS * 2) + 1]; + unsigned char arf_update_idx[(MAX_LAG_BUFFERS * 2) + 1]; + unsigned char arf_ref_idx[(MAX_LAG_BUFFERS * 2) + 1]; + int bit_allocation[(MAX_LAG_BUFFERS * 2) + 1]; } GF_GROUP; typedef struct { diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 01c1ab466..2b2f17bc0 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -1227,9 +1227,6 @@ static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, int *bottom_index, // Baseline value derived from cpi->active_worst_quality and kf boost. active_best_quality = get_kf_active_quality(rc, active_worst_quality, cm->bit_depth); - if (cpi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH) { - active_best_quality /= 4; - } // Allow somewhat lower kf minq with small image formats. if ((cm->width * cm->height) <= (352 * 288)) { @@ -1976,8 +1973,13 @@ void vp9_rc_set_gf_interval_range(const VP9_COMP *const cpi, rc->max_gf_interval = vp9_rc_get_default_max_gf_interval( cpi->framerate, rc->min_gf_interval); - // Extended max interval for genuinely static scenes like slide shows. - rc->static_scene_max_gf_interval = MAX_STATIC_GF_GROUP_LENGTH; + // 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 (rc->max_gf_interval > rc->static_scene_max_gf_interval) rc->max_gf_interval = rc->static_scene_max_gf_interval; diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h index 94fbfdfdf..c1b210677 100644 --- a/vp9/encoder/vp9_ratectrl.h +++ b/vp9/encoder/vp9_ratectrl.h @@ -34,14 +34,6 @@ extern "C" { #define FRAME_OVERHEAD_BITS 200 -// Threshold used to define a KF group as static (e.g. a slide show). -// Essentially this means that no frame in the group has more than 1% of MBs -// that are not marked as coded with 0,0 motion in the first pass. -#define STATIC_KF_GROUP_THRESH 99 - -// The maximum duration of a GF group that is static (for example a slide show). -#define MAX_STATIC_GF_GROUP_LENGTH 25 - typedef enum { INTER_NORMAL = 0, INTER_HIGH = 1, |