ref: 869d82d656eaea8f0db1df6364af4d22875103f4
parent: c87ff4a09ddf50152918c127eebf11e3a6ef7b1e
author: Deepa K G <[email protected]>
date: Fri May 17 12:05:06 EDT 2019
Increase the bits allocated to key frame Based on the spatial complexity, increase the bits allocated to key frame. Change-Id: I4f96990a13bcc3bdb7a22d50e67e2bd622f1ff7b
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2925,6 +2925,7 @@
FIRSTPASS_STATS next_frame;
FIRSTPASS_STATS last_frame;
int kf_bits = 0;
+ int64_t max_kf_bits;
double decay_accumulator = 1.0;
double zero_motion_accumulator = 1.0;
double zero_motion_sum = 0.0;
@@ -3175,6 +3176,13 @@
// 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,
twopass->kf_group_bits);
+ // Based on the spatial complexity, increase the bits allocated to key frame.
+ kf_bits +=
+ (int)((twopass->kf_group_bits - kf_bits) * (kf_mod_err / kf_group_err));
+ max_kf_bits =
+ twopass->kf_group_bits - (rc->frames_to_key - 1) * FRAME_OVERHEAD_BITS;
+ max_kf_bits = lclamp(max_kf_bits, 0, INT_MAX);
+ kf_bits = VPXMIN(kf_bits, (int)max_kf_bits);
twopass->kf_group_bits -= kf_bits;
--- a/vpx_dsp/vpx_dsp_common.h
+++ b/vpx_dsp/vpx_dsp_common.h
@@ -57,6 +57,10 @@
return value < low ? low : (value > high ? high : value);
}
+static INLINE int64_t lclamp(int64_t value, int64_t low, int64_t high) {
+ return value < low ? low : (value > high ? high : value);
+}
+
static INLINE uint16_t clip_pixel_highbd(int val, int bd) {
switch (bd) {
case 8: