Factor intra mode search loop to its own function BUG=aomedia:2863 Change-Id: I598324e71b694230d1b225592b0d1cdf94c53d6e
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 026d9a1..e3e5edb 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -4764,9 +4764,9 @@ int skip_ref_frame_mask; int reach_first_comp_mode; int mode_thresh_mul_fact; - int *intra_mode_idx_ls; - int *intra_mode_num; - int *num_single_modes_processed; + int intra_mode_idx_ls[INTRA_MODES]; + int intra_mode_num; + int num_single_modes_processed; int prune_cpd_using_sr_stats_ready; } InterModeSFArgs; /*!\endcond */ @@ -4834,8 +4834,8 @@ return 1; // Intra modes will be handled in another loop later. - assert(*args->intra_mode_num < INTRA_MODES); - args->intra_mode_idx_ls[(*args->intra_mode_num)++] = mode_enum; + assert(args->intra_mode_num < INTRA_MODES); + args->intra_mode_idx_ls[args->intra_mode_num++] = mode_enum; return 1; } @@ -4844,7 +4844,7 @@ // for a reference frame. Only search compound modes that have a reference // frame at least as good as the 2nd best. if (!args->prune_cpd_using_sr_stats_ready && - *args->num_single_modes_processed == NUM_SINGLE_REF_MODES) { + args->num_single_modes_processed == NUM_SINGLE_REF_MODES) { find_top_ref(ref_frame_rd); args->prune_cpd_using_sr_stats_ready = 1; } @@ -5048,6 +5048,64 @@ } } +static AOM_INLINE void search_intra_modes_in_interframe( + InterModeSearchState *search_state, const AV1_COMP *cpi, MACROBLOCK *x, + RD_STATS *rd_cost, BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx, + InterModeSFArgs *sf_args, unsigned int intra_ref_frame_cost) { + const AV1_COMMON *const cm = &cpi->common; + const SPEED_FEATURES *const sf = &cpi->sf; + MACROBLOCKD *const xd = &x->e_mbd; + MB_MODE_INFO *const mbmi = xd->mi[0]; + for (int j = 0; j < sf_args->intra_mode_num; ++j) { + if (sf->intra_sf.skip_intra_in_interframe && + search_state->intra_search_state.skip_intra_modes) + break; + const THR_MODES mode_enum = sf_args->intra_mode_idx_ls[j]; + const MODE_DEFINITION *mode_def = &av1_mode_defs[mode_enum]; + const PREDICTION_MODE this_mode = mode_def->mode; + + assert(av1_mode_defs[mode_enum].ref_frame[0] == INTRA_FRAME); + assert(av1_mode_defs[mode_enum].ref_frame[1] == NONE_FRAME); + init_mbmi(mbmi, this_mode, av1_mode_defs[mode_enum].ref_frame, cm); + x->txfm_search_info.skip_txfm = 0; + + if (this_mode != DC_PRED) { + // Only search the oblique modes if the best so far is + // one of the neighboring directional modes + if ((sf->rt_sf.mode_search_skip_flags & FLAG_SKIP_INTRA_BESTINTER) && + (this_mode >= D45_PRED && this_mode <= PAETH_PRED)) { + if (search_state->best_mode_index != THR_INVALID && + search_state->best_mbmode.ref_frame[0] > INTRA_FRAME) + continue; + } + if (sf->rt_sf.mode_search_skip_flags & FLAG_SKIP_INTRA_DIRMISMATCH) { + if (conditional_skipintra( + this_mode, search_state->intra_search_state.best_intra_mode)) + continue; + } + } + + RD_STATS intra_rd_stats, intra_rd_stats_y, intra_rd_stats_uv; + intra_rd_stats.rdcost = av1_handle_intra_mode( + &search_state->intra_search_state, cpi, x, bsize, intra_ref_frame_cost, + ctx, &intra_rd_stats, &intra_rd_stats_y, &intra_rd_stats_uv, + search_state->best_rd, &search_state->best_intra_rd, + search_state->best_pred_rd); + + // Collect mode stats for multiwinner mode processing + const int txfm_search_done = 1; + store_winner_mode_stats( + &cpi->common, x, mbmi, &intra_rd_stats, &intra_rd_stats_y, + &intra_rd_stats_uv, mode_enum, NULL, bsize, intra_rd_stats.rdcost, + cpi->sf.winner_mode_sf.multi_winner_mode_type, txfm_search_done); + if (intra_rd_stats.rdcost < search_state->best_rd) { + update_search_state(search_state, rd_cost, ctx, &intra_rd_stats, + &intra_rd_stats_y, &intra_rd_stats_uv, mode_enum, x, + txfm_search_done); + } + } +} + // TODO(chiyotsai@google.com): See the todo for av1_rd_pick_intra_mode_sb. void av1_rd_pick_inter_mode_sb(struct AV1_COMP *cpi, struct TileDataEnc *tile_data, @@ -5144,10 +5202,6 @@ InterModesInfo *inter_modes_info = x->inter_modes_info; inter_modes_info->num = 0; - int intra_mode_num = 0; - int num_single_modes_processed = 0; - int intra_mode_idx_ls[INTRA_MODES]; - // Temporary buffers used by handle_inter_mode(). uint8_t *const tmp_buf = get_buf_by_bd(xd, x->tmp_pred_bufs[0]); @@ -5242,9 +5296,9 @@ skip_ref_frame_mask, 0, mode_thresh_mul_fact, - intra_mode_idx_ls, - &intra_mode_num, - &num_single_modes_processed, + {}, + 0, + 0, 0 }; // This is the main loop of this function. It loops over all possible modes @@ -5270,7 +5324,7 @@ init_mbmi(mbmi, this_mode, ref_frames, cm); txfm_info->skip_txfm = 0; - num_single_modes_processed += is_single_pred; + sf_args.num_single_modes_processed += is_single_pred; set_ref_ptrs(cm, xd, ref_frame, second_ref_frame); // Apply speed features to decide if this inter mode can be skipped @@ -5420,54 +5474,8 @@ } const unsigned int intra_ref_frame_cost = ref_costs_single[INTRA_FRAME]; - for (int j = 0; j < intra_mode_num; ++j) { - if (sf->intra_sf.skip_intra_in_interframe && - search_state.intra_search_state.skip_intra_modes) - break; - const THR_MODES mode_enum = intra_mode_idx_ls[j]; - const MODE_DEFINITION *mode_def = &av1_mode_defs[mode_enum]; - const PREDICTION_MODE this_mode = mode_def->mode; - - assert(av1_mode_defs[mode_enum].ref_frame[0] == INTRA_FRAME); - assert(av1_mode_defs[mode_enum].ref_frame[1] == NONE_FRAME); - init_mbmi(mbmi, this_mode, av1_mode_defs[mode_enum].ref_frame, cm); - txfm_info->skip_txfm = 0; - - if (this_mode != DC_PRED) { - // Only search the oblique modes if the best so far is - // one of the neighboring directional modes - if ((sf->rt_sf.mode_search_skip_flags & FLAG_SKIP_INTRA_BESTINTER) && - (this_mode >= D45_PRED && this_mode <= PAETH_PRED)) { - if (search_state.best_mode_index != THR_INVALID && - search_state.best_mbmode.ref_frame[0] > INTRA_FRAME) - continue; - } - if (sf->rt_sf.mode_search_skip_flags & FLAG_SKIP_INTRA_DIRMISMATCH) { - if (conditional_skipintra( - this_mode, search_state.intra_search_state.best_intra_mode)) - continue; - } - } - - RD_STATS intra_rd_stats, intra_rd_stats_y, intra_rd_stats_uv; - intra_rd_stats.rdcost = av1_handle_intra_mode( - &search_state.intra_search_state, cpi, x, bsize, intra_ref_frame_cost, - ctx, &intra_rd_stats, &intra_rd_stats_y, &intra_rd_stats_uv, - search_state.best_rd, &search_state.best_intra_rd, - search_state.best_pred_rd); - - // Collect mode stats for multiwinner mode processing - const int txfm_search_done = 1; - store_winner_mode_stats( - &cpi->common, x, mbmi, &intra_rd_stats, &intra_rd_stats_y, - &intra_rd_stats_uv, mode_enum, NULL, bsize, intra_rd_stats.rdcost, - cpi->sf.winner_mode_sf.multi_winner_mode_type, txfm_search_done); - if (intra_rd_stats.rdcost < search_state.best_rd) { - update_search_state(&search_state, rd_cost, ctx, &intra_rd_stats, - &intra_rd_stats_y, &intra_rd_stats_uv, mode_enum, x, - txfm_search_done); - } - } + search_intra_modes_in_interframe(&search_state, cpi, x, rd_cost, bsize, ctx, + &sf_args, intra_ref_frame_cost); #if CONFIG_COLLECT_COMPONENT_TIMING end_timing(cpi, handle_intra_mode_time); #endif