ref: 59993f16611a67b3d74c3f5babee5009e3669392
parent: f6ddb92a33aac1081348df1e2f899b3c1f55028d
author: Jingning Han <jingning@google.com>
date: Wed Sep 26 12:34:16 EDT 2018
Adapt GOP size threshold to the allowed layer depth Increase the total prediction error budget linearly with the allowed ARF layer depth. This in general improves the compression performance, but does hit corner cases on a few clips at very low bit-rate range (corresponding to 26 - 28 dB range). To mitigate such problem, we temporarily work around this problem by limiting the first GOP size to be ~8 so as to not drain up the bit resource. The overall compression performance improvements over the current multi-layer ARF system in speed 0 are: overall PSNR avg PSNR SSIM lowres -0.47% -0.13% -1.51% midres -1.30% -1.16% -2.80% hdres -0.91% -0.84% -2.15% Change-Id: Ia4880ab63e98e15a9db99aea6eabfd3d1da9270d
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2485,6 +2485,8 @@
const int is_key_frame = frame_is_intra_only(cm);
const int arf_active_or_kf = is_key_frame || rc->source_alt_ref_active;
+ int gop_intra_factor = 0;
+
// Reset the GF group data structures unless this is a key
// frame in which case it will already have been done.
if (is_key_frame == 0) {
@@ -2537,6 +2539,12 @@
// interval to spread the cost of the GF.
active_max_gf_interval = 12 + arf_active_or_kf + VPXMIN(4, (int_lbq / 6));
+ // TODO(jingning, paulwilkins): Temporary solution to work around
+ // multi-layer ARF rate control issues at extremely low bit-rate cases.
+ // We would deprecate this soon.
+ if (cpi->multi_layer_arf && is_key_frame)
+ active_max_gf_interval = 7 + arf_active_or_kf + VPXMIN(4, (int_lbq / 6));
+
// We have: active_min_gf_interval <=
// rc->max_gf_interval + arf_active_or_kf.
if (active_max_gf_interval < active_min_gf_interval) {
@@ -2552,6 +2560,11 @@
active_max_gf_interval = rc->frames_to_key / 2;
}
+ // Adapt the intra_error factor to active_max_gf_interval limit.
+ for (i = active_max_gf_interval; i > 0; i >>= 1) ++gop_intra_factor;
+
+ gop_intra_factor = VPXMIN(MAX_ARF_LAYERS, gop_intra_factor);
+
i = 0;
while (i < rc->static_scene_max_gf_interval && i < rc->frames_to_key) {
++i;
@@ -2628,7 +2641,7 @@
(!flash_detected) &&
((mv_ratio_accumulator > mv_ratio_accumulator_thresh) ||
(abs_mv_in_out_accumulator > abs_mv_in_out_thresh) ||
- (sr_accumulator > next_frame.intra_error)))) {
+ (sr_accumulator > gop_intra_factor * next_frame.intra_error)))) {
break;
}