summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorPaul Wilkins <paulwilkins@google.com>2017-02-09 17:17:55 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-02-09 17:17:55 +0000
commitc3f095c8b3c6eac510e892a7624162da1a655593 (patch)
tree47fff94edfc582a3e5948ea1d0bf40290d72bcaf /vp9/encoder
parent82b88a7fd0803e0b8b98f200324d4899158cf30e (diff)
parent5f21aba4b011602f87a5a10b619ec52fb8303075 (diff)
downloadlibvpx-c3f095c8b3c6eac510e892a7624162da1a655593.tar
libvpx-c3f095c8b3c6eac510e892a7624162da1a655593.tar.gz
libvpx-c3f095c8b3c6eac510e892a7624162da1a655593.tar.bz2
libvpx-c3f095c8b3c6eac510e892a7624162da1a655593.zip
Merge "Fix to avoid abrupt relaxation of max qindex in recode path"
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encoder.c10
-rw-r--r--vp9/encoder/vp9_ratectrl.c13
-rw-r--r--vp9/encoder/vp9_ratectrl.h2
3 files changed, 23 insertions, 2 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 323907fc3..50fa8c682 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -3507,8 +3507,14 @@ static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size,
// Frame is too large
if (rc->projected_frame_size > rc->this_frame_target) {
// Special case if the projected size is > the max allowed.
- if (rc->projected_frame_size >= rc->max_frame_bandwidth)
- q_high = rc->worst_quality;
+ if (rc->projected_frame_size >= rc->max_frame_bandwidth) {
+ double q_val_high;
+ q_val_high = vp9_convert_qindex_to_q(q_high, cm->bit_depth);
+ q_val_high = q_val_high * ((double)rc->projected_frame_size /
+ rc->max_frame_bandwidth);
+ q_high = vp9_convert_q_to_qindex(q_val_high, cm->bit_depth);
+ q_high = clamp(q_high, rc->best_quality, rc->worst_quality);
+ }
// Raise Qlow as to at least the current value
qstep =
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index 2013bf59e..03bc720a9 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -166,6 +166,19 @@ double vp9_convert_qindex_to_q(int qindex, vpx_bit_depth_t bit_depth) {
#endif
}
+int vp9_convert_q_to_qindex(double q_val, vpx_bit_depth_t bit_depth) {
+ int i;
+
+ for (i = 0; i < QINDEX_RANGE; ++i)
+ if (vp9_convert_qindex_to_q(i, bit_depth) >= q_val)
+ break;
+
+ if (i == QINDEX_RANGE)
+ i--;
+
+ return i;
+}
+
int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
double correction_factor, vpx_bit_depth_t bit_depth) {
const double q = vp9_convert_qindex_to_q(qindex, bit_depth);
diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h
index 70aef03ff..b119691fc 100644
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -179,6 +179,8 @@ int vp9_estimate_bits_at_q(FRAME_TYPE frame_kind, int q, int mbs,
double vp9_convert_qindex_to_q(int qindex, vpx_bit_depth_t bit_depth);
+int vp9_convert_q_to_qindex(double q_val, vpx_bit_depth_t bit_depth);
+
void vp9_rc_init_minq_luts(void);
int vp9_rc_get_default_min_gf_interval(int width, int height, double framerate);