single_filter[this_mode][refs[0]] = mbmi->interp_filter;
#endif
- if (cpi->sf.adaptive_mode_search)
- if (is_comp_pred)
-#if CONFIG_EXT_INTER
- switch (this_mode) {
- case NEAREST_NEARESTMV:
- if (single_skippable[NEARESTMV][refs[0]] &&
- single_skippable[NEARESTMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case ZERO_ZEROMV:
- if (single_skippable[ZEROMV][refs[0]] &&
- single_skippable[ZEROMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEW_NEWMV:
- if (single_skippable[NEWMV][refs[0]] &&
- single_skippable[NEWMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEAREST_NEWMV:
- if (single_skippable[NEARESTMV][refs[0]] &&
- single_skippable[NEWMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEAR_NEWMV:
- if (single_skippable[NEARMV][refs[0]] &&
- single_skippable[NEWMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEW_NEARESTMV:
- if (single_skippable[NEWMV][refs[0]] &&
- single_skippable[NEARESTMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEW_NEARMV:
- if (single_skippable[NEWMV][refs[0]] &&
- single_skippable[NEARMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEAREST_NEARMV:
- if (single_skippable[NEARESTMV][refs[0]] &&
- single_skippable[NEARMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEAR_NEARMV:
- if (single_skippable[NEARMV][refs[0]] &&
- single_skippable[NEARMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- case NEAR_NEARESTMV:
- if (single_skippable[NEARMV][refs[0]] &&
- single_skippable[NEARESTMV][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- default:
- if (single_skippable[this_mode][refs[0]] &&
- single_skippable[this_mode][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
- break;
- }
-#else
- if (single_skippable[this_mode][refs[0]] &&
- single_skippable[this_mode][refs[1]])
- memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm));
-#endif // CONFIG_EXT_INTER
-
+ #if CONFIG_EXT_INTER
+ if (modelled_rd != NULL) {
+ if (is_comp_pred) {
+ const int mode0 = compound_ref0_mode(this_mode);
+ const int mode1 = compound_ref1_mode(this_mode);
+ int64_t mrd = VPXMIN(modelled_rd[mode0][refs[0]],
+ modelled_rd[mode1][refs[1]]);
+ if (rd / 4 * 3 > mrd && ref_best_rd < INT64_MAX) {
+ restore_dst_buf(xd, orig_dst, orig_dst_stride);
+ return INT64_MAX;
+ }
+ } else if (!is_comp_interintra_pred) {
+ modelled_rd[this_mode][refs[0]] = rd;
+ }
+ }
+ #endif // CONFIG_EXT_INTER
+
if (cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) {
// if current pred_error modeled rd is substantially more than the best
// so far, do not bother doing full rd