summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorHui Su <huisu@google.com>2018-08-23 21:39:38 +0000
committerHui Su <huisu@google.com>2018-08-23 14:47:18 -0700
commitd10b1f233657054b1465d40f0b409c20029a540b (patch)
treed4838699f8b08c8eca50685f423800fbfabb3986 /vp9
parentdbcb89be244e03074ee80e7bc6d5c22e6fc5dd79 (diff)
downloadlibvpx-d10b1f233657054b1465d40f0b409c20029a540b.tar
libvpx-d10b1f233657054b1465d40f0b409c20029a540b.tar.gz
libvpx-d10b1f233657054b1465d40f0b409c20029a540b.tar.bz2
libvpx-d10b1f233657054b1465d40f0b409c20029a540b.zip
Revert "Prevent double application of min rate in two pass."
This reverts commit 416b7051d7f610ed6d62dff18af7776ec520fd9c. Reason for revert: it causes visual quality drop as described in b/112953058. Original change's description: > Prevent double application of min rate in two pass. > > The initial allocation of bits in the two pass code to each frame > should be within the min max limits on the command line. However, > when forming an ARF group the cost of the ARF is shared by frames > in that group such that the residual bits for a frame could drop below > the min value. This change prevents the minimum being re-applied > after the cost of the ARF has been deducted as this may otherwise > cause low rate sections to overshoot their target. > > Test runs comparing to a baseline run with min and max section pct > 0-2000% vs one closer to the YT use case (50-150%) suggest that > this fix not only results in better rate control but also gives a better > rd outcome. > > For example the HD set vs 0-2000% baseline (opsnr, ssim). > Old code (50-150): +0.751, +1.099 > New code(50-150): +0.241, -0.009 > > Change-Id: I715da7b130bf53ba8aa609532aa9e18b84f5e2ef TBR=yaowu@google.com,paulwilkins@google.com,debargha@google.com,builds@webmproject.org # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: Ic9849e4e0db64e9d92bbb9df9cc923230a15c4df
Diffstat (limited to 'vp9')
-rw-r--r--vp9/encoder/vp9_ratectrl.c25
-rw-r--r--vp9/encoder/vp9_ratectrl.h2
2 files changed, 11 insertions, 16 deletions
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index 4e2fc3e3f..70613c9eb 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -47,6 +47,8 @@
#define MIN_BPB_FACTOR 0.005
#define MAX_BPB_FACTOR 50
+#define FRAME_OVERHEAD_BITS 200
+
#if CONFIG_VP9_HIGHBITDEPTH
#define ASSIGN_MINQ_TABLE(bit_depth, name) \
do { \
@@ -210,23 +212,18 @@ int vp9_estimate_bits_at_q(FRAME_TYPE frame_type, int q, int mbs,
int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
const RATE_CONTROL *rc = &cpi->rc;
const VP9EncoderConfig *oxcf = &cpi->oxcf;
-
- if (cpi->oxcf.pass != 2) {
- const int min_frame_target =
- VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5);
- if (target < min_frame_target) target = min_frame_target;
- if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
- // If there is an active ARF at this location use the minimum
- // bits on this frame even if it is a constructed arf.
- // The active maximum quantizer insures that an appropriate
- // number of bits will be spent if needed for constructed ARFs.
- target = min_frame_target;
- }
+ const int min_frame_target =
+ VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5);
+ if (target < min_frame_target) target = min_frame_target;
+ if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
+ // If there is an active ARF at this location use the minimum
+ // bits on this frame even if it is a constructed arf.
+ // The active maximum quantizer insures that an appropriate
+ // number of bits will be spent if needed for constructed ARFs.
+ target = min_frame_target;
}
-
// Clip the frame target to the maximum allowed value.
if (target > rc->max_frame_bandwidth) target = rc->max_frame_bandwidth;
-
if (oxcf->rc_max_inter_bitrate_pct) {
const int max_rate =
rc->avg_frame_bandwidth * oxcf->rc_max_inter_bitrate_pct / 100;
diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h
index cf37117f9..87b1ec33e 100644
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -32,8 +32,6 @@ extern "C" {
#define FIXED_GF_INTERVAL 8 // Used in some testing modes only
#define ONEHALFONLY_RESIZE 0
-#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.