summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_aq_cyclicrefresh.c
diff options
context:
space:
mode:
authorMarco <marpan@google.com>2017-02-15 13:51:14 -0800
committerMarco <marpan@google.com>2017-02-15 14:07:04 -0800
commit158b300952b1b70c7d99c792cb8e763d6c508f4d (patch)
tree046eb44dcb1b8cf7d8067c3b9c6ac3d514dd813d /vp9/encoder/vp9_aq_cyclicrefresh.c
parent725606a6783b293d45434b3dba75bd34e04c22d9 (diff)
downloadlibvpx-158b300952b1b70c7d99c792cb8e763d6c508f4d.tar
libvpx-158b300952b1b70c7d99c792cb8e763d6c508f4d.tar.gz
libvpx-158b300952b1b70c7d99c792cb8e763d6c508f4d.tar.bz2
libvpx-158b300952b1b70c7d99c792cb8e763d6c508f4d.zip
vp9: Some code cleanup for aq-mode = 3.
The weight segment needs to only be computed once per frame, so remove it from the funciton vp9_cyclic_refresh_rc_bits_per_mb(), which is called within a loop inside vp9_rc_regulate_q. Change-Id: Ia0e18b89abb97e42c466d4dbc47700d7f76555db
Diffstat (limited to 'vp9/encoder/vp9_aq_cyclicrefresh.c')
-rw-r--r--vp9/encoder/vp9_aq_cyclicrefresh.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/vp9/encoder/vp9_aq_cyclicrefresh.c b/vp9/encoder/vp9_aq_cyclicrefresh.c
index 0e8e11ca7..5f6ee5bdb 100644
--- a/vp9/encoder/vp9_aq_cyclicrefresh.c
+++ b/vp9/encoder/vp9_aq_cyclicrefresh.c
@@ -127,31 +127,16 @@ int vp9_cyclic_refresh_rc_bits_per_mb(const VP9_COMP *cpi, int i,
const VP9_COMMON *const cm = &cpi->common;
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
int bits_per_mb;
- int num8x8bl = cm->MBs << 2;
int deltaq = 0;
- // Weight for segment prior to encoding: take the average of the target
- // number for the frame to be encoded and the actual from the previous frame.
- // Use the target if its less.
- int target_refresh = cr->percent_refresh * cm->mi_rows * cm->mi_cols / 100;
- double weight_segment_target = (double)(target_refresh) / num8x8bl;
- double weight_segment =
- (double)((target_refresh + cr->actual_num_seg1_blocks +
- cr->actual_num_seg2_blocks) >>
- 1) /
- num8x8bl;
- if (weight_segment_target < 7 * weight_segment / 8)
- weight_segment = weight_segment_target;
- // Compute delta-q corresponding to qindex i.
- // Take a quick estimate for speed >=8, half of the max allowed deltaq.
if (cpi->oxcf.speed < 8)
deltaq = compute_deltaq(cpi, i, cr->rate_ratio_qdelta);
else
deltaq = -(cr->max_qdelta_perc * i) / 200;
// Take segment weighted average for bits per mb.
- bits_per_mb = (int)((1.0 - weight_segment) *
+ bits_per_mb = (int)((1.0 - cr->weight_segment) *
vp9_rc_bits_per_mb(cm->frame_type, i,
correction_factor, cm->bit_depth) +
- weight_segment *
+ cr->weight_segment *
vp9_rc_bits_per_mb(cm->frame_type, i + deltaq,
correction_factor, cm->bit_depth));
return bits_per_mb;
@@ -458,6 +443,10 @@ void vp9_cyclic_refresh_update_parameters(VP9_COMP *const cpi) {
const RATE_CONTROL *const rc = &cpi->rc;
const VP9_COMMON *const cm = &cpi->common;
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
+ int num8x8bl = cm->MBs << 2;
+ int target_refresh = 0;
+ double weight_segment_target = 0;
+ double weight_segment = 0;
cr->percent_refresh = 10;
if (cr->reduce_refresh) cr->percent_refresh = 5;
cr->max_qdelta_perc = 60;
@@ -505,6 +494,19 @@ void vp9_cyclic_refresh_update_parameters(VP9_COMP *const cpi) {
cr->rate_ratio_qdelta = 1.0;
}
}
+ // Weight for segment prior to encoding: take the average of the target
+ // number for the frame to be encoded and the actual from the previous frame.
+ // Use the target if its less. To be used for setting the base qp for the
+ // frame in vp9_rc_regulate_q.
+ target_refresh = cr->percent_refresh * cm->mi_rows * cm->mi_cols / 100;
+ weight_segment_target = (double)(target_refresh) / num8x8bl;
+ weight_segment = (double)((target_refresh + cr->actual_num_seg1_blocks +
+ cr->actual_num_seg2_blocks) >>
+ 1) /
+ num8x8bl;
+ if (weight_segment_target < 7 * weight_segment / 8)
+ weight_segment = weight_segment_target;
+ cr->weight_segment = weight_segment;
}
// Setup cyclic background refresh: set delta q and segmentation map.