Group ref frame config params in AV1EncoderConfig
This CL groups the configuration params related to reference frames
in AV1EncoderConfig into a new struct RefFrameCfg, adds the relevant
documentation, and cleans up function interfaces.
BUG=aomedia:2701
Change-Id: I17ecb1676039f51958026bfd1f9f9fb0b02bf74b
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index ae9ccfd..3eab5fa 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -932,15 +932,18 @@
oxcf->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
}
+ // Set reference frame related configuration.
+ oxcf->ref_frm_cfg.max_reference_frames = extra_cfg->max_reference_frames;
+ oxcf->ref_frm_cfg.enable_reduced_reference_set =
+ extra_cfg->enable_reduced_reference_set;
+ oxcf->ref_frm_cfg.enable_onesided_comp = extra_cfg->enable_onesided_comp;
+
oxcf->row_mt = extra_cfg->row_mt;
oxcf->monochrome = cfg->monochrome;
oxcf->full_still_picture_hdr = cfg->full_still_picture_hdr;
oxcf->enable_dual_filter = extra_cfg->enable_dual_filter;
oxcf->enable_order_hint = extra_cfg->enable_order_hint;
- oxcf->max_reference_frames = extra_cfg->max_reference_frames;
- oxcf->enable_reduced_reference_set = extra_cfg->enable_reduced_reference_set;
- oxcf->enable_onesided_comp = extra_cfg->enable_onesided_comp;
oxcf->enable_interintra_comp = extra_cfg->enable_interintra_comp;
oxcf->enable_ref_frame_mvs =
extra_cfg->enable_ref_frame_mvs & extra_cfg->enable_order_hint;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index f01c3bd..e2dd1ba 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -490,6 +490,15 @@
COST_UPDATE_TYPE mv;
} CostUpdateFreq;
+typedef struct {
+ // Indicates the maximum number of reference frames allowed per frame.
+ unsigned int max_reference_frames;
+ // Indicates if the reduced set of references should be enabled.
+ bool enable_reduced_reference_set;
+ // Indicates if one-sided compound should be enabled.
+ bool enable_onesided_comp;
+} RefFrameCfg;
+
typedef struct AV1EncoderConfig {
BITSTREAM_PROFILE profile;
aom_bit_depth_t bit_depth; // Codec bit-depth.
@@ -615,6 +624,9 @@
// Configuration related to decoder model.
DecoderModelCfg dec_model_cfg;
+ // Configuration related to reference frames.
+ RefFrameCfg ref_frm_cfg;
+
uint8_t cdf_update_mode;
aom_superblock_size_t superblock_size;
uint8_t monochrome;
@@ -624,10 +636,7 @@
unsigned int sb_multipass_unit_test;
int enable_order_hint;
int enable_ref_frame_mvs;
- unsigned int max_reference_frames;
- int enable_reduced_reference_set;
unsigned int allow_ref_frame_mvs;
- int enable_onesided_comp;
int enable_interintra_comp;
int enable_global_motion;
int enable_overlay;
@@ -2682,12 +2691,12 @@
GOLDEN_FRAME,
};
-static INLINE int get_max_allowed_ref_frames(const AV1_COMP *cpi) {
+static INLINE int get_max_allowed_ref_frames(
+ int selective_ref_frame, unsigned int max_reference_frames) {
const unsigned int max_allowed_refs_for_given_speed =
- (cpi->sf.inter_sf.selective_ref_frame >= 3) ? INTER_REFS_PER_FRAME - 1
- : INTER_REFS_PER_FRAME;
- return AOMMIN(max_allowed_refs_for_given_speed,
- cpi->oxcf.max_reference_frames);
+ (selective_ref_frame >= 3) ? INTER_REFS_PER_FRAME - 1
+ : INTER_REFS_PER_FRAME;
+ return AOMMIN(max_allowed_refs_for_given_speed, max_reference_frames);
}
static const MV_REFERENCE_FRAME
@@ -2737,7 +2746,9 @@
}
}
- const int max_allowed_refs = get_max_allowed_ref_frames(cpi);
+ const int max_allowed_refs =
+ get_max_allowed_ref_frames(cpi->sf.inter_sf.selective_ref_frame,
+ cpi->oxcf.ref_frm_cfg.max_reference_frames);
for (int i = 0; i < 4 && total_valid_refs > max_allowed_refs; ++i) {
const MV_REFERENCE_FRAME ref_frame_to_disable = disable_order[i];
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index cddd99c..ddb3cf7 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -3270,7 +3270,7 @@
return;
}
- if ((!cpi->oxcf.enable_onesided_comp ||
+ if ((!cpi->oxcf.ref_frm_cfg.enable_onesided_comp ||
cpi->sf.inter_sf.disable_onesided_comp) &&
cpi->all_one_sided_refs) {
return;
@@ -3659,7 +3659,7 @@
if (sf->rt_sf.use_real_time_ref_set)
ref_set = REF_SET_REALTIME;
- else if (cpi->oxcf.enable_reduced_reference_set)
+ else if (cpi->oxcf.ref_frm_cfg.enable_reduced_reference_set)
ref_set = REF_SET_REDUCED;
default_skip_mask(mask, ref_set);
@@ -4078,7 +4078,7 @@
}
const int comp_pred = ref_frame[1] > INTRA_FRAME;
- if ((!cpi->oxcf.enable_onesided_comp ||
+ if ((!cpi->oxcf.ref_frm_cfg.enable_onesided_comp ||
cpi->sf.inter_sf.disable_onesided_comp) &&
comp_pred && cpi->all_one_sided_refs) {
return 1;