summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_ratectrl.c
diff options
context:
space:
mode:
authorMarco Paniconi <marpan@google.com>2018-06-27 13:04:18 -0700
committerMarco Paniconi <marpan@google.com>2018-06-27 13:44:34 -0700
commit8fd78299b97c2292ea3a8a4a24955ff14f0c1e35 (patch)
tree9d6aad6a4dc0b7370ad933168dad7b2f6ce50538 /vp9/encoder/vp9_ratectrl.c
parent3c20815a40557e5fce62d49bd4109eb1c8900778 (diff)
downloadlibvpx-8fd78299b97c2292ea3a8a4a24955ff14f0c1e35.tar
libvpx-8fd78299b97c2292ea3a8a4a24955ff14f0c1e35.tar.gz
libvpx-8fd78299b97c2292ea3a8a4a24955ff14f0c1e35.tar.bz2
libvpx-8fd78299b97c2292ea3a8a4a24955ff14f0c1e35.zip
vp9-svc: Set avg_frame_low_motion for lower layers.
The avg_frame_low_motion metric is only computed on the top spatial layer, and since its part of the layer context struct, it needs to written to all lower spatial layers for consistency. Small/minor change in metrics. Change-Id: I92a001c37aeb332e613212288b13a2ed9745af88
Diffstat (limited to 'vp9/encoder/vp9_ratectrl.c')
-rw-r--r--vp9/encoder/vp9_ratectrl.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index cea13b027..b1963370a 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -1517,6 +1517,7 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
const VP9_COMMON *const cm = &cpi->common;
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
RATE_CONTROL *const rc = &cpi->rc;
+ SVC *const svc = &cpi->svc;
const int qindex = cm->base_qindex;
// Update rate control heuristics
@@ -1605,10 +1606,9 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
// If second (long term) temporal reference is used for SVC,
// update the golden frame counter, only for base temporal layer.
- if (cpi->use_svc && cpi->svc.use_gf_temporal_ref_current_layer &&
- cpi->svc.temporal_layer_id == 0) {
+ if (cpi->use_svc && svc->use_gf_temporal_ref_current_layer &&
+ svc->temporal_layer_id == 0) {
int i = 0;
- SVC *const svc = &cpi->svc;
if (cpi->refresh_golden_frame)
rc->frames_since_golden = 0;
else
@@ -1642,19 +1642,31 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
if (cm->frame_type != KEY_FRAME &&
(!cpi->use_svc ||
(cpi->use_svc &&
- !cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame &&
- cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1))) {
+ !svc->layer_context[svc->temporal_layer_id].is_key_frame &&
+ svc->spatial_layer_id == svc->number_spatial_layers - 1))) {
compute_frame_low_motion(cpi);
if (cpi->sf.use_altref_onepass) update_altref_usage(cpi);
}
+ // For SVC: set avg_frame_low_motion (only computed on top spatial layer)
+ // to all lower spatial layers.
+ if (cpi->use_svc &&
+ svc->spatial_layer_id == svc->number_spatial_layers - 1) {
+ int i;
+ for (i = 0; i < svc->number_spatial_layers - 1; ++i) {
+ const int layer = LAYER_IDS_TO_IDX(i, svc->temporal_layer_id,
+ svc->number_temporal_layers);
+ LAYER_CONTEXT *const lc = &svc->layer_context[layer];
+ RATE_CONTROL *const lrc = &lc->rc;
+ lrc->avg_frame_low_motion = rc->avg_frame_low_motion;
+ }
+ }
cpi->rc.last_frame_is_src_altref = cpi->rc.is_src_frame_alt_ref;
}
if (cm->frame_type != KEY_FRAME) rc->reset_high_source_sad = 0;
rc->last_avg_frame_bandwidth = rc->avg_frame_bandwidth;
- if (cpi->use_svc &&
- cpi->svc.spatial_layer_id < cpi->svc.number_spatial_layers - 1)
- cpi->svc.lower_layer_qindex = cm->base_qindex;
+ if (cpi->use_svc && svc->spatial_layer_id < svc->number_spatial_layers - 1)
+ svc->lower_layer_qindex = cm->base_qindex;
}
void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) {