summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorangiebird <angiebird@google.com>2019-10-23 17:21:52 -0700
committerangiebird <angiebird@google.com>2019-10-29 09:56:12 -0700
commit7cd76b428a240df81cc8d71d8911ef870633cffa (patch)
tree791681d452690293dd9850d804f3036046aa6b63 /vp9/encoder
parentc75cb7beb207c279a19d301d61f43ce51ca65788 (diff)
downloadlibvpx-7cd76b428a240df81cc8d71d8911ef870633cffa.tar
libvpx-7cd76b428a240df81cc8d71d8911ef870633cffa.tar.gz
libvpx-7cd76b428a240df81cc8d71d8911ef870633cffa.tar.bz2
libvpx-7cd76b428a240df81cc8d71d8911ef870633cffa.zip
Add get_arf_layers()
Change-Id: Ibde94f52235a37e122e6a548d71cb230e7b28368
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_firstpass.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c
index 3a195c794..3554f482f 100644
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2620,6 +2620,22 @@ static RANGE get_active_gf_inverval_range(
return active_gf_interval;
}
+static int get_arf_layers(int multi_layer_arf, int max_layers,
+ int coding_frame_num) {
+ assert(max_layers <= MAX_ARF_LAYERS);
+ if (multi_layer_arf) {
+ int layers = 0;
+ int i;
+ for (i = coding_frame_num; i > 0; i >>= 1) {
+ ++layers;
+ }
+ layers = VPXMIN(max_layers, layers);
+ return layers;
+ } else {
+ return 1;
+ }
+}
+
static void define_gf_group(VP9_COMP *cpi, int gf_start_show_idx) {
VP9_COMMON *const cm = &cpi->common;
RATE_CONTROL *const rc = &cpi->rc;
@@ -2649,7 +2665,7 @@ static void define_gf_group(VP9_COMP *cpi, int gf_start_show_idx) {
const int arf_active_or_kf = is_key_frame || rc->source_alt_ref_active;
int is_alt_ref_flash = 0;
- double gop_intra_factor = 1.0;
+ double gop_intra_factor;
int gop_frames;
RANGE active_gf_interval;
@@ -2664,16 +2680,13 @@ static void define_gf_group(VP9_COMP *cpi, int gf_start_show_idx) {
active_gf_interval = get_active_gf_inverval_range(
frame_info, rc, arf_active_or_kf, gf_start_show_idx,
twopass->active_worst_quality, rc->last_boosted_qindex);
- if (cpi->multi_layer_arf) {
- int layers = 0;
- int max_layers = VPXMIN(MAX_ARF_LAYERS, cpi->oxcf.enable_auto_arf);
- int i;
- // Adapt the intra_error factor to active_max_gf_interval limit.
- for (i = active_gf_interval.max; i > 0; i >>= 1) ++layers;
-
- layers = VPXMIN(max_layers, layers);
- gop_intra_factor += (layers * 0.25);
+ if (cpi->multi_layer_arf) {
+ int arf_layers = get_arf_layers(cpi->multi_layer_arf, oxcf->enable_auto_arf,
+ active_gf_interval.max);
+ gop_intra_factor = 1.0 + 0.25 * arf_layers;
+ } else {
+ gop_intra_factor = 1.0;
}
{