Factor out motion mode speed feature handling
No change in performance
BUG=aomedia:2615
Change-Id: I83fcbc6c1d3837e39be7e9d07315d43ae658efef
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index bc6af31..1ff3751 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -4322,6 +4322,49 @@
// Indicates number of winner simple translation modes to be used
static const unsigned int num_winner_motion_modes[3] = { 0, 10, 3 };
+// Adds a motion mode to the candidate list for motion_mode_for_winner_cand
+// speed feature. This list consists of modes that have only searched
+// SIMPLE_TRANSLATION. The final list will be used to search other motion
+// modes after the initial RD search.
+static void handle_winner_cand(
+ MB_MODE_INFO *const mbmi,
+ motion_mode_best_st_candidate *best_motion_mode_cands,
+ int max_winner_motion_mode_cand, int64_t this_rd,
+ motion_mode_candidate *motion_mode_cand, int skip_motion_mode) {
+ // Number of current motion mode candidates in list
+ const int num_motion_mode_cand = best_motion_mode_cands->num_motion_mode_cand;
+ int valid_motion_mode_cand_loc = num_motion_mode_cand;
+
+ // find the best location to insert new motion mode candidate
+ for (int j = 0; j < num_motion_mode_cand; j++) {
+ if (this_rd < best_motion_mode_cands->motion_mode_cand[j].rd_cost) {
+ valid_motion_mode_cand_loc = j;
+ break;
+ }
+ }
+
+ // Insert motion mode if location is found
+ if (valid_motion_mode_cand_loc < max_winner_motion_mode_cand) {
+ if (num_motion_mode_cand > 0 &&
+ valid_motion_mode_cand_loc < max_winner_motion_mode_cand - 1)
+ memmove(
+ &best_motion_mode_cands
+ ->motion_mode_cand[valid_motion_mode_cand_loc + 1],
+ &best_motion_mode_cands->motion_mode_cand[valid_motion_mode_cand_loc],
+ (AOMMIN(num_motion_mode_cand, max_winner_motion_mode_cand - 1) -
+ valid_motion_mode_cand_loc) *
+ sizeof(best_motion_mode_cands->motion_mode_cand[0]));
+ motion_mode_cand->mbmi = *mbmi;
+ motion_mode_cand->rd_cost = this_rd;
+ motion_mode_cand->skip_motion_mode = skip_motion_mode;
+ best_motion_mode_cands->motion_mode_cand[valid_motion_mode_cand_loc] =
+ *motion_mode_cand;
+ best_motion_mode_cands->num_motion_mode_cand =
+ AOMMIN(max_winner_motion_mode_cand,
+ best_motion_mode_cands->num_motion_mode_cand + 1);
+ }
+}
+
void av1_rd_pick_inter_mode_sb(AV1_COMP *cpi, TileDataEnc *tile_data,
MACROBLOCK *x, RD_STATS *rd_cost,
const BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx,
@@ -4611,38 +4654,11 @@
search_state.best_skip_rd[1] = skip_rd[1];
}
if (cpi->sf.winner_mode_sf.motion_mode_for_winner_cand) {
- const int num_motion_mode_cand =
- best_motion_mode_cands.num_motion_mode_cand;
- int valid_motion_mode_cand_loc = num_motion_mode_cand;
-
- // find the best location to insert new motion mode candidate
- for (int j = 0; j < num_motion_mode_cand; j++) {
- if (this_rd < best_motion_mode_cands.motion_mode_cand[j].rd_cost) {
- valid_motion_mode_cand_loc = j;
- break;
- }
- }
-
- if (valid_motion_mode_cand_loc < max_winner_motion_mode_cand) {
- if (num_motion_mode_cand > 0 &&
- valid_motion_mode_cand_loc < max_winner_motion_mode_cand - 1)
- memmove(
- &best_motion_mode_cands
- .motion_mode_cand[valid_motion_mode_cand_loc + 1],
- &best_motion_mode_cands
- .motion_mode_cand[valid_motion_mode_cand_loc],
- (AOMMIN(num_motion_mode_cand, max_winner_motion_mode_cand - 1) -
- valid_motion_mode_cand_loc) *
- sizeof(best_motion_mode_cands.motion_mode_cand[0]));
- motion_mode_cand.mbmi = *mbmi;
- motion_mode_cand.rd_cost = this_rd;
- motion_mode_cand.skip_motion_mode = args.skip_motion_mode;
- best_motion_mode_cands.motion_mode_cand[valid_motion_mode_cand_loc] =
- motion_mode_cand;
- best_motion_mode_cands.num_motion_mode_cand =
- AOMMIN(max_winner_motion_mode_cand,
- best_motion_mode_cands.num_motion_mode_cand + 1);
- }
+ // Add this mode to motion mode candidate list for motion mode search
+ // if using motion_mode_for_winner_cand speed feature
+ handle_winner_cand(mbmi, &best_motion_mode_cands,
+ max_winner_motion_mode_cand, this_rd,
+ &motion_mode_cand, args.skip_motion_mode);
}
/* keep record of best compound/single-only prediction */