Modularize initial frame dimensions in AV1_COMP
This CL groups initial frame dimensions in AV1_COMP into a new
struct InitialDimensions, and cleans up related function
interfaces.
BUG=aomedia:2610
Change-Id: I6bffd644d77302f4b504909bf310753090199b45
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index cdd4fab..955dd77 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -1030,6 +1030,7 @@
static aom_codec_err_t encoder_set_config(aom_codec_alg_priv_t *ctx,
const aom_codec_enc_cfg_t *cfg) {
+ InitialDimensions *const initial_dimensions = &ctx->cpi->initial_dimensions;
aom_codec_err_t res;
int force_key = 0;
@@ -1037,8 +1038,10 @@
if (cfg->g_lag_in_frames > 1 || cfg->g_pass != AOM_RC_ONE_PASS)
ERROR("Cannot change width or height after initialization");
if (!valid_ref_frame_size(ctx->cfg.g_w, ctx->cfg.g_h, cfg->g_w, cfg->g_h) ||
- (ctx->cpi->initial_width && (int)cfg->g_w > ctx->cpi->initial_width) ||
- (ctx->cpi->initial_height && (int)cfg->g_h > ctx->cpi->initial_height))
+ (initial_dimensions->width &&
+ (int)cfg->g_w > initial_dimensions->width) ||
+ (initial_dimensions->height &&
+ (int)cfg->g_h > initial_dimensions->height))
force_key = 1;
}
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index a174a58..80ce652 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2785,6 +2785,7 @@
RATE_CONTROL *const rc = &cpi->rc;
MACROBLOCK *const x = &cpi->td.mb;
AV1LevelParams *const level_params = &cpi->level_params;
+ InitialDimensions *const initial_dimensions = &cpi->initial_dimensions;
if (seq_params->profile != oxcf->profile) seq_params->profile = oxcf->profile;
seq_params->bit_depth = oxcf->bit_depth;
@@ -2935,15 +2936,16 @@
seq_params->tier[i] = (oxcf->tier_mask >> i) & 1;
}
- if (cpi->initial_width || sb_size != seq_params->sb_size) {
- if (cm->width > cpi->initial_width || cm->height > cpi->initial_height ||
+ if (initial_dimensions->width || sb_size != seq_params->sb_size) {
+ if (cm->width > initial_dimensions->width ||
+ cm->height > initial_dimensions->height ||
seq_params->sb_size != sb_size) {
av1_free_context_buffers(cm);
av1_free_shared_coeff_buffer(&cpi->td.shared_coeff_buf);
av1_free_sms_tree(&cpi->td);
alloc_compressor_data(cpi);
realloc_segmentation_maps(cpi);
- cpi->initial_width = cpi->initial_height = 0;
+ initial_dimensions->width = initial_dimensions->height = 0;
}
}
update_frame_size(cpi);
@@ -4308,8 +4310,10 @@
int subsampling_x, int subsampling_y) {
AV1_COMMON *const cm = &cpi->common;
SequenceHeader *const seq_params = &cm->seq_params;
+ InitialDimensions *const initial_dimensions = &cpi->initial_dimensions;
- if (!cpi->initial_width || seq_params->use_highbitdepth != use_highbitdepth ||
+ if (!initial_dimensions->width ||
+ seq_params->use_highbitdepth != use_highbitdepth ||
seq_params->subsampling_x != subsampling_x ||
seq_params->subsampling_y != subsampling_y) {
seq_params->subsampling_x = subsampling_x;
@@ -4327,8 +4331,8 @@
init_motion_estimation(cpi); // TODO(agrange) This can be removed.
- cpi->initial_width = cm->width;
- cpi->initial_height = cm->height;
+ initial_dimensions->width = cm->width;
+ initial_dimensions->height = cm->height;
cpi->initial_mbs = cm->mi_params.MBs;
}
}
@@ -4336,6 +4340,7 @@
// Returns 1 if the assigned width or height was <= 0.
int av1_set_size_literal(AV1_COMP *cpi, int width, int height) {
AV1_COMMON *cm = &cpi->common;
+ InitialDimensions *const initial_dimensions = &cpi->initial_dimensions;
av1_check_initial_width(cpi, cm->seq_params.use_highbitdepth,
cm->seq_params.subsampling_x,
cm->seq_params.subsampling_y);
@@ -4345,14 +4350,15 @@
cm->width = width;
cm->height = height;
- if (cpi->initial_width && cpi->initial_height &&
- (cm->width > cpi->initial_width || cm->height > cpi->initial_height)) {
+ if (initial_dimensions->width && initial_dimensions->height &&
+ (cm->width > initial_dimensions->width ||
+ cm->height > initial_dimensions->height)) {
av1_free_context_buffers(cm);
av1_free_shared_coeff_buffer(&cpi->td.shared_coeff_buf);
av1_free_sms_tree(&cpi->td);
alloc_compressor_data(cpi);
realloc_segmentation_maps(cpi);
- cpi->initial_width = cpi->initial_height = 0;
+ initial_dimensions->width = initial_dimensions->height = 0;
}
update_frame_size(cpi);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 8213ade..1308a49 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -896,6 +896,11 @@
} GlobalMotionInfo;
typedef struct {
+ int width;
+ int height;
+} InitialDimensions;
+
+typedef struct {
// Stores the default value of skip flag depending on chroma format
// Set as 1 for monochrome and 3 for other color formats
int default_interp_skip_flags;
@@ -1247,8 +1252,13 @@
FRAME_INFO frame_info;
- int initial_width;
- int initial_height;
+ // Tracks the frame dimensions(width and height) using which:
+ // a) Frame buffers(like altref and util frame buffers) were allocated
+ // b) ME related initializations were done
+ // This structure is helpful to reallocate / reinitialize above when there is
+ // a change in frame dimensions.
+ InitialDimensions initial_dimensions;
+
int initial_mbs; // Number of MBs in the full-size frame; to be used to
// normalize the firstpass stats. This will differ from the
// number of MBs in the current frame when the frame is
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c
index 3bc5162..724e4ac 100644
--- a/av1/encoder/firstpass.c
+++ b/av1/encoder/firstpass.c
@@ -203,9 +203,9 @@
// Refine the motion search range according to the frame dimension
// for first pass test.
-static int get_search_range(const AV1_COMP *cpi) {
+static int get_search_range(const InitialDimensions *initial_dimensions) {
int sr = 0;
- const int dim = AOMMIN(cpi->initial_width, cpi->initial_height);
+ const int dim = AOMMIN(initial_dimensions->width, initial_dimensions->height);
while ((dim << sr) < MAX_FULL_PEL_VAL) ++sr;
return sr;
@@ -221,7 +221,7 @@
const BLOCK_SIZE bsize = xd->mi[0]->sb_type;
aom_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize];
const int new_mv_mode_penalty = NEW_MV_MODE_PENALTY;
- const int sr = get_search_range(cpi);
+ const int sr = get_search_range(&cpi->initial_dimensions);
const int step_param = 3 + sr;
const search_site_config *first_pass_search_sites =
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index 0c73e99..6607402 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -988,9 +988,10 @@
GF_GROUP_STATS *gf_stats) {
RATE_CONTROL *const rc = &cpi->rc;
TWO_PASS *const twopass = &cpi->twopass;
+ InitialDimensions *const initial_dimensions = &cpi->initial_dimensions;
// Motion breakout threshold for loop below depends on image size.
const double mv_ratio_accumulator_thresh =
- (cpi->initial_height + cpi->initial_width) / 4.0;
+ (initial_dimensions->height + initial_dimensions->width) / 4.0;
if (!flash_detected) {
// Break clause to detect very still sections after motion. For example,