Refactor GlobalMotionInfo from AV1_COMP
This CL groups global motion related variables from AV1_COMP
into a new struct GlobalMotionInfo, adds documentation for
the members, and cleans up function interfaces.
BUG=aomedia:2610
Change-Id: I5817a55867f18a9d203e6981a375cea52f1b06cb
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 2f23751..3240c54 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5453,7 +5453,7 @@
// Skip global motion estimation for invalid ref frames
if (buf == NULL ||
(ref_disabled && cpi->sf.hl_sf.recode_loop != DISALLOW_RECODE)) {
- cpi->gmparams_cost[frame] = 0;
+ cpi->gm_info.params_cost[frame] = 0;
continue;
} else {
ref_buf[frame] = &buf->buf;
@@ -5491,6 +5491,7 @@
MotionModel *params_by_motion, uint8_t *segment_map,
const int segment_map_w, const int segment_map_h) {
AV1_COMMON *const cm = &cpi->common;
+ GlobalMotionInfo *const gm_info = &cpi->gm_info;
const WarpedMotionParams *ref_params =
cm->prev_frame ? &cm->prev_frame->global_motion[frame]
: &default_warp_params;
@@ -5499,11 +5500,11 @@
cpi, ref_buf, frame, num_frm_corners, frm_corners, frm_buffer,
params_by_motion, segment_map, segment_map_w, segment_map_h, ref_params);
- cpi->gmparams_cost[frame] =
+ gm_info->params_cost[frame] =
gm_get_params_cost(&cm->global_motion[frame], ref_params,
cm->features.allow_high_precision_mv) +
- cpi->gmtype_cost[cm->global_motion[frame].wmtype] -
- cpi->gmtype_cost[IDENTITY];
+ gm_info->type_cost[cm->global_motion[frame].wmtype] -
+ gm_info->type_cost[IDENTITY];
}
static int compare_distance(const void *a, const void *b) {
@@ -5606,6 +5607,7 @@
FeatureFlags *const features = &cm->features;
MACROBLOCKD *const xd = &x->e_mbd;
RD_COUNTS *const rdc = &cpi->td.rd_counts;
+ GlobalMotionInfo *const gm_info = &cpi->gm_info;
int i;
if (!cpi->sf.rt_sf.use_nonrd_pick_mode) {
@@ -5787,9 +5789,9 @@
start_timing(cpi, av1_compute_global_motion_time);
#endif
av1_zero(rdc->global_motion_used);
- av1_zero(cpi->gmparams_cost);
+ av1_zero(gm_info->params_cost);
if (cpi->common.current_frame.frame_type == INTER_FRAME && cpi->source &&
- cpi->oxcf.enable_global_motion && !cpi->global_motion_search_done) {
+ cpi->oxcf.enable_global_motion && !gm_info->search_done) {
YV12_BUFFER_CONFIG *ref_buf[REF_FRAMES];
MotionModel params_by_motion[RANSAC_NUM_MOTIONS];
for (int m = 0; m < RANSAC_NUM_MOTIONS; m++) {
@@ -5857,7 +5859,7 @@
aom_free(segment_map);
- cpi->global_motion_search_done = 1;
+ gm_info->search_done = 1;
for (int m = 0; m < RANSAC_NUM_MOTIONS; m++) {
aom_free(params_by_motion[m].inliers);
}
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 3e91c03..d894fa4 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3812,18 +3812,18 @@
#endif // OUTPUT_YUV_REC
#define GM_RECODE_LOOP_NUM4X4_FACTOR 192
-static int recode_loop_test_global_motion(AV1_COMP *cpi) {
+static int recode_loop_test_global_motion(
+ WarpedMotionParams *const global_motion,
+ const int *const global_motion_used, int *const gm_params_cost) {
int i;
int recode = 0;
- RD_COUNTS *const rdc = &cpi->td.rd_counts;
- AV1_COMMON *const cm = &cpi->common;
for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
- if (cm->global_motion[i].wmtype != IDENTITY &&
- rdc->global_motion_used[i] * GM_RECODE_LOOP_NUM4X4_FACTOR <
- cpi->gmparams_cost[i]) {
- cm->global_motion[i] = default_warp_params;
- assert(cm->global_motion[i].wmtype == IDENTITY);
- cpi->gmparams_cost[i] = 0;
+ if (global_motion[i].wmtype != IDENTITY &&
+ global_motion_used[i] * GM_RECODE_LOOP_NUM4X4_FACTOR <
+ gm_params_cost[i]) {
+ global_motion[i] = default_warp_params;
+ assert(global_motion[i].wmtype == IDENTITY);
+ gm_params_cost[i] = 0;
recode = 1;
// TODO(sarahparker): The earlier condition for recoding here was:
// "recode |= (rdc->global_motion_used[i] > 0);". Can we bring something
@@ -4048,7 +4048,7 @@
for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
cm->global_motion[i] = default_warp_params;
}
- cpi->global_motion_search_done = 0;
+ cpi->gm_info.search_done = 0;
if (frame_is_intra_only(cm)) set_screen_content_options(cpi, features);
cpi->is_screen_content_type = (features->allow_screen_content_tools != 0);
@@ -5366,6 +5366,7 @@
static int encode_with_recode_loop(AV1_COMP *cpi, size_t *size, uint8_t *dest) {
AV1_COMMON *const cm = &cpi->common;
RATE_CONTROL *const rc = &cpi->rc;
+ GlobalMotionInfo *const gm_info = &cpi->gm_info;
const int allow_recode = (cpi->sf.hl_sf.recode_loop != DISALLOW_RECODE);
// Must allow recode if minimum compression ratio is set.
assert(IMPLIES(cpi->oxcf.min_cr > 0, allow_recode));
@@ -5465,10 +5466,10 @@
// if frame was scaled calculate global_motion_search again if already
// done
- if (loop_count > 0 && cpi->source && cpi->global_motion_search_done) {
+ if (loop_count > 0 && cpi->source && gm_info->search_done) {
if (cpi->source->y_crop_width != cm->width ||
cpi->source->y_crop_height != cm->height) {
- cpi->global_motion_search_done = 0;
+ gm_info->search_done = 0;
}
}
cpi->source =
@@ -5549,7 +5550,7 @@
// then we need to reset the global motion vectors
if (loop_count > 0 &&
cm->features.allow_high_precision_mv != last_loop_allow_hp) {
- cpi->global_motion_search_done = 0;
+ gm_info->search_done = 0;
}
last_loop_allow_hp = cm->features.allow_high_precision_mv;
}
@@ -5607,7 +5608,9 @@
}
if (allow_recode && !cpi->sf.gm_sf.gm_disable_recode &&
- recode_loop_test_global_motion(cpi)) {
+ recode_loop_test_global_motion(cm->global_motion,
+ cpi->td.rd_counts.global_motion_used,
+ gm_info->params_cost)) {
loop = 1;
}
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 4048842..c12d48b 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -820,6 +820,20 @@
#define MAX_INTERNAL_ARFS (REF_FRAMES - BWDREF_FRAME - 1)
typedef struct {
+ // Array to store the cost for signalling each global motion model.
+ // gmtype_cost[i] stores the cost of signalling the ith Global Motion model.
+ int type_cost[TRANS_TYPES];
+
+ // Array to store the cost for signalling a particular global motion model for
+ // each reference frame. gmparams_cost[i] stores the cost of signalling global
+ // motion for the ith reference frame.
+ int params_cost[REF_FRAMES];
+
+ // Flag to indicate if global motion search needs to be rerun.
+ bool search_done;
+} GlobalMotionInfo;
+
+typedef struct {
int arf_stack[FRAME_BUFFERS];
int arf_stack_size;
int lst_stack[FRAME_BUFFERS];
@@ -946,8 +960,8 @@
CODING_CONTEXT coding_context;
- int gmtype_cost[TRANS_TYPES];
- int gmparams_cost[REF_FRAMES];
+ // Parameters related to global motion search.
+ GlobalMotionInfo gm_info;
int64_t last_time_stamp_seen;
int64_t last_end_time_stamp_seen;
@@ -1090,7 +1104,6 @@
AVxWorker *workers;
struct EncWorkerData *tile_thr_data;
int existing_fb_idx_to_show;
- int global_motion_search_done;
int internal_altref_allowed;
// A flag to indicate if intrabc is ever used in current frame.
int intrabc_used;
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 21b75bd..3d13cda 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -616,8 +616,8 @@
// TRANSLATION: 3 bits
// ROTZOOM: 2 bits
// AFFINE: 3 bits
- cpi->gmtype_cost[i] = (1 + (i > 0 ? (i == ROTZOOM ? 1 : 2) : 0))
- << AV1_PROB_COST_SHIFT;
+ cpi->gm_info.type_cost[i] = (1 + (i > 0 ? (i == ROTZOOM ? 1 : 2) : 0))
+ << AV1_PROB_COST_SHIFT;
}
}