From 53291fa1177a204f9aaa6923475967a9ecdee4dc Mon Sep 17 00:00:00 2001 From: Debargha Mukherjee Date: Mon, 14 Nov 2016 18:29:03 -0800 Subject: [PATCH] Some minor changes for global motion. Increases amortization blocks. Improves results a little. Also adds aom_clear_system_state() calls correctly to avoid some occasional crash issues. Change-Id: Ib776ee5ec30c70c1cd4a1fae7e7f23c2acc58ef6 --- av1/encoder/encodeframe.c | 3 ++- av1/encoder/rdopt.c | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index bbd84d5d5..3d2b210f0 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c @@ -4784,7 +4784,6 @@ static void encode_frame_internal(AV1_COMP *cpi) { av1_zero(rdc->comp_pred_diff); #if CONFIG_GLOBAL_MOTION - aom_clear_system_state(); av1_zero(cpi->global_motion_used); for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) { set_default_gmparams(&cm->global_motion[i]); @@ -4797,6 +4796,7 @@ static void encode_frame_internal(AV1_COMP *cpi) { for (frame = LAST_FRAME; frame <= ALTREF_FRAME; ++frame) { ref_buf = get_ref_frame_buffer(cpi, frame); if (ref_buf) { + aom_clear_system_state(); if (compute_global_motion_feature_based(GLOBAL_TRANS_TYPES - 1, cpi->Source, ref_buf, params)) { convert_model_to_params(params, &cm->global_motion[frame]); @@ -4824,6 +4824,7 @@ static void encode_frame_internal(AV1_COMP *cpi) { set_default_gmparams(&cm->global_motion[frame]); } } + aom_clear_system_state(); } } } diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 3242f3d54..f189bd8ff 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c @@ -4351,15 +4351,22 @@ static int get_gmbitcost(const WarpedMotionParams *gm, const aom_prob *probs) { case IDENTITY: bits = 0; break; default: assert(0); return 0; } + assert(type < GLOBAL_TRANS_TYPES); return bits ? (bits << AV1_PROB_COST_SHIFT) + gmtype_cost[type] : 0; } -#define GLOBAL_MOTION_RATE(ref) \ - (cpi->global_motion_used[ref] >= 2 \ - ? 0 \ - : get_gmbitcost(&cm->global_motion[(ref)], \ - cm->fc->global_motion_types_prob) / \ - 2); +#define GLOBAL_MOTION_COST_AMORTIZATION_BLKS 8 + +#if GLOBAL_MOTION_COST_AMORTIZATION_BLKS > 0 +#define GLOBAL_MOTION_RATE(ref) \ + (cpi->global_motion_used[ref] >= GLOBAL_MOTION_COST_AMORTIZATION_BLKS \ + ? 0 \ + : get_gmbitcost(&cm->global_motion[(ref)], \ + cm->fc->global_motion_types_prob) / \ + GLOBAL_MOTION_COST_AMORTIZATION_BLKS); +#else +#define GLOBAL_MOTION_RATE(ref) 0 +#endif // GLOBAL_MOTION_COST_AMORTIZATION_BLKS > 0 #endif // CONFIG_GLOBAL_MOTION static int set_and_cost_bmi_mvs(const AV1_COMP *const cpi, MACROBLOCK *x, -- GitLab