Add layer_depth entry to gf_group
This prepares several experiments next. Currently it does not
affect the coding stats.
Change-Id: Iade5b5afc8a653d4479bff9da90191e2795c66fc
diff --git a/av1/encoder/firstpass.h b/av1/encoder/firstpass.h
index c23c60f..cfee3a8 100644
--- a/av1/encoder/firstpass.h
+++ b/av1/encoder/firstpass.h
@@ -30,6 +30,8 @@
#define VLOW_MOTION_THRESHOLD 950
+#define MAX_ARF_LAYERS 6
+
typedef struct {
// Frame number in display order, if stats are for a single frame.
// No real meaning for a collection of frames.
@@ -129,6 +131,7 @@
int ref_frame_gop_idx[MAX_STATIC_GF_GROUP_LENGTH][REF_FRAMES];
unsigned char pyramid_height;
unsigned char pyramid_lvl_nodes[MAX_PYRAMID_LVL];
+ int layer_depth[MAX_STATIC_GF_GROUP_LENGTH];
// This is currently only populated for AOM_Q mode
unsigned char q_val[MAX_STATIC_GF_GROUP_LENGTH];
int bit_allocation[MAX_STATIC_GF_GROUP_LENGTH];
diff --git a/av1/encoder/gop_structure.c b/av1/encoder/gop_structure.c
index 2432218..df7ef23 100644
--- a/av1/encoder/gop_structure.c
+++ b/av1/encoder/gop_structure.c
@@ -27,7 +27,8 @@
// Set parameters for frames between 'start' and 'end' (excluding both).
static void set_multi_layer_params(GF_GROUP *const gf_group, int start, int end,
- int *frame_ind, int arf_ind, int level) {
+ int *frame_ind, int arf_ind, int level,
+ int layer_depth) {
assert(level >= MIN_PYRAMID_LVL);
const int num_frames_to_process = end - start - 1;
assert(num_frames_to_process >= 0);
@@ -44,6 +45,7 @@
gf_group->arf_update_idx[*frame_ind] = arf_ind;
gf_group->frame_disp_idx[*frame_ind] = start;
gf_group->pyramid_level[*frame_ind] = MIN_PYRAMID_LVL;
+ gf_group->layer_depth[*frame_ind] = MAX_ARF_LAYERS;
++gf_group->pyramid_lvl_nodes[MIN_PYRAMID_LVL];
++(*frame_ind);
}
@@ -58,11 +60,13 @@
gf_group->arf_update_idx[*frame_ind] = 1; // mark all internal ARF 1
gf_group->frame_disp_idx[*frame_ind] = m;
gf_group->pyramid_level[*frame_ind] = level;
+ gf_group->layer_depth[*frame_ind] = layer_depth;
++gf_group->pyramid_lvl_nodes[level];
++(*frame_ind);
// Frames displayed before this internal ARF.
- set_multi_layer_params(gf_group, start, m, frame_ind, 1, level - 1);
+ set_multi_layer_params(gf_group, start, m, frame_ind, 1, level - 1,
+ layer_depth + 1);
// Overlay for internal ARF.
gf_group->update_type[*frame_ind] = INTNL_OVERLAY_UPDATE;
@@ -71,10 +75,12 @@
gf_group->arf_update_idx[*frame_ind] = 1;
gf_group->frame_disp_idx[*frame_ind] = m;
gf_group->pyramid_level[*frame_ind] = MIN_PYRAMID_LVL;
+ gf_group->layer_depth[*frame_ind] = layer_depth;
++(*frame_ind);
// Frames displayed after this internal ARF.
- set_multi_layer_params(gf_group, m, end, frame_ind, arf_ind, level - 1);
+ set_multi_layer_params(gf_group, m, end, frame_ind, arf_ind, level - 1,
+ layer_depth + 1);
}
}
@@ -95,6 +101,7 @@
gf_group->arf_pos_in_gf[frame_index] = 0;
gf_group->arf_update_idx[frame_index] = 0;
gf_group->pyramid_level[frame_index] = MIN_PYRAMID_LVL;
+ gf_group->layer_depth[frame_index] = 0;
++frame_index;
// ALTREF.
@@ -106,6 +113,7 @@
gf_group->arf_update_idx[frame_index] = 0;
gf_group->frame_disp_idx[frame_index] = gf_interval;
gf_group->pyramid_level[frame_index] = gf_group->pyramid_height;
+ gf_group->layer_depth[frame_index] = 1;
++frame_index;
}
@@ -113,8 +121,8 @@
const int next_height =
use_altref ? gf_group->pyramid_height - 1 : gf_group->pyramid_height;
assert(next_height >= MIN_PYRAMID_LVL);
- set_multi_layer_params(gf_group, 0, gf_interval, &frame_index, 0,
- next_height);
+ set_multi_layer_params(gf_group, 0, gf_interval, &frame_index, 0, next_height,
+ use_altref + 1);
return frame_index;
}