• Home
  • Raw
  • Download

Lines Matching +full:enable +full:- +full:golden +full:- +full:tests

50           : early_term_thresh[early_term_idx - 1][size_group];  in early_term_inter_search_with_sse()
60 bp->best_sse = INT64_MAX; in init_best_pickmode()
61 bp->best_mode = NEARESTMV; in init_best_pickmode()
62 bp->best_ref_frame = LAST_FRAME; in init_best_pickmode()
63 bp->best_second_ref_frame = NONE_FRAME; in init_best_pickmode()
64 bp->best_tx_size = TX_8X8; in init_best_pickmode()
65 bp->tx_type = DCT_DCT; in init_best_pickmode()
66 bp->best_pred_filter = av1_broadcast_interp_filter(EIGHTTAP_REGULAR); in init_best_pickmode()
67 bp->best_mode_skip_txfm = 0; in init_best_pickmode()
68 bp->best_mode_initial_skip_flag = 0; in init_best_pickmode()
69 bp->best_pred = NULL; in init_best_pickmode()
70 bp->best_motion_mode = SIMPLE_TRANSLATION; in init_best_pickmode()
71 bp->num_proj_ref = 0; in init_best_pickmode()
72 av1_zero(bp->wm_params); in init_best_pickmode()
73 av1_zero(bp->pmi); in init_best_pickmode()
81 BEST_PICKMODE *const best_pickmode = &search_state->best_pickmode; in update_search_state_nonrd()
83 best_pickmode->best_sse = sse_y; in update_search_state_nonrd()
84 best_pickmode->best_mode = this_best_mode; in update_search_state_nonrd()
85 best_pickmode->best_motion_mode = mi->motion_mode; in update_search_state_nonrd()
86 best_pickmode->wm_params = mi->wm_params; in update_search_state_nonrd()
87 best_pickmode->num_proj_ref = mi->num_proj_ref; in update_search_state_nonrd()
88 best_pickmode->best_pred_filter = mi->interp_filters; in update_search_state_nonrd()
89 best_pickmode->best_tx_size = mi->tx_size; in update_search_state_nonrd()
90 best_pickmode->best_ref_frame = mi->ref_frame[0]; in update_search_state_nonrd()
91 best_pickmode->best_second_ref_frame = mi->ref_frame[1]; in update_search_state_nonrd()
92 best_pickmode->best_mode_skip_txfm = search_state->this_rdc.skip_txfm; in update_search_state_nonrd()
93 best_pickmode->best_mode_initial_skip_flag = in update_search_state_nonrd()
94 (nonskip_rdc->rate == INT_MAX && search_state->this_rdc.skip_txfm); in update_search_state_nonrd()
95 if (!best_pickmode->best_mode_skip_txfm) { in update_search_state_nonrd()
96 memcpy(ctx->blk_skip, txfm_info->blk_skip, in update_search_state_nonrd()
97 sizeof(txfm_info->blk_skip[0]) * ctx->num_4x4_blk); in update_search_state_nonrd()
104 const int frame_lowmotion = cpi->rc.avg_frame_low_motion; in subpel_select()
106 cpi->sf.rt_sf.reduce_mv_pel_precision_highmotion; in subpel_select()
108 // Reduce MV precision for higher int MV value & frame-level motion in subpel_select()
112 (cpi->common.width * cpi->common.height <= 320 * 240); in subpel_select()
116 if (abs(mv->as_fullmv.row) >= mv_thresh || in subpel_select()
117 abs(mv->as_fullmv.col) >= mv_thresh) in subpel_select()
122 const int th_idx = reduce_mv_pel_precision_highmotion - 1; in subpel_select()
130 if (abs(mv->as_fullmv.row) >= (mv_thresh << 1) || in subpel_select()
131 abs(mv->as_fullmv.col) >= (mv_thresh << 1)) in subpel_select()
133 else if (abs(mv->as_fullmv.row) >= mv_thresh || in subpel_select()
134 abs(mv->as_fullmv.col) >= mv_thresh) in subpel_select()
137 // Reduce MV precision for relatively static (e.g. background), low-complex in subpel_select()
139 if (cpi->sf.rt_sf.reduce_mv_pel_precision_lowcomplex >= 2) { in subpel_select()
140 const int qband = x->qindex >> (QINDEX_BITS - 2); in subpel_select()
142 if (x->content_state_sb.source_sad_nonrd <= kVeryLowSad && in subpel_select()
144 if (x->source_variance < 500) in subpel_select()
146 else if (x->source_variance < 5000) in subpel_select()
149 } else if (cpi->sf.rt_sf.reduce_mv_pel_precision_lowcomplex >= 1) { in subpel_select()
154 return cpi->sf.mv_sf.subpel_force_stop; in subpel_select()
161 const int qband = x->qindex >> (QINDEX_BITS - 2); in use_aggressive_subpel_search_method()
164 (x->content_state_sb.source_sad_nonrd <= kLowSad) || in use_aggressive_subpel_search_method()
165 (x->source_variance < 100))) in use_aggressive_subpel_search_method()
178 * \param[in] cpi Top-level encoder structure
196 MACROBLOCKD *xd = &x->e_mbd; in combined_motion_search()
197 const AV1_COMMON *cm = &cpi->common; in combined_motion_search()
198 const SPEED_FEATURES *sf = &cpi->sf; in combined_motion_search()
199 MB_MODE_INFO *mi = xd->mi[0]; in combined_motion_search()
200 int step_param = (sf->rt_sf.fullpel_search_step_param) in combined_motion_search()
201 ? sf->rt_sf.fullpel_search_step_param in combined_motion_search()
202 : cpi->mv_search_params.mv_step_param; in combined_motion_search()
204 const int ref = mi->ref_frame[0]; in combined_motion_search()
205 const MV ref_mv = av1_get_ref_mv(x, mi->ref_mv_idx).as_mv; in combined_motion_search()
217 center_mv = tmp_mv->as_mv; in combined_motion_search()
220 av1_get_default_mv_search_method(x, &cpi->sf.mv_sf, bsize); in combined_motion_search()
231 &tmp_mv->as_fullmv, &best_mv_stats, NULL); in combined_motion_search()
234 MV mvp_full = get_mv_from_fullmv(&tmp_mv->as_fullmv); in combined_motion_search()
236 *rate_mv = av1_mv_bit_cost(&mvp_full, &ref_mv, x->mv_costs->nmv_joint_cost, in combined_motion_search()
237 x->mv_costs->mv_cost_stack, MV_COST_WEIGHT); in combined_motion_search()
240 rv = !(RDCOST(x->rdmult, (*rate_mv), 0) > best_rd_sofar); in combined_motion_search()
250 if (sf->rt_sf.reduce_mv_pel_precision_highmotion || in combined_motion_search()
251 sf->rt_sf.reduce_mv_pel_precision_lowcomplex) in combined_motion_search()
255 MV subpel_start_mv = get_mv_from_fullmv(&tmp_mv->as_fullmv); in combined_motion_search()
259 x, sf->rt_sf.use_adaptive_subpel_search, fullpel_performed_well)) in combined_motion_search()
261 xd, cm, &ms_params, subpel_start_mv, &best_mv_stats, &tmp_mv->as_mv, in combined_motion_search()
262 &dis, &x->pred_sse[ref], NULL); in combined_motion_search()
264 cpi->mv_search_params.find_fractional_mv_step( in combined_motion_search()
265 xd, cm, &ms_params, subpel_start_mv, &best_mv_stats, &tmp_mv->as_mv, in combined_motion_search()
266 &dis, &x->pred_sse[ref], NULL); in combined_motion_search()
268 av1_mv_bit_cost(&tmp_mv->as_mv, &ref_mv, x->mv_costs->nmv_joint_cost, in combined_motion_search()
269 x->mv_costs->mv_cost_stack, MV_COST_WEIGHT); in combined_motion_search()
273 rv = (tmp_mv->as_mv.col != ref_mv.col || tmp_mv->as_mv.row != ref_mv.row); in combined_motion_search()
283 * complexity ME for non-LAST frames or calls \c combined_motion_search
285 * \param[in] cpi Top-level encoder structure
293 * for GOLDEN frame
301 * \return Returns -1 if the search was not done, otherwise returns 0.
310 MACROBLOCKD *const xd = &x->e_mbd; in search_new_mv()
311 MB_MODE_INFO *const mi = xd->mi[0]; in search_new_mv()
312 AV1_COMMON *cm = &cpi->common; in search_new_mv()
315 if (ref_frame > LAST_FRAME && cpi->oxcf.rc_cfg.mode == AOM_CBR && in search_new_mv()
320 if (bsize < BLOCK_16X16) return -1; in search_new_mv()
326 &x->mbmi_ext.ref_mv_stack[ref_frame][0].this_mv.as_mv, &y_sad_zero, in search_new_mv()
329 if (tmp_sad > x->pred_mv_sad[LAST_FRAME]) return -1; in search_new_mv()
331 this_ref_frm_newmv->as_int = mi->mv[0].as_int; in search_new_mv()
332 int_mv best_mv = mi->mv[0]; in search_new_mv()
336 this_ref_frm_newmv->as_mv.row >>= 3; in search_new_mv()
337 this_ref_frm_newmv->as_mv.col >>= 3; in search_new_mv()
341 if (cpi->sf.rt_sf.reduce_mv_pel_precision_highmotion || in search_new_mv()
342 cpi->sf.rt_sf.reduce_mv_pel_precision_lowcomplex) { in search_new_mv()
349 cpi->mv_search_params.find_fractional_mv_step( in search_new_mv()
351 &x->pred_sse[ref_frame], NULL); in search_new_mv()
352 this_ref_frm_newmv->as_int = best_mv.as_int; in search_new_mv()
358 if (this_ref_frm_newmv->as_mv.col == ref_mv.col && in search_new_mv()
359 this_ref_frm_newmv->as_mv.row == ref_mv.row) in search_new_mv()
360 return -1; in search_new_mv()
362 *rate_mv = av1_mv_bit_cost(&this_ref_frm_newmv->as_mv, &ref_mv, in search_new_mv()
363 x->mv_costs->nmv_joint_cost, in search_new_mv()
364 x->mv_costs->mv_cost_stack, MV_COST_WEIGHT); in search_new_mv()
366 rate_mv, best_rdc->rdcost, 0)) { in search_new_mv()
367 return -1; in search_new_mv()
379 segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME); in estimate_single_ref_frame_costs()
385 mode_costs->intra_inter_cost[intra_inter_ctx][0]; in estimate_single_ref_frame_costs()
386 unsigned int base_cost = mode_costs->intra_inter_cost[intra_inter_ctx][1]; in estimate_single_ref_frame_costs()
387 if (cm->current_frame.reference_mode == REFERENCE_MODE_SELECT && in estimate_single_ref_frame_costs()
390 base_cost += mode_costs->comp_ref_type_cost[comp_ref_type_ctx][1]; in estimate_single_ref_frame_costs()
395 // add cost for last, golden, altref in estimate_single_ref_frame_costs()
396 ref_costs_single[LAST_FRAME] += mode_costs->single_ref_cost[0][0][0]; in estimate_single_ref_frame_costs()
397 ref_costs_single[GOLDEN_FRAME] += mode_costs->single_ref_cost[0][0][1]; in estimate_single_ref_frame_costs()
398 ref_costs_single[GOLDEN_FRAME] += mode_costs->single_ref_cost[0][1][0]; in estimate_single_ref_frame_costs()
399 ref_costs_single[ALTREF_FRAME] += mode_costs->single_ref_cost[0][0][1]; in estimate_single_ref_frame_costs()
400 ref_costs_single[ALTREF_FRAME] += mode_costs->single_ref_cost[0][2][0]; in estimate_single_ref_frame_costs()
407 if (x->txfm_search_params.tx_mode_search_type == TX_MODE_SELECT && in set_force_skip_flag()
408 cpi->sf.rt_sf.tx_size_level_based_on_qstep && in set_force_skip_flag()
409 cpi->sf.rt_sf.tx_size_level_based_on_qstep >= 2) { in set_force_skip_flag()
410 const int qstep = x->plane[AOM_PLANE_Y].dequant_QTX[1] >> (x->e_mbd.bd - 5); in set_force_skip_flag()
417 if (sse < qstep_sq && x->source_variance < qstep_sq && in set_force_skip_flag()
418 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] == 0 && in set_force_skip_flag()
419 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] == 0) in set_force_skip_flag()
431 MACROBLOCKD *const xd = &x->e_mbd; in calculate_tx_size()
433 const TxfmSearchParams *txfm_params = &x->txfm_search_params; in calculate_tx_size()
434 if (txfm_params->tx_mode_search_type == TX_MODE_SELECT) { in calculate_tx_size()
439 if (cpi->sf.rt_sf.tx_size_level_based_on_qstep) { in calculate_tx_size()
440 const int qband = x->qindex >> (QINDEX_BITS - 2); in calculate_tx_size()
444 const int qstep = x->plane[AOM_PLANE_Y].dequant_QTX[1] >> (xd->bd - 5); in calculate_tx_size()
447 if (cpi->sf.rt_sf.tx_size_level_based_on_qstep >= 2) { in calculate_tx_size()
453 if (sse < qstep_sq && x->source_variance < qstep_sq && in calculate_tx_size()
454 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] == 0 && in calculate_tx_size()
455 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] == 0) in calculate_tx_size()
467 tx_mode_to_biggest_tx_size[txfm_params->tx_mode_search_type]); in calculate_tx_size()
471 if (cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && in calculate_tx_size()
472 cyclic_refresh_segment_id_boosted(xd->mi[0]->segment_id) && is_high_var) in calculate_tx_size()
479 tx_mode_to_biggest_tx_size[txfm_params->tx_mode_search_type]); in calculate_tx_size()
482 if (CAP_TX_SIZE_FOR_BSIZE_GT32(txfm_params->tx_mode_search_type, bsize)) in calculate_tx_size()
542 const int nw = 1 << (bw - b_width_log2_lookup[unit_size]); in calculate_variance()
543 const int nh = 1 << (bh - b_height_log2_lookup[unit_size]); in calculate_variance()
552 var_o[k] = sse_o[k] - (uint32_t)(((int64_t)sum_o[k] * sum_o[k]) >> in calculate_variance()
576 AV1_COMMON *const cm = &cpi->common; in set_early_term_based_on_uv_plane()
577 struct macroblock_plane *const p = &x->plane[AOM_PLANE_Y]; in set_early_term_based_on_uv_plane()
578 const uint32_t dc_quant = p->dequant_QTX[0]; in set_early_term_based_on_uv_plane()
579 const uint32_t ac_quant = p->dequant_QTX[1]; in set_early_term_based_on_uv_plane()
589 if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc(cpi) && in set_early_term_based_on_uv_plane()
590 cpi->oxcf.speed > 5) in set_early_term_based_on_uv_plane()
591 ac_thr = av1_scale_acskip_thresh(ac_thr, cpi->denoiser.denoising_level, in set_early_term_based_on_uv_plane()
592 norm_sum, cpi->svc.temporal_layer_id); in set_early_term_based_on_uv_plane()
594 ac_thr *= ac_thr_factor(cpi->oxcf.speed, cm->width, cm->height, norm_sum); in set_early_term_based_on_uv_plane()
596 ac_thr *= ac_thr_factor(cpi->oxcf.speed, cm->width, cm->height, norm_sum); in set_early_term_based_on_uv_plane()
600 if (cpi->sf.rt_sf.increase_source_sad_thresh) { in set_early_term_based_on_uv_plane()
612 if (!(sse_tx[k] - var_tx[k] < dc_thr || sse == var)) { in set_early_term_based_on_uv_plane()
625 int j = plane - 1; in set_early_term_based_on_uv_plane()
627 if (x->color_sensitivity[COLOR_SENS_IDX(plane)]) { in set_early_term_based_on_uv_plane()
629 struct macroblock_plane *const puv = &x->plane[plane]; in set_early_term_based_on_uv_plane()
630 struct macroblockd_plane *const puvd = &xd->plane[plane]; in set_early_term_based_on_uv_plane()
632 bsize, puvd->subsampling_x, puvd->subsampling_y); in set_early_term_based_on_uv_plane()
634 const int shift_ac = cpi->sf.rt_sf.increase_source_sad_thresh ? 5 : 3; in set_early_term_based_on_uv_plane()
635 const int shift_dc = cpi->sf.rt_sf.increase_source_sad_thresh ? 4 : 3; in set_early_term_based_on_uv_plane()
637 (puv->dequant_QTX[0] * puv->dequant_QTX[0]) >> shift_dc; in set_early_term_based_on_uv_plane()
639 (puv->dequant_QTX[1] * puv->dequant_QTX[1]) >> shift_ac; in set_early_term_based_on_uv_plane()
642 var_uv[j] = cpi->ppi->fn_ptr[uv_bsize].vf(puv->src.buf, puv->src.stride, in set_early_term_based_on_uv_plane()
643 puvd->dst.buf, in set_early_term_based_on_uv_plane()
644 puvd->dst.stride, &sse_uv[j]); in set_early_term_based_on_uv_plane()
646 (sse_uv[j] - var_uv[j] < uv_dc_thr || sse_uv[j] == var_uv[j])) in set_early_term_based_on_uv_plane()
668 model_rd_with_curvfit(cpi, x, bsize, AOM_PLANE_Y, rd_stats->sse, bw * bh, in calc_rate_dist_block_param()
669 &rd_stats->rate, &rd_stats->dist); in calc_rate_dist_block_param()
673 rd_stats->rate = 0; in calc_rate_dist_block_param()
674 rd_stats->dist = sse << 4; in calc_rate_dist_block_param()
690 struct macroblock_plane *const p = &x->plane[AOM_PLANE_Y]; in model_skip_for_sb_y_large_64()
691 struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; in model_skip_for_sb_y_large_64()
699 assert(xd->mi[0]->tx_size == TX_16X16); in model_skip_for_sb_y_large_64()
704 block_variance_16x16_dual(p->src.buf, p->src.stride, pd->dst.buf, in model_skip_for_sb_y_large_64()
705 pd->dst.stride, 4 << bw, 4 << bh, &sse, &sum, 16, in model_skip_for_sb_y_large_64()
708 var = sse - (unsigned int)(((int64_t)sum * sum) >> (bw + bh + 4)); in model_skip_for_sb_y_large_64()
716 rd_stats->sse = sse; in model_skip_for_sb_y_large_64()
722 MB_MODE_INFO *const mi = xd->mi[0]; in model_skip_for_sb_y_large_64()
723 if (!calculate_rd && cpi->sf.rt_sf.sse_early_term_inter_search && in model_skip_for_sb_y_large_64()
725 cpi->sf.rt_sf.sse_early_term_inter_search, bsize, sse, best_sse, in model_skip_for_sb_y_large_64()
726 mi->mode)) in model_skip_for_sb_y_large_64()
735 const unsigned int num_block = (1 << (bw + bh - 2)) >> 2; in model_skip_for_sb_y_large_64()
751 if (x->force_zeromv_skip_for_blk) { in model_skip_for_sb_y_large()
753 rd_stats->rate = 0; in model_skip_for_sb_y_large()
754 rd_stats->dist = 0; in model_skip_for_sb_y_large()
755 rd_stats->sse = 0; in model_skip_for_sb_y_large()
763 const TxfmSearchParams *txfm_params = &x->txfm_search_params; in model_skip_for_sb_y_large()
764 if (CAP_TX_SIZE_FOR_BSIZE_GT32(txfm_params->tx_mode_search_type, bsize)) { in model_skip_for_sb_y_large()
765 xd->mi[0]->tx_size = TX_SIZE_FOR_BSIZE_GT32; in model_skip_for_sb_y_large()
776 struct macroblock_plane *const p = &x->plane[AOM_PLANE_Y]; in model_skip_for_sb_y_large()
777 struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; in model_skip_for_sb_y_large()
791 block_variance(p->src.buf, p->src.stride, pd->dst.buf, pd->dst.stride, in model_skip_for_sb_y_large()
793 var = sse - (unsigned int)(((int64_t)sum * sum) >> (bw + bh + 4)); in model_skip_for_sb_y_large()
801 rd_stats->sse = sse; in model_skip_for_sb_y_large()
809 xd->mi[0]->tx_size = tx_size; in model_skip_for_sb_y_large()
811 MB_MODE_INFO *const mi = xd->mi[0]; in model_skip_for_sb_y_large()
812 if (!calculate_rd && cpi->sf.rt_sf.sse_early_term_inter_search && in model_skip_for_sb_y_large()
814 cpi->sf.rt_sf.sse_early_term_inter_search, bsize, sse, best_sse, in model_skip_for_sb_y_large()
815 mi->mode)) in model_skip_for_sb_y_large()
827 unsigned int num_blks = 1 << (bw + bh - 2); in model_skip_for_sb_y_large()
848 if (x->force_zeromv_skip_for_blk && early_term != NULL) { in model_rd_for_sb_y()
850 rd_stats->rate = 0; in model_rd_for_sb_y()
851 rd_stats->dist = 0; in model_rd_for_sb_y()
852 rd_stats->sse = 0; in model_rd_for_sb_y()
858 const int ref = xd->mi[0]->ref_frame[0]; in model_rd_for_sb_y()
862 struct macroblock_plane *const p = &x->plane[AOM_PLANE_Y]; in model_rd_for_sb_y()
863 struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; in model_rd_for_sb_y()
868 unsigned int var = cpi->ppi->fn_ptr[bsize].vf( in model_rd_for_sb_y()
869 p->src.buf, p->src.stride, pd->dst.buf, pd->dst.stride, &sse); in model_rd_for_sb_y()
871 xd->mi[0]->tx_size = calculate_tx_size(cpi, bsize, x, var, sse, &force_skip); in model_rd_for_sb_y()
885 rd_stats->sse = sse; in model_rd_for_sb_y()
886 x->pred_sse[ref] = (unsigned int)AOMMIN(sse, UINT_MAX); in model_rd_for_sb_y()
895 rd_stats->skip_txfm = (rate == 0); in model_rd_for_sb_y()
897 rd_stats->rate = rate; in model_rd_for_sb_y()
898 rd_stats->dist = dist; in model_rd_for_sb_y()
908 if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) { in get_drl_cost()
909 uint8_t drl_ctx = av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx); in get_drl_cost()
919 if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) { in get_drl_cost()
920 uint8_t drl_ctx = av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx); in get_drl_cost()
921 cost += drl_mode_cost0[drl_ctx][ref_mv_idx != (idx - 1)]; in get_drl_cost()
922 if (ref_mv_idx == (idx - 1)) return cost; in get_drl_cost()
934 ->inter_compound_mode_cost[mode_context][INTER_COMPOUND_OFFSET(mode)]; in cost_mv_ref()
943 mode_cost = mode_costs->newmv_mode_cost[mode_ctx][0]; in cost_mv_ref()
946 mode_cost = mode_costs->newmv_mode_cost[mode_ctx][1]; in cost_mv_ref()
950 mode_cost += mode_costs->zeromv_mode_cost[mode_ctx][0]; in cost_mv_ref()
953 mode_cost += mode_costs->zeromv_mode_cost[mode_ctx][1]; in cost_mv_ref()
955 mode_cost += mode_costs->refmv_mode_cost[mode_ctx][mode != NEARESTMV]; in cost_mv_ref()
977 (mv_row > 16 || mv_row < -16 || mv_col > 16 || mv_col < -16)) { in newmv_diff_bias()
978 this_rdc->rdcost = this_rdc->rdcost << 2; in newmv_diff_bias()
981 if (xd->above_mbmi) { in newmv_diff_bias()
982 above_mv_valid = xd->above_mbmi->mv[0].as_int != INVALID_MV; in newmv_diff_bias()
983 above_row = xd->above_mbmi->mv[0].as_mv.row; in newmv_diff_bias()
984 above_col = xd->above_mbmi->mv[0].as_mv.col; in newmv_diff_bias()
986 if (xd->left_mbmi) { in newmv_diff_bias()
987 left_mv_valid = xd->left_mbmi->mv[0].as_int != INVALID_MV; in newmv_diff_bias()
988 left_row = xd->left_mbmi->mv[0].as_mv.row; in newmv_diff_bias()
989 left_col = xd->left_mbmi->mv[0].as_mv.col; in newmv_diff_bias()
1003 row_diff = al_mv_average_row - mv_row; in newmv_diff_bias()
1004 col_diff = al_mv_average_col - mv_col; in newmv_diff_bias()
1005 if (row_diff > 80 || row_diff < -80 || col_diff > 80 || col_diff < -80) { in newmv_diff_bias()
1007 this_rdc->rdcost = this_rdc->rdcost << 1; in newmv_diff_bias()
1009 this_rdc->rdcost = 5 * this_rdc->rdcost >> 2; in newmv_diff_bias()
1014 (mv_row > 64 || mv_row < -64 || mv_col > 64 || mv_col < -64)) in newmv_diff_bias()
1015 this_rdc->rdcost = 5 * this_rdc->rdcost >> 2; in newmv_diff_bias()
1025 const BLOCK_SIZE min_size = AOMMAX(bsize - 3, BLOCK_4X4); in update_thresh_freq_fact()
1028 int *freq_fact = &x->thresh_freq_fact[bs][thr_mode_idx]; in update_thresh_freq_fact()
1030 *freq_fact -= (*freq_fact >> 4); in update_thresh_freq_fact()
1034 cpi->sf.inter_sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT); in update_thresh_freq_fact()
1045 ctx_den->zero_last_cost_orig = zero_last_cost_orig; in av1_pickmode_ctx_den_update()
1046 ctx_den->ref_frame_cost = ref_frame_cost; in av1_pickmode_ctx_den_update()
1047 ctx_den->frame_mv = frame_mv; in av1_pickmode_ctx_den_update()
1048 ctx_den->reuse_inter_pred = reuse_inter_pred; in av1_pickmode_ctx_den_update()
1049 ctx_den->best_tx_size = bp->best_tx_size; in av1_pickmode_ctx_den_update()
1050 ctx_den->best_mode = bp->best_mode; in av1_pickmode_ctx_den_update()
1051 ctx_den->best_ref_frame = bp->best_ref_frame; in av1_pickmode_ctx_den_update()
1052 ctx_den->best_pred_filter = bp->best_pred_filter; in av1_pickmode_ctx_den_update()
1053 ctx_den->best_mode_skip_txfm = bp->best_mode_skip_txfm; in av1_pickmode_ctx_den_update()
1061 // If INTRA or GOLDEN reference was selected, re-evaluate ZEROMV on in recheck_zeromv_after_denoising()
1065 if (cpi->noise_estimate.enabled && cpi->noise_estimate.level > kLow && in recheck_zeromv_after_denoising()
1066 ctx_den->zero_last_cost_orig < (best_rdc->rdcost << 3) && in recheck_zeromv_after_denoising()
1067 ((ctx_den->best_ref_frame == INTRA_FRAME && decision >= FILTER_BLOCK) || in recheck_zeromv_after_denoising()
1068 (ctx_den->best_ref_frame == GOLDEN_FRAME && in recheck_zeromv_after_denoising()
1069 cpi->svc.number_spatial_layers == 1 && in recheck_zeromv_after_denoising()
1072 AV1_COMMON *const cm = &cpi->common; in recheck_zeromv_after_denoising()
1074 const ModeCosts *mode_costs = &x->mode_costs; in recheck_zeromv_after_denoising()
1075 TxfmSearchInfo *txfm_info = &x->txfm_search_info; in recheck_zeromv_after_denoising()
1076 MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext; in recheck_zeromv_after_denoising()
1078 mi->mode = GLOBALMV; in recheck_zeromv_after_denoising()
1079 mi->ref_frame[0] = LAST_FRAME; in recheck_zeromv_after_denoising()
1080 mi->ref_frame[1] = NONE_FRAME; in recheck_zeromv_after_denoising()
1081 set_ref_ptrs(cm, xd, mi->ref_frame[0], NONE_FRAME); in recheck_zeromv_after_denoising()
1082 mi->mv[0].as_int = 0; in recheck_zeromv_after_denoising()
1083 mi->interp_filters = av1_broadcast_interp_filter(EIGHTTAP_REGULAR); in recheck_zeromv_after_denoising()
1084 xd->plane[AOM_PLANE_Y].pre[0] = yv12_mb[LAST_FRAME][AOM_PLANE_Y]; in recheck_zeromv_after_denoising()
1090 av1_mode_context_analyzer(mbmi_ext->mode_context, mi->ref_frame); in recheck_zeromv_after_denoising()
1093 this_rdc.rate += ctx_den->ref_frame_cost[LAST_FRAME]; in recheck_zeromv_after_denoising()
1094 this_rdc.rdcost = RDCOST(x->rdmult, this_rdc.rate, this_rdc.dist); in recheck_zeromv_after_denoising()
1095 txfm_info->skip_txfm = this_rdc.skip_txfm; in recheck_zeromv_after_denoising()
1098 if (this_rdc.rdcost > best_rdc->rdcost) { in recheck_zeromv_after_denoising()
1100 mi->mode = best_pickmode->best_mode; in recheck_zeromv_after_denoising()
1101 mi->ref_frame[0] = best_pickmode->best_ref_frame; in recheck_zeromv_after_denoising()
1102 set_ref_ptrs(cm, xd, mi->ref_frame[0], NONE_FRAME); in recheck_zeromv_after_denoising()
1103 mi->interp_filters = best_pickmode->best_pred_filter; in recheck_zeromv_after_denoising()
1104 if (best_pickmode->best_ref_frame == INTRA_FRAME) { in recheck_zeromv_after_denoising()
1105 mi->mv[0].as_int = INVALID_MV; in recheck_zeromv_after_denoising()
1107 mi->mv[0].as_int = ctx_den in recheck_zeromv_after_denoising()
1108 ->frame_mv[best_pickmode->best_mode] in recheck_zeromv_after_denoising()
1109 [best_pickmode->best_ref_frame] in recheck_zeromv_after_denoising()
1111 if (ctx_den->reuse_inter_pred) { in recheck_zeromv_after_denoising()
1112 xd->plane[AOM_PLANE_Y].pre[0] = yv12_mb[GOLDEN_FRAME][AOM_PLANE_Y]; in recheck_zeromv_after_denoising()
1116 mi->tx_size = best_pickmode->best_tx_size; in recheck_zeromv_after_denoising()
1117 txfm_info->skip_txfm = best_pickmode->best_mode_skip_txfm; in recheck_zeromv_after_denoising()
1119 ctx_den->best_ref_frame = LAST_FRAME; in recheck_zeromv_after_denoising()
1137 * \param[in] cpi Top-level encoder structure
1146 * prediction re-use
1148 * \param[in] reuse_inter_pred Flag, indicating prediction re-use
1150 * for prediction re-use
1161 * \c this_rdc and best filter is placed to \c mi->interp_filters. In case
1174 AV1_COMMON *const cm = &cpi->common; in search_filter_ref()
1175 MACROBLOCKD *const xd = &x->e_mbd; in search_filter_ref()
1176 struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; in search_filter_ref()
1177 MB_MODE_INFO *const mi = xd->mi[0]; in search_filter_ref()
1180 (cpi->sf.interp_sf.disable_dual_filter == 0) ? FILTER_SEARCH_SIZE : 1; in search_filter_ref()
1187 int best_filter_index = -1; in search_filter_ref()
1193 init_inter_mode_params(&mi->mv[0].as_mv, inter_pred_params_sr, in search_filter_ref()
1194 &subpel_params, xd->block_ref_scale_factors[0], in search_filter_ref()
1195 pd->pre->width, pd->pre->height); in search_filter_ref()
1199 if (cpi->sf.interp_sf.disable_dual_filter && in search_filter_ref()
1204 mi->interp_filters.as_int = filters_ref_set[filter_idx].as_int; in search_filter_ref()
1220 x, xd, cm->features.interp_filter, cm->seq_params->enable_dual_filter); in search_filter_ref()
1221 cost = RDCOST(x->rdmult, pf_rd_stats[filter_idx].rate, in search_filter_ref()
1223 pf_tx_size[filter_idx] = mi->tx_size; in search_filter_ref()
1236 pd->dst.buf = current_pred->data; in search_filter_ref()
1237 pd->dst.stride = bw; in search_filter_ref()
1246 mi->interp_filters.as_int = filters_ref_set[best_filter_index].as_int; in search_filter_ref()
1247 mi->tx_size = pf_tx_size[best_filter_index]; in search_filter_ref()
1248 this_rdc->rate = pf_rd_stats[best_filter_index].rate; in search_filter_ref()
1249 this_rdc->dist = pf_rd_stats[best_filter_index].dist; in search_filter_ref()
1250 this_rdc->sse = pf_rd_stats[best_filter_index].sse; in search_filter_ref()
1251 this_rdc->skip_txfm = (best_skip || best_early_term); in search_filter_ref()
1254 pd->dst.buf = (*this_mode_pred)->data; in search_filter_ref()
1255 pd->dst.stride = (*this_mode_pred)->stride; in search_filter_ref()
1256 } else if (best_filter_index < dim_factor * FILTER_SEARCH_SIZE - 1) { in search_filter_ref()
1270 const FeatureFlags *const features = &cpi->common.features; in is_warped_mode_allowed()
1271 const MACROBLOCKD *xd = &x->e_mbd; in is_warped_mode_allowed()
1273 if (cpi->sf.inter_sf.extra_prune_warped) return 0; in is_warped_mode_allowed()
1277 if (features->switchable_motion_mode) { in is_warped_mode_allowed()
1281 xd->global_motion, xd, mbmi, features->allow_warped_motion); in is_warped_mode_allowed()
1292 AV1_COMMON *const cm = &cpi->common; in calc_num_proj_ref()
1293 MACROBLOCKD *const xd = &x->e_mbd; in calc_num_proj_ref()
1294 const FeatureFlags *const features = &cm->features; in calc_num_proj_ref()
1296 mi->num_proj_ref = 1; in calc_num_proj_ref()
1298 &x->warp_sample_info[mi->ref_frame[0]]; in calc_num_proj_ref()
1299 int *pts0 = warp_sample_info->pts; in calc_num_proj_ref()
1300 int *pts_inref0 = warp_sample_info->pts_inref; in calc_num_proj_ref()
1303 if (features->switchable_motion_mode) { in calc_num_proj_ref()
1307 xd->global_motion, xd, mi, features->allow_warped_motion); in calc_num_proj_ref()
1311 if (warp_sample_info->num < 0) { in calc_num_proj_ref()
1312 warp_sample_info->num = av1_findSamples(cm, xd, pts0, pts_inref0); in calc_num_proj_ref()
1314 mi->num_proj_ref = warp_sample_info->num; in calc_num_proj_ref()
1322 AV1_COMMON *const cm = &cpi->common; in search_motion_mode()
1323 MACROBLOCKD *const xd = &x->e_mbd; in search_motion_mode()
1324 const FeatureFlags *const features = &cm->features; in search_motion_mode()
1325 MB_MODE_INFO *const mi = xd->mi[0]; in search_motion_mode()
1330 int best_mode_index = -1; in search_motion_mode()
1331 const int interp_filter = features->interp_filter; in search_motion_mode()
1339 &x->warp_sample_info[mi->ref_frame[0]]; in search_motion_mode()
1340 int *pts0 = warp_sample_info->pts; in search_motion_mode()
1341 int *pts_inref0 = warp_sample_info->pts_inref; in search_motion_mode()
1343 const int total_samples = mi->num_proj_ref; in search_motion_mode()
1357 mi->motion_mode = motion_mode; in search_motion_mode()
1359 mi->interp_filters = av1_broadcast_interp_filter(EIGHTTAP_REGULAR); in search_motion_mode()
1371 av1_get_switchable_rate(x, xd, cm->features.interp_filter, in search_motion_mode()
1372 cm->seq_params->enable_dual_filter); in search_motion_mode()
1373 cost = RDCOST(x->rdmult, pf_rd_stats[mode_index].rate, in search_motion_mode()
1377 const ModeCosts *mode_costs = &x->mode_costs; in search_motion_mode()
1378 mi->wm_params.wmtype = DEFAULT_WMTYPE; in search_motion_mode()
1379 mi->interp_filters = in search_motion_mode()
1385 if (mi->num_proj_ref > 1) { in search_motion_mode()
1386 mi->num_proj_ref = av1_selectSamples(&mi->mv[0].as_mv, pts, pts_inref, in search_motion_mode()
1387 mi->num_proj_ref, bsize); in search_motion_mode()
1392 if (!av1_find_projection(mi->num_proj_ref, pts, pts_inref, bsize, in search_motion_mode()
1393 mi->mv[0].as_mv.row, mi->mv[0].as_mv.col, in search_motion_mode()
1394 &mi->wm_params, mi_row, mi_col)) { in search_motion_mode()
1395 if (mi->mode == NEWMV) { in search_motion_mode()
1396 const int_mv mv0 = mi->mv[0]; in search_motion_mode()
1397 const WarpedMotionParams wm_params0 = mi->wm_params; in search_motion_mode()
1398 const int num_proj_ref0 = mi->num_proj_ref; in search_motion_mode()
1407 total_samples, cpi->sf.mv_sf.warp_search_method, in search_motion_mode()
1408 cpi->sf.mv_sf.warp_search_iters); in search_motion_mode()
1409 if (mi->mv[0].as_int == ref_mv.as_int) { in search_motion_mode()
1413 if (mv0.as_int != mi->mv[0].as_int) { in search_motion_mode()
1416 &mi->mv[0].as_mv, &ref_mv.as_mv, x->mv_costs->nmv_joint_cost, in search_motion_mode()
1417 x->mv_costs->mv_cost_stack, MV_COST_WEIGHT); in search_motion_mode()
1421 mi->mv[0] = mv0; in search_motion_mode()
1422 mi->wm_params = wm_params0; in search_motion_mode()
1423 mi->num_proj_ref = num_proj_ref0; in search_motion_mode()
1428 AOM_PLANE_Y, av1_num_planes(cm) - 1); in search_motion_mode()
1438 mode_costs->motion_mode_cost[bsize][mi->motion_mode]; in search_motion_mode()
1439 cost = RDCOST(x->rdmult, pf_rd_stats[mode_index].rate, in search_motion_mode()
1456 this_rdc->rate = pf_rd_stats[best_mode_index].rate; in search_motion_mode()
1457 this_rdc->dist = pf_rd_stats[best_mode_index].dist; in search_motion_mode()
1458 this_rdc->sse = pf_rd_stats[best_mode_index].sse; in search_motion_mode()
1459 this_rdc->skip_txfm = (best_skip || best_early_term); in search_motion_mode()
1461 if (best_mode_index < FILTER_SEARCH_SIZE - 1) { in search_motion_mode()
1487 total_time += ms_stat->total_block_times[bs]; in print_time()
1488 total_blocks += ms_stat->num_blocks[bs]; in print_time()
1493 if (ms_stat->num_blocks[bs] == 0) { in print_time()
1501 block_size_wide[bs], block_size_high[bs], ms_stat->num_blocks[bs], in print_time()
1502 ms_stat->total_block_times[bs], in print_time()
1503 100 * ms_stat->total_block_times[bs] / (float)total_time, in print_time()
1504 (float)ms_stat->total_block_times[bs] / ms_stat->num_blocks[bs]); in print_time()
1506 if (ms_stat->nonskipped_search_times[bs][j] == 0) { in print_time()
1510 int64_t total_mode_time = ms_stat->nonskipped_search_times[bs][j]; in print_time()
1512 ms_stat->num_nonskipped_searches[bs][j], in print_time()
1513 ms_stat->num_searches[bs][j], in print_time()
1514 ms_stat->num_nonskipped_searches[bs][j] > 0 in print_time()
1515 ? (float)ms_stat->nonskipped_search_times[bs][j] / in print_time()
1516 ms_stat->num_nonskipped_searches[bs][j] in print_time()
1519 total_mode_time = ms_stat->ms_time[bs][j] + ms_stat->ifs_time[bs][j] + in print_time()
1520 ms_stat->model_rd_time[bs][j] + in print_time()
1521 ms_stat->txfm_time[bs][j]; in print_time()
1522 print_stage_time("Motion Search Time", ms_stat->ms_time[bs][j], in print_time()
1524 print_stage_time("Filter Search Time", ms_stat->ifs_time[bs][j], in print_time()
1526 print_stage_time("Model RD Time", ms_stat->model_rd_time[bs][j], in print_time()
1528 print_stage_time("Tranfm Search Time", ms_stat->txfm_time[bs][j], in print_time()
1550 // Enable the pruning for current mode only if it is not the winner mode of in should_prune_intra_modes_using_neighbors()
1552 return xd->up_available && this_mode != above_mode && xd->left_available && in should_prune_intra_modes_using_neighbors()
1558 AV1_COMMON *const cm = &cpi->common; in av1_nonrd_pick_intra_mode()
1559 MACROBLOCKD *const xd = &x->e_mbd; in av1_nonrd_pick_intra_mode()
1560 MB_MODE_INFO *const mi = xd->mi[0]; in av1_nonrd_pick_intra_mode()
1564 const TxfmSearchParams *txfm_params = &x->txfm_search_params; in av1_nonrd_pick_intra_mode()
1565 mi->tx_size = in av1_nonrd_pick_intra_mode()
1567 tx_mode_to_biggest_tx_size[txfm_params->tx_mode_search_type]); in av1_nonrd_pick_intra_mode()
1568 assert(IMPLIES(xd->lossless[mi->segment_id], mi->tx_size == TX_4X4)); in av1_nonrd_pick_intra_mode()
1569 const BLOCK_SIZE tx_bsize = txsize_to_bsize[mi->tx_size]; in av1_nonrd_pick_intra_mode()
1571 // If the current block size is the same as the transform block size, enable in av1_nonrd_pick_intra_mode()
1573 if (cpi->sf.rt_sf.prune_intra_mode_using_best_sad_so_far && bsize == tx_bsize) in av1_nonrd_pick_intra_mode()
1578 const MB_MODE_INFO *above_mi = xd->above_mbmi; in av1_nonrd_pick_intra_mode()
1579 const MB_MODE_INFO *left_mi = xd->left_mbmi; in av1_nonrd_pick_intra_mode()
1584 const unsigned int source_variance = x->source_variance; in av1_nonrd_pick_intra_mode()
1585 bmode_costs = x->mode_costs.y_mode_costs[above_ctx][left_ctx]; in av1_nonrd_pick_intra_mode()
1591 mi->mv[0].as_int = mi->mv[1].as_int = INVALID_MV; in av1_nonrd_pick_intra_mode()
1594 // mode tests. in av1_nonrd_pick_intra_mode()
1604 if (cpi->sf.rt_sf.prune_h_pred_using_best_mode_so_far && in av1_nonrd_pick_intra_mode()
1609 xd, cpi->sf.rt_sf.enable_intra_mode_pruning_using_neighbors, in av1_nonrd_pick_intra_mode()
1626 mi->mode = this_mode; in av1_nonrd_pick_intra_mode()
1634 this_rdc.rate = x->mode_costs.skip_txfm_cost[skip_ctx][1]; in av1_nonrd_pick_intra_mode()
1636 this_rdc.rate += x->mode_costs.skip_txfm_cost[skip_ctx][0]; in av1_nonrd_pick_intra_mode()
1639 this_rdc.rdcost = RDCOST(x->rdmult, this_rdc.rate, this_rdc.dist); in av1_nonrd_pick_intra_mode()
1645 memset(ctx->blk_skip, 0, in av1_nonrd_pick_intra_mode()
1646 sizeof(x->txfm_search_info.blk_skip[0]) * ctx->num_4x4_blk); in av1_nonrd_pick_intra_mode()
1651 mi->mode = best_mode; in av1_nonrd_pick_intra_mode()
1653 mi->uv_mode = UV_DC_PRED; in av1_nonrd_pick_intra_mode()
1659 if (is_lossless_requested(&cpi->oxcf.rc_cfg)) { in av1_nonrd_pick_intra_mode()
1660 x->txfm_search_info.skip_txfm = 0; in av1_nonrd_pick_intra_mode()
1661 memset(ctx->blk_skip, 0, in av1_nonrd_pick_intra_mode()
1662 sizeof(x->txfm_search_info.blk_skip[0]) * ctx->num_4x4_blk); in av1_nonrd_pick_intra_mode()
1666 store_coding_context_nonrd(x, ctx, mi->mode); in av1_nonrd_pick_intra_mode()
1676 return ((sf_last->x_scale_fp == sf_golden->x_scale_fp) && in is_same_gf_and_last_scale()
1677 (sf_last->y_scale_fp == sf_golden->y_scale_fp)); in is_same_gf_and_last_scale()
1686 AV1_COMMON *const cm = &cpi->common; in get_ref_frame_use_mask()
1687 const struct segmentation *const seg = &cm->seg; in get_ref_frame_use_mask()
1688 const int is_small_sb = (cm->seq_params->sb_size == BLOCK_64X64); in get_ref_frame_use_mask()
1693 int use_alt_ref_frame = cpi->ppi->rtc_ref.set_ref_frame_config || in get_ref_frame_use_mask()
1694 cpi->sf.rt_sf.use_nonrd_altref_frame; in get_ref_frame_use_mask()
1700 // check if LAST is used as a reference. And only remove golden and altref in get_ref_frame_use_mask()
1702 if (cpi->ppi->rtc_ref.set_ref_frame_config) in get_ref_frame_use_mask()
1704 cpi->ref_frame_flags & AOM_LAST_FLAG ? use_last_ref_frame : 0; in get_ref_frame_use_mask()
1707 if (!cpi->ppi->rtc_ref.set_ref_frame_config && use_last_ref_frame && in get_ref_frame_use_mask()
1708 cpi->rc.frames_since_golden == 0 && gf_temporal_ref) { in get_ref_frame_use_mask()
1712 if (use_last_ref_frame && cpi->sf.rt_sf.short_circuit_low_temp_var && in get_ref_frame_use_mask()
1713 x->nonrd_prune_ref_frame_search) { in get_ref_frame_use_mask()
1716 &x->part_search_info.variance_low[0], mi_row, mi_col, bsize); in get_ref_frame_use_mask()
1719 &x->part_search_info.variance_low[0], mi_row, mi_col, bsize); in get_ref_frame_use_mask()
1720 // If force_skip_low_temp_var is set, skip golden reference. in get_ref_frame_use_mask()
1728 (x->nonrd_prune_ref_frame_search > 2 || x->force_zeromv_skip_for_blk || in get_ref_frame_use_mask()
1729 (x->nonrd_prune_ref_frame_search > 1 && bsize > BLOCK_64X64))) { in get_ref_frame_use_mask()
1734 if (segfeature_active(seg, mi->segment_id, SEG_LVL_REF_FRAME) && in get_ref_frame_use_mask()
1735 get_segdata(seg, mi->segment_id, SEG_LVL_REF_FRAME) == GOLDEN_FRAME) { in get_ref_frame_use_mask()
1740 // Skip golden/altref reference if color is set, on flat blocks with motion. in get_ref_frame_use_mask()
1741 // For screen: always skip golden/alt (if color_sensitivity_sb_g/alt is set) in get_ref_frame_use_mask()
1742 // except when x->nonrd_prune_ref_frame_search = 0. This latter flag in get_ref_frame_use_mask()
1743 // may be set in the variance partition when golden is a much better in get_ref_frame_use_mask()
1745 // golden/altref completely. in get_ref_frame_use_mask()
1749 ((cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && in get_ref_frame_use_mask()
1750 x->nonrd_prune_ref_frame_search != 0) || in get_ref_frame_use_mask()
1751 (x->source_variance < 200 && in get_ref_frame_use_mask()
1752 x->content_state_sb.source_sad_nonrd >= kLowSad))) { in get_ref_frame_use_mask()
1753 if (x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_U)] == 1 || in get_ref_frame_use_mask()
1754 x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_V)] == 1) in get_ref_frame_use_mask()
1756 if (x->color_sensitivity_sb_alt[COLOR_SENS_IDX(AOM_PLANE_U)] == 1 || in get_ref_frame_use_mask()
1757 x->color_sensitivity_sb_alt[COLOR_SENS_IDX(AOM_PLANE_V)] == 1) in get_ref_frame_use_mask()
1761 // For non-screen: if golden and altref are not being selected as references in get_ref_frame_use_mask()
1762 // (use_golden_ref_frame/use_alt_ref_frame = 0) check to allow golden back in get_ref_frame_use_mask()
1764 // keep golden as reference. Only do this for the agrressive pruning mode and in get_ref_frame_use_mask()
1765 // avoid it when color is set for golden reference. in get_ref_frame_use_mask()
1766 if (cpi->oxcf.tune_cfg.content != AOM_CONTENT_SCREEN && in get_ref_frame_use_mask()
1767 (cpi->ref_frame_flags & AOM_LAST_FLAG) && !use_golden_ref_frame && in get_ref_frame_use_mask()
1768 !use_alt_ref_frame && x->pred_mv_sad[LAST_FRAME] != INT_MAX && in get_ref_frame_use_mask()
1769 x->nonrd_prune_ref_frame_search > 2 && in get_ref_frame_use_mask()
1770 x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_U)] == 0 && in get_ref_frame_use_mask()
1771 x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_V)] == 0) { in get_ref_frame_use_mask()
1772 int thr = (cm->width * cm->height > RESOLUTION_288P) ? 100 : 150; in get_ref_frame_use_mask()
1773 int pred = x->pred_mv_sad[LAST_FRAME] >> in get_ref_frame_use_mask()
1779 cpi->ref_frame_flags & AOM_ALT_FLAG ? use_alt_ref_frame : 0; in get_ref_frame_use_mask()
1781 cpi->ref_frame_flags & AOM_GOLD_FLAG ? use_golden_ref_frame : 0; in get_ref_frame_use_mask()
1783 // For spatial layers: enable golden ref if it is set by user and in get_ref_frame_use_mask()
1785 if (cpi->svc.spatial_layer_id > 0 && (cpi->ref_frame_flags & AOM_GOLD_FLAG) && in get_ref_frame_use_mask()
1786 x->content_state_sb.source_sad_nonrd < kHighSad) { in get_ref_frame_use_mask()
1788 cpi->ppi->rtc_ref.ref_idx[GOLDEN_FRAME - LAST_FRAME]; in get_ref_frame_use_mask()
1789 if (cpi->ppi->rtc_ref.buffer_time_index[buffslot_golden] == in get_ref_frame_use_mask()
1790 cpi->svc.current_superframe) in get_ref_frame_use_mask()
1798 // (LAST, GOLDEN, ALTREF), and if all 3 are not set by user then this in get_ref_frame_use_mask()
1799 // frame must be an intra-only frame and hence should never enter the in get_ref_frame_use_mask()
1807 const AV1_COMMON *const cm = &cpi->common; in is_filter_search_enabled_blk()
1809 if (!cpi->sf.rt_sf.use_nonrd_filter_search) return 0; in is_filter_search_enabled_blk()
1812 MACROBLOCKD *const xd = &x->e_mbd; in is_filter_search_enabled_blk()
1814 if (!(xd->left_mbmi && xd->above_mbmi)) { in is_filter_search_enabled_blk()
1817 } else if (!(is_inter_block(xd->left_mbmi) && in is_filter_search_enabled_blk()
1818 is_inter_block(xd->above_mbmi))) { in is_filter_search_enabled_blk()
1821 } else if (xd->left_mbmi->interp_filters.as_int != in is_filter_search_enabled_blk()
1822 xd->above_mbmi->interp_filters.as_int) { in is_filter_search_enabled_blk()
1826 (xd->left_mbmi->interp_filters.as_filters.x_filter != in is_filter_search_enabled_blk()
1831 // enable prediction based on chessboard pattern in is_filter_search_enabled_blk()
1832 if (xd->left_mbmi->interp_filters.as_filters.x_filter == EIGHTTAP_SMOOTH) in is_filter_search_enabled_blk()
1837 get_chessboard_index(cm->current_frame.frame_number)) & in is_filter_search_enabled_blk()
1855 // Increase mode_rd_thresh value for non-LAST for improved encoding in skip_mode_by_threshold()
1873 // Skip non-zeromv mode search for non-LAST frame if force_skip_low_temp_var in skip_mode_by_low_temp()
1874 // is set. If nearestmv for golden frame is 0, zeromv mode will be skipped in skip_mode_by_low_temp()
1898 // Skip testing non-LAST if this flag is set. in skip_mode_by_bsize_and_ref_frame()
1913 struct macroblock_plane *const p = &x->plane[0]; in set_block_source_sad()
1914 const int y_sad = cpi->ppi->fn_ptr[bsize].sdf(p->src.buf, p->src.stride, in set_block_source_sad()
1915 yv12_mb->buf, yv12_mb->stride); in set_block_source_sad()
1916 if (y_sad == 0) x->block_is_zero_sad = 1; in set_block_source_sad()
1923 const int subsampling_x = cpi->common.seq_params->subsampling_x; in set_color_sensitivity()
1924 const int subsampling_y = cpi->common.seq_params->subsampling_y; in set_color_sensitivity()
1925 const int source_sad_nonrd = x->content_state_sb.source_sad_nonrd; in set_color_sensitivity()
1926 const int high_res = cpi->common.width * cpi->common.height >= 640 * 360; in set_color_sensitivity()
1927 if (bsize == cpi->common.seq_params->sb_size) { in set_color_sensitivity()
1932 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] == 2) { in set_color_sensitivity()
1933 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] = in set_color_sensitivity()
1936 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] == 2) { in set_color_sensitivity()
1937 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] = in set_color_sensitivity()
1945 if (source_sad_nonrd >= kMedSad && x->source_variance > 0 && high_res) in set_color_sensitivity()
1947 if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) { in set_color_sensitivity()
1948 if (cpi->rc.high_source_sad) shift = 6; in set_color_sensitivity()
1957 unsigned int thresh_spatial = (cpi->common.width > 1920) ? 5000 : 1000; in set_color_sensitivity()
1959 // is low, then y-channel is likely good for mode estimation, so keep in set_color_sensitivity()
1962 if (cpi->noise_estimate.enabled) in set_color_sensitivity()
1963 noise_level = av1_noise_estimate_extract_level(&cpi->noise_estimate); in set_color_sensitivity()
1965 cpi->oxcf.tune_cfg.content != AOM_CONTENT_SCREEN && norm_sad < 50) { in set_color_sensitivity()
1966 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] = 0; in set_color_sensitivity()
1967 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] = 0; in set_color_sensitivity()
1970 const int num_planes = av1_num_planes(&cpi->common); in set_color_sensitivity()
1976 if (x->color_sensitivity[COLOR_SENS_IDX(plane)] == 2 || in set_color_sensitivity()
1977 (x->color_sensitivity[COLOR_SENS_IDX(plane)] == 0 && in set_color_sensitivity()
1979 struct macroblock_plane *const p = &x->plane[plane]; in set_color_sensitivity()
1983 const int uv_sad = cpi->ppi->fn_ptr[bs].sdf( in set_color_sensitivity()
1984 p->src.buf, p->src.stride, yv12_mb[plane].buf, yv12_mb[plane].stride); in set_color_sensitivity()
1988 x->color_sensitivity[COLOR_SENS_IDX(plane)] = in set_color_sensitivity()
1991 x->color_sensitivity[COLOR_SENS_IDX(plane)] = 1; in set_color_sensitivity()
2001 MACROBLOCKD *const xd = &x->e_mbd; in setup_compound_prediction()
2002 MB_MODE_INFO *const mbmi = xd->mi[0]; in setup_compound_prediction()
2003 MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext; in setup_compound_prediction()
2016 mbmi_ext->mode_context[ref_frame_comp] = 0; in setup_compound_prediction()
2017 mbmi_ext->ref_mv_count[ref_frame_comp] = UINT8_MAX; in setup_compound_prediction()
2018 av1_find_mv_refs(cm, xd, mbmi, ref_frame_comp, mbmi_ext->ref_mv_count, in setup_compound_prediction()
2019 xd->ref_mv_stack, xd->weight, NULL, mbmi_ext->global_mvs, in setup_compound_prediction()
2020 mbmi_ext->mode_context); in setup_compound_prediction()
2022 *ref_mv_idx = mbmi->ref_mv_idx + 1; in setup_compound_prediction()
2029 MACROBLOCKD *const xd = &x->e_mbd; in set_compound_mode()
2030 MB_MODE_INFO *const mi = xd->mi[0]; in set_compound_mode()
2031 mi->ref_frame[0] = ref_frame; in set_compound_mode()
2032 mi->ref_frame[1] = ref_frame2; in set_compound_mode()
2033 mi->compound_idx = 1; in set_compound_mode()
2034 mi->comp_group_idx = 0; in set_compound_mode()
2035 mi->interinter_comp.type = COMPOUND_AVERAGE; in set_compound_mode()
2036 MV_REFERENCE_FRAME ref_frame_comp = av1_ref_frame_type(mi->ref_frame); in set_compound_mode()
2042 xd->ref_mv_stack[ref_frame_comp][0].this_mv.as_int; in set_compound_mode()
2044 xd->ref_mv_stack[ref_frame_comp][0].comp_mv.as_int; in set_compound_mode()
2047 xd->ref_mv_stack[ref_frame_comp][ref_mv_idx].this_mv.as_int; in set_compound_mode()
2049 xd->ref_mv_stack[ref_frame_comp][ref_mv_idx].comp_mv.as_int; in set_compound_mode()
2066 // Currently, the thresh for 128 and 16 are not well-tuned. We are using the in skip_comp_based_on_var()
2114 NEWMV, 0, mbmi_ext, mode_costs->drl_mode_cost0, av1_ref_frame_type(rf)); in is_globalmv_better()
2136 if (x->source_variance < 50 && bsize > BLOCK_16X16) { in setup_compound_params_from_comp_idx()
2137 if (x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_U)] == 1 || in setup_compound_params_from_comp_idx()
2138 x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_V)] == 1) in setup_compound_params_from_comp_idx()
2140 if (x->color_sensitivity_sb_alt[COLOR_SENS_IDX(AOM_PLANE_U)] == 1 || in setup_compound_params_from_comp_idx()
2141 x->color_sensitivity_sb_alt[COLOR_SENS_IDX(AOM_PLANE_V)] == 1) in setup_compound_params_from_comp_idx()
2148 (cpi->sf.rt_sf.ref_frame_comp_nonrd[0] == 0 || skip_gf || in setup_compound_params_from_comp_idx()
2149 !(cpi->ref_frame_flags & AOM_GOLD_FLAG))) { in setup_compound_params_from_comp_idx()
2152 (cpi->sf.rt_sf.ref_frame_comp_nonrd[1] == 0 || in setup_compound_params_from_comp_idx()
2153 !(cpi->ref_frame_flags & AOM_LAST2_FLAG))) { in setup_compound_params_from_comp_idx()
2156 (cpi->sf.rt_sf.ref_frame_comp_nonrd[2] == 0 || skip_alt || in setup_compound_params_from_comp_idx()
2157 !(cpi->ref_frame_flags & AOM_ALT_FLAG))) { in setup_compound_params_from_comp_idx()
2163 setup_compound_prediction(&cpi->common, x, yv12_mb, use_ref_frame_mask, rf, in setup_compound_params_from_comp_idx()
2234 // Function to setup parameters used for inter mode evaluation in non-rd.
2244 AV1_COMMON *const cm = &cpi->common; in set_params_nonrd_pick_inter_mode()
2245 MACROBLOCKD *const xd = &x->e_mbd; in set_params_nonrd_pick_inter_mode()
2246 TxfmSearchInfo *txfm_info = &x->txfm_search_info; in set_params_nonrd_pick_inter_mode()
2247 MB_MODE_INFO *const mi = xd->mi[0]; in set_params_nonrd_pick_inter_mode()
2248 const ModeCosts *mode_costs = &x->mode_costs; in set_params_nonrd_pick_inter_mode()
2255 search_state->vars[idx][ref] = UINT_MAX; in set_params_nonrd_pick_inter_mode()
2256 search_state->uv_dist[idx][ref] = INT64_MAX; in set_params_nonrd_pick_inter_mode()
2261 av1_copy(x->color_sensitivity, x->color_sensitivity_sb); in set_params_nonrd_pick_inter_mode()
2263 init_best_pickmode(&search_state->best_pickmode); in set_params_nonrd_pick_inter_mode()
2267 search_state->ref_costs_single); in set_params_nonrd_pick_inter_mode()
2270 av1_zero(search_state->mode_checked); in set_params_nonrd_pick_inter_mode()
2272 txfm_info->skip_txfm = 0; in set_params_nonrd_pick_inter_mode()
2275 av1_invalid_rd_stats(&search_state->best_rdc); in set_params_nonrd_pick_inter_mode()
2276 av1_invalid_rd_stats(&search_state->this_rdc); in set_params_nonrd_pick_inter_mode()
2279 x->warp_sample_info[ref_idx].num = -1; in set_params_nonrd_pick_inter_mode()
2282 mi->bsize = bsize; in set_params_nonrd_pick_inter_mode()
2283 mi->ref_frame[0] = NONE_FRAME; in set_params_nonrd_pick_inter_mode()
2284 mi->ref_frame[1] = NONE_FRAME; in set_params_nonrd_pick_inter_mode()
2287 if (cpi->oxcf.noise_sensitivity > 0) { in set_params_nonrd_pick_inter_mode()
2288 // if (cpi->ppi->use_svc) denoise_svc_pickmode = in set_params_nonrd_pick_inter_mode()
2290 if (cpi->denoiser.denoising_level > kDenLowLow && denoise_svc_pickmode) in set_params_nonrd_pick_inter_mode()
2296 if (cpi->ref_frame_flags & AOM_LAST_FLAG) { in set_params_nonrd_pick_inter_mode()
2297 find_predictors(cpi, x, LAST_FRAME, search_state->frame_mv, in set_params_nonrd_pick_inter_mode()
2298 search_state->yv12_mb, bsize, *force_skip_low_temp_var, in set_params_nonrd_pick_inter_mode()
2299 x->force_zeromv_skip_for_blk, in set_params_nonrd_pick_inter_mode()
2300 &search_state->use_scaled_ref_frame[LAST_FRAME]); in set_params_nonrd_pick_inter_mode()
2304 search_state->use_ref_frame_mask, in set_params_nonrd_pick_inter_mode()
2307 skip_pred_mv = x->force_zeromv_skip_for_blk || in set_params_nonrd_pick_inter_mode()
2308 (x->nonrd_prune_ref_frame_search > 2 && in set_params_nonrd_pick_inter_mode()
2309 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] != 2 && in set_params_nonrd_pick_inter_mode()
2310 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] != 2); in set_params_nonrd_pick_inter_mode()
2316 if (search_state->use_ref_frame_mask[ref_frame_iter]) { in set_params_nonrd_pick_inter_mode()
2317 find_predictors(cpi, x, ref_frame_iter, search_state->frame_mv, in set_params_nonrd_pick_inter_mode()
2318 search_state->yv12_mb, bsize, *force_skip_low_temp_var, in set_params_nonrd_pick_inter_mode()
2320 &search_state->use_scaled_ref_frame[ref_frame_iter]); in set_params_nonrd_pick_inter_mode()
2335 AV1_COMMON *const cm = &cpi->common; in skip_inter_mode_nonrd()
2336 const struct segmentation *const seg = &cm->seg; in skip_inter_mode_nonrd()
2337 const SVC *const svc = &cpi->svc; in skip_inter_mode_nonrd()
2338 MACROBLOCKD *const xd = &x->e_mbd; in skip_inter_mode_nonrd()
2339 MB_MODE_INFO *const mi = xd->mi[0]; in skip_inter_mode_nonrd()
2340 const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; in skip_inter_mode_nonrd()
2345 const int comp_index = idx - num_inter_modes; in skip_inter_mode_nonrd()
2347 cpi, x, search_state->yv12_mb, this_mode, ref_frame, ref_frame2, in skip_inter_mode_nonrd()
2348 search_state->frame_mv, search_state->use_ref_frame_mask, in skip_inter_mode_nonrd()
2360 if (segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP) && in skip_inter_mode_nonrd()
2364 if (x->sb_me_block && *ref_frame == LAST_FRAME) { in skip_inter_mode_nonrd()
2371 search_state->frame_mv[NEARESTMV][LAST_FRAME].as_int == in skip_inter_mode_nonrd()
2372 x->sb_me_mv.as_int) { in skip_inter_mode_nonrd()
2376 search_state->frame_mv[NEARMV][LAST_FRAME].as_int == in skip_inter_mode_nonrd()
2377 x->sb_me_mv.as_int) { in skip_inter_mode_nonrd()
2386 if (*is_single_pred && search_state->mode_checked[*this_mode][*ref_frame]) { in skip_inter_mode_nonrd()
2396 aom_usec_timer_start(&x->ms_stat_nonrd.timer1); in skip_inter_mode_nonrd()
2397 x->ms_stat_nonrd.num_searches[bsize][*this_mode]++; in skip_inter_mode_nonrd()
2399 mi->mode = *this_mode; in skip_inter_mode_nonrd()
2400 mi->ref_frame[0] = *ref_frame; in skip_inter_mode_nonrd()
2401 mi->ref_frame[1] = *ref_frame2; in skip_inter_mode_nonrd()
2404 if (!search_state->use_ref_frame_mask[*ref_frame]) return true; in skip_inter_mode_nonrd()
2408 if (x->force_zeromv_skip_for_blk && in skip_inter_mode_nonrd()
2410 search_state->frame_mv[*this_mode][*ref_frame].as_int == 0) && in skip_inter_mode_nonrd()
2417 if (rt_sf->prune_compoundmode_with_singlemode_var && !*is_single_pred && in skip_inter_mode_nonrd()
2419 *this_mode, *ref_frame, *ref_frame2, search_state->frame_mv, in skip_inter_mode_nonrd()
2420 search_state->mode_checked, search_state->vars, in skip_inter_mode_nonrd()
2421 search_state->uv_dist)) { in skip_inter_mode_nonrd()
2426 if (cpi->ppi->use_svc && svc->spatial_layer_id > 0 && in skip_inter_mode_nonrd()
2427 ((*ref_frame == LAST_FRAME && svc->skip_mvsearch_last) || in skip_inter_mode_nonrd()
2428 (*ref_frame == GOLDEN_FRAME && svc->skip_mvsearch_gf) || in skip_inter_mode_nonrd()
2429 (*ref_frame == ALTREF_FRAME && svc->skip_mvsearch_altref))) { in skip_inter_mode_nonrd()
2435 search_state->frame_mv[*this_mode][*ref_frame] = svc_mv; in skip_inter_mode_nonrd()
2436 } else if (search_state->frame_mv[*this_mode][*ref_frame].as_int != in skip_inter_mode_nonrd()
2449 if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) { in skip_inter_mode_nonrd()
2450 // If source_sad is computed: skip non-zero motion in skip_inter_mode_nonrd()
2457 if (rt_sf->source_metrics_sb_nonrd) { in skip_inter_mode_nonrd()
2458 if ((search_state->frame_mv[*this_mode][*ref_frame].as_int != 0 && in skip_inter_mode_nonrd()
2459 x->content_state_sb.source_sad_nonrd == kZeroSad) || in skip_inter_mode_nonrd()
2460 (search_state->frame_mv[*this_mode][*ref_frame].as_int == 0 && in skip_inter_mode_nonrd()
2461 x->block_is_zero_sad == 0 && *ref_frame == LAST_FRAME && in skip_inter_mode_nonrd()
2462 ((x->color_sensitivity_sb[COLOR_SENS_IDX(AOM_PLANE_U)] == 0 && in skip_inter_mode_nonrd()
2463 x->color_sensitivity_sb[COLOR_SENS_IDX(AOM_PLANE_V)] == 0) || in skip_inter_mode_nonrd()
2464 cpi->rc.high_source_sad) && in skip_inter_mode_nonrd()
2465 x->source_variance == 0)) in skip_inter_mode_nonrd()
2469 if (*this_mode == NEWMV && x->source_variance < 100) return true; in skip_inter_mode_nonrd()
2470 // Skip non-LAST for color on flat blocks. in skip_inter_mode_nonrd()
2471 if (*ref_frame > LAST_FRAME && x->source_variance == 0 && in skip_inter_mode_nonrd()
2472 (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] == 1 || in skip_inter_mode_nonrd()
2473 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] == 1)) in skip_inter_mode_nonrd()
2480 *this_mode, *ref_frame, bsize, x->nonrd_prune_ref_frame_search, in skip_inter_mode_nonrd()
2481 sse_zeromv_norm, rt_sf->nonrd_aggressive_skip)) in skip_inter_mode_nonrd()
2485 if (skip_mode_by_low_temp(*this_mode, *ref_frame, bsize, x->content_state_sb, in skip_inter_mode_nonrd()
2486 search_state->frame_mv[*this_mode][*ref_frame], in skip_inter_mode_nonrd()
2494 // Check for skipping GOLDEN and ALTREF based pred_mv_sad. in skip_inter_mode_nonrd()
2495 if (rt_sf->nonrd_prune_ref_frame_search > 0 && in skip_inter_mode_nonrd()
2496 x->pred_mv_sad[*ref_frame] != INT_MAX && *ref_frame != LAST_FRAME) { in skip_inter_mode_nonrd()
2497 if ((int64_t)(x->pred_mv_sad[*ref_frame]) > *thresh_sad_pred) return true; in skip_inter_mode_nonrd()
2502 if (*this_mode == NEARMV && x->pred_mv1_sad[*ref_frame] != INT_MAX && in skip_inter_mode_nonrd()
2503 x->pred_mv1_sad[*ref_frame] > (x->pred_mv0_sad[*ref_frame] << 1)) in skip_inter_mode_nonrd()
2510 search_state->frame_mv[*this_mode][*ref_frame], in skip_inter_mode_nonrd()
2511 cpi->rc.frames_since_golden, cpi->rd.threshes[segment_id][bsize], in skip_inter_mode_nonrd()
2512 x->thresh_freq_fact[bsize], search_state->best_rdc.rdcost, in skip_inter_mode_nonrd()
2513 search_state->best_pickmode.best_mode_skip_txfm, in skip_inter_mode_nonrd()
2514 (rt_sf->nonrd_aggressive_skip ? 1 : 0))) in skip_inter_mode_nonrd()
2520 // Function to perform inter mode evaluation for non-rd
2534 AV1_COMMON *const cm = &cpi->common; in handle_inter_mode_nonrd()
2535 MACROBLOCKD *const xd = &x->e_mbd; in handle_inter_mode_nonrd()
2536 MB_MODE_INFO *const mi = xd->mi[0]; in handle_inter_mode_nonrd()
2537 const MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext; in handle_inter_mode_nonrd()
2538 const int mi_row = xd->mi_row; in handle_inter_mode_nonrd()
2539 const int mi_col = xd->mi_col; in handle_inter_mode_nonrd()
2540 struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; in handle_inter_mode_nonrd()
2542 const InterpFilter filter_ref = cm->features.interp_filter; in handle_inter_mode_nonrd()
2544 TxfmSearchInfo *txfm_info = &x->txfm_search_info; in handle_inter_mode_nonrd()
2545 const ModeCosts *mode_costs = &x->mode_costs; in handle_inter_mode_nonrd()
2546 const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; in handle_inter_mode_nonrd()
2547 BEST_PICKMODE *const best_pickmode = &search_state->best_pickmode; in handle_inter_mode_nonrd()
2549 MV_REFERENCE_FRAME ref_frame = mi->ref_frame[0]; in handle_inter_mode_nonrd()
2550 MV_REFERENCE_FRAME ref_frame2 = mi->ref_frame[1]; in handle_inter_mode_nonrd()
2551 int_mv *const this_mv = &search_state->frame_mv[this_mode][ref_frame]; in handle_inter_mode_nonrd()
2562 if (x->sb_me_block && this_mode == NEWMV && ref_frame == LAST_FRAME) { in handle_inter_mode_nonrd()
2564 search_state->frame_mv[NEWMV][LAST_FRAME].as_int = x->sb_me_mv.as_int; in handle_inter_mode_nonrd()
2567 aom_usec_timer_start(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2571 cpi, x, search_state->frame_mv, ref_frame, gf_temporal_ref, bsize, in handle_inter_mode_nonrd()
2572 mi_row, mi_col, &rate_mv, &search_state->best_rdc); in handle_inter_mode_nonrd()
2574 aom_usec_timer_mark(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2575 x->ms_stat_nonrd.ms_time[bsize][this_mode] += in handle_inter_mode_nonrd()
2576 aom_usec_timer_elapsed(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2593 search_state->mode_checked[inter_mv_mode][ref_frame] && in handle_inter_mode_nonrd()
2594 this_mv->as_int == in handle_inter_mode_nonrd()
2595 search_state->frame_mv[inter_mv_mode][ref_frame].as_int) { in handle_inter_mode_nonrd()
2605 // For screen: for spatially flat blocks with non-zero motion, in handle_inter_mode_nonrd()
2606 // skip newmv if the motion vector is (0, 0)-LAST, and color is not set. in handle_inter_mode_nonrd()
2607 if (this_mode == NEWMV && cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && in handle_inter_mode_nonrd()
2608 cpi->svc.spatial_layer_id == 0 && rt_sf->source_metrics_sb_nonrd) { in handle_inter_mode_nonrd()
2609 if (this_mv->as_int == 0 && ref_frame == LAST_FRAME && in handle_inter_mode_nonrd()
2610 x->block_is_zero_sad == 0 && in handle_inter_mode_nonrd()
2611 ((x->color_sensitivity_sb[COLOR_SENS_IDX(AOM_PLANE_U)] == 0 && in handle_inter_mode_nonrd()
2612 x->color_sensitivity_sb[COLOR_SENS_IDX(AOM_PLANE_V)] == 0) || in handle_inter_mode_nonrd()
2613 cpi->rc.high_source_sad) && in handle_inter_mode_nonrd()
2614 x->source_variance == 0) in handle_inter_mode_nonrd()
2618 mi->mode = this_mode; in handle_inter_mode_nonrd()
2619 mi->mv[0].as_int = this_mv->as_int; in handle_inter_mode_nonrd()
2620 mi->mv[1].as_int = 0; in handle_inter_mode_nonrd()
2622 mi->mv[1].as_int = search_state->frame_mv[this_mode][ref_frame2].as_int; in handle_inter_mode_nonrd()
2630 pd->dst.buf = (*this_mode_pred)->data; in handle_inter_mode_nonrd()
2631 pd->dst.stride = bw; in handle_inter_mode_nonrd()
2635 mi->motion_mode = SIMPLE_TRANSLATION; in handle_inter_mode_nonrd()
2637 if (cpi->oxcf.motion_mode_cfg.allow_warped_motion) { in handle_inter_mode_nonrd()
2642 if (rt_sf->prune_compoundmode_with_singlecompound_var && !is_single_pred && in handle_inter_mode_nonrd()
2648 search_state->vars[INTER_OFFSET(single_mode0)][ref_frame]); in handle_inter_mode_nonrd()
2651 search_state->vars[INTER_OFFSET(single_mode1)][ref_frame2]); in handle_inter_mode_nonrd()
2656 (mi->mv[0].as_mv.row & 0x07) || (mi->mv[0].as_mv.col & 0x07); in handle_inter_mode_nonrd()
2662 (ref_frame == LAST_FRAME || !x->nonrd_prune_ref_frame_search)); in handle_inter_mode_nonrd()
2665 aom_usec_timer_start(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2668 cpi, x, &search_state->this_rdc, &inter_pred_params_sr, mi_row, mi_col, in handle_inter_mode_nonrd()
2670 &var, use_model_yrd_large, best_pickmode->best_sse, is_single_pred); in handle_inter_mode_nonrd()
2672 aom_usec_timer_mark(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2673 x->ms_stat_nonrd.ifs_time[bsize][this_mode] += in handle_inter_mode_nonrd()
2674 aom_usec_timer_elapsed(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2677 } else if (cpi->oxcf.motion_mode_cfg.allow_warped_motion && in handle_inter_mode_nonrd()
2680 search_motion_mode(cpi, x, &search_state->this_rdc, mi_row, mi_col, bsize, in handle_inter_mode_nonrd()
2682 best_pickmode->best_sse); in handle_inter_mode_nonrd()
2684 this_mv[0] = mi->mv[0]; in handle_inter_mode_nonrd()
2688 mi->interp_filters = in handle_inter_mode_nonrd()
2693 mi->interp_filters = av1_broadcast_interp_filter(EIGHTTAP_REGULAR); in handle_inter_mode_nonrd()
2695 // If it is sub-pel motion and cb_pred_filter_search is enabled, select in handle_inter_mode_nonrd()
2696 // the pre-decided filter in handle_inter_mode_nonrd()
2698 mi->interp_filters = av1_broadcast_interp_filter(filt_select); in handle_inter_mode_nonrd()
2701 aom_usec_timer_start(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2706 init_inter_mode_params(&mi->mv[0].as_mv, &inter_pred_params_sr, in handle_inter_mode_nonrd()
2707 &subpel_params, xd->block_ref_scale_factors[0], in handle_inter_mode_nonrd()
2708 pd->pre->width, pd->pre->height); in handle_inter_mode_nonrd()
2718 &search_state->this_rdc, &this_early_term, 0, in handle_inter_mode_nonrd()
2719 best_pickmode->best_sse, &var, var_threshold); in handle_inter_mode_nonrd()
2721 model_rd_for_sb_y(cpi, bsize, x, xd, &search_state->this_rdc, &var, 0, in handle_inter_mode_nonrd()
2725 aom_usec_timer_mark(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2726 x->ms_stat_nonrd.model_rd_time[bsize][this_mode] += in handle_inter_mode_nonrd()
2727 aom_usec_timer_elapsed(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2733 search_state->vars[INTER_OFFSET(this_mode)][ref_frame] = var; in handle_inter_mode_nonrd()
2734 if (this_mv->as_int == 0) { in handle_inter_mode_nonrd()
2735 search_state->vars[INTER_OFFSET(GLOBALMV)][ref_frame] = var; in handle_inter_mode_nonrd()
2744 if (ref_frame == LAST_FRAME && this_mv->as_int == 0) { in handle_inter_mode_nonrd()
2745 *sse_zeromv_norm = (unsigned int)(search_state->this_rdc.sse >> in handle_inter_mode_nonrd()
2751 if (rt_sf->sse_early_term_inter_search && in handle_inter_mode_nonrd()
2752 early_term_inter_search_with_sse(rt_sf->sse_early_term_inter_search, in handle_inter_mode_nonrd()
2753 bsize, search_state->this_rdc.sse, in handle_inter_mode_nonrd()
2754 best_pickmode->best_sse, this_mode)) { in handle_inter_mode_nonrd()
2760 x->ms_stat_nonrd.num_nonskipped_searches[bsize][this_mode]++; in handle_inter_mode_nonrd()
2764 const int skip_txfm_cost = mode_costs->skip_txfm_cost[skip_ctx][1]; in handle_inter_mode_nonrd()
2765 const int no_skip_txfm_cost = mode_costs->skip_txfm_cost[skip_ctx][0]; in handle_inter_mode_nonrd()
2766 const int64_t sse_y = search_state->this_rdc.sse; in handle_inter_mode_nonrd()
2769 search_state->this_rdc.skip_txfm = 1; in handle_inter_mode_nonrd()
2770 search_state->this_rdc.rate = skip_txfm_cost; in handle_inter_mode_nonrd()
2771 search_state->this_rdc.dist = search_state->this_rdc.sse << 4; in handle_inter_mode_nonrd()
2774 aom_usec_timer_start(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2777 av1_block_yrd(x, &search_state->this_rdc, &is_skippable, bsize, in handle_inter_mode_nonrd()
2778 mi->tx_size); in handle_inter_mode_nonrd()
2779 if (search_state->this_rdc.skip_txfm || in handle_inter_mode_nonrd()
2780 RDCOST(x->rdmult, search_state->this_rdc.rate, in handle_inter_mode_nonrd()
2781 search_state->this_rdc.dist) >= in handle_inter_mode_nonrd()
2782 RDCOST(x->rdmult, 0, search_state->this_rdc.sse)) { in handle_inter_mode_nonrd()
2783 if (!search_state->this_rdc.skip_txfm) { in handle_inter_mode_nonrd()
2786 nonskip_rdc = search_state->this_rdc; in handle_inter_mode_nonrd()
2789 search_state->this_rdc.rate = skip_txfm_cost; in handle_inter_mode_nonrd()
2790 search_state->this_rdc.skip_txfm = 1; in handle_inter_mode_nonrd()
2791 search_state->this_rdc.dist = search_state->this_rdc.sse; in handle_inter_mode_nonrd()
2793 search_state->this_rdc.rate += no_skip_txfm_cost; in handle_inter_mode_nonrd()
2797 if ((x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] || in handle_inter_mode_nonrd()
2798 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)])) { in handle_inter_mode_nonrd()
2801 get_plane_block_size(bsize, xd->plane[AOM_PLANE_U].subsampling_x, in handle_inter_mode_nonrd()
2802 xd->plane[AOM_PLANE_U].subsampling_y); in handle_inter_mode_nonrd()
2803 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)]) { in handle_inter_mode_nonrd()
2807 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)]) { in handle_inter_mode_nonrd()
2814 if (rdc_uv.dist < x->min_dist_inter_uv) in handle_inter_mode_nonrd()
2815 x->min_dist_inter_uv = rdc_uv.dist; in handle_inter_mode_nonrd()
2816 search_state->this_rdc.sse += sse_uv; in handle_inter_mode_nonrd()
2818 if (search_state->this_rdc.skip_txfm && !rdc_uv.skip_txfm && in handle_inter_mode_nonrd()
2820 search_state->this_rdc = nonskip_rdc; in handle_inter_mode_nonrd()
2822 search_state->uv_dist[INTER_OFFSET(this_mode)][ref_frame] = rdc_uv.dist; in handle_inter_mode_nonrd()
2824 search_state->this_rdc.rate += rdc_uv.rate; in handle_inter_mode_nonrd()
2825 search_state->this_rdc.dist += rdc_uv.dist; in handle_inter_mode_nonrd()
2826 search_state->this_rdc.skip_txfm = in handle_inter_mode_nonrd()
2827 search_state->this_rdc.skip_txfm && rdc_uv.skip_txfm; in handle_inter_mode_nonrd()
2830 aom_usec_timer_mark(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2831 x->ms_stat_nonrd.txfm_time[bsize][this_mode] += in handle_inter_mode_nonrd()
2832 aom_usec_timer_elapsed(&x->ms_stat_nonrd.timer2); in handle_inter_mode_nonrd()
2838 search_state->this_rdc.rate += rate_mv; in handle_inter_mode_nonrd()
2841 av1_mode_context_analyzer(mbmi_ext->mode_context, mi->ref_frame); in handle_inter_mode_nonrd()
2842 search_state->this_rdc.rate += cost_mv_ref(mode_costs, this_mode, mode_ctx); in handle_inter_mode_nonrd()
2847 this_mv->as_int == search_state->frame_mv[GLOBALMV][ref_frame].as_int) { in handle_inter_mode_nonrd()
2849 search_state->single_inter_mode_costs, mbmi_ext)) { in handle_inter_mode_nonrd()
2854 search_state->this_rdc.rate += in handle_inter_mode_nonrd()
2856 ->single_inter_mode_costs[INTER_OFFSET(this_best_mode)][ref_frame]; in handle_inter_mode_nonrd()
2859 if (is_single_pred && this_mv->as_int == 0 && var < UINT_MAX) { in handle_inter_mode_nonrd()
2860 search_state->vars[INTER_OFFSET(GLOBALMV)][ref_frame] = var; in handle_inter_mode_nonrd()
2863 search_state->this_rdc.rate += search_state->ref_costs_single[ref_frame]; in handle_inter_mode_nonrd()
2865 search_state->this_rdc.rdcost = RDCOST(x->rdmult, search_state->this_rdc.rate, in handle_inter_mode_nonrd()
2866 search_state->this_rdc.dist); in handle_inter_mode_nonrd()
2867 if (cpi->oxcf.rc_cfg.mode == AOM_CBR && is_single_pred) { in handle_inter_mode_nonrd()
2868 newmv_diff_bias(xd, this_best_mode, &search_state->this_rdc, bsize, in handle_inter_mode_nonrd()
2869 search_state->frame_mv[this_best_mode][ref_frame].as_mv.row, in handle_inter_mode_nonrd()
2870 search_state->frame_mv[this_best_mode][ref_frame].as_mv.col, in handle_inter_mode_nonrd()
2871 cpi->speed, x->source_variance, x->content_state_sb); in handle_inter_mode_nonrd()
2875 if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc_pickmode && in handle_inter_mode_nonrd()
2876 cpi->denoiser.denoising_level > kDenLowLow) { in handle_inter_mode_nonrd()
2879 if (ref_frame == LAST_FRAME && this_mv->as_int == 0) in handle_inter_mode_nonrd()
2880 *zero_last_cost_orig = search_state->this_rdc.rdcost; in handle_inter_mode_nonrd()
2886 search_state->mode_checked[this_mode][ref_frame] = 1; in handle_inter_mode_nonrd()
2887 search_state->mode_checked[this_best_mode][ref_frame] = 1; in handle_inter_mode_nonrd()
2891 abs(search_state->frame_mv[this_best_mode][ref_frame].as_mv.row) + in handle_inter_mode_nonrd()
2892 abs(search_state->frame_mv[this_best_mode][ref_frame].as_mv.col); in handle_inter_mode_nonrd()
2900 aom_usec_timer_mark(&x->ms_stat_nonrd.timer1); in handle_inter_mode_nonrd()
2901 x->ms_stat_nonrd.nonskipped_search_times[bsize][this_mode] += in handle_inter_mode_nonrd()
2902 aom_usec_timer_elapsed(&x->ms_stat_nonrd.timer1); in handle_inter_mode_nonrd()
2905 if (x->sb_me_block && ref_frame == LAST_FRAME && in handle_inter_mode_nonrd()
2906 search_state->frame_mv[this_best_mode][ref_frame].as_int == in handle_inter_mode_nonrd()
2907 x->sb_me_mv.as_int) in handle_inter_mode_nonrd()
2911 if (search_state->this_rdc.rdcost < search_state->best_rdc.rdcost) { in handle_inter_mode_nonrd()
2912 search_state->best_rdc = search_state->this_rdc; in handle_inter_mode_nonrd()
2918 search_state->frame_mv_best[this_best_mode][ref_frame].as_int = in handle_inter_mode_nonrd()
2919 search_state->frame_mv[this_best_mode][ref_frame].as_int; in handle_inter_mode_nonrd()
2921 search_state->frame_mv_best[this_best_mode][ref_frame2].as_int = in handle_inter_mode_nonrd()
2922 search_state->frame_mv[this_best_mode][ref_frame2].as_int; in handle_inter_mode_nonrd()
2926 free_pred_buffer(best_pickmode->best_pred); in handle_inter_mode_nonrd()
2927 best_pickmode->best_pred = *this_mode_pred; in handle_inter_mode_nonrd()
2933 if (*best_early_term && (idx > 0 || rt_sf->nonrd_aggressive_skip)) { in handle_inter_mode_nonrd()
2934 txfm_info->skip_txfm = 1; in handle_inter_mode_nonrd()
2935 if (!x->sb_me_block || *sb_me_has_been_tested) return false; in handle_inter_mode_nonrd()
2940 // Function to perform screen content mode evaluation for non-rd
2947 AV1_COMMON *const cm = &cpi->common; in handle_screen_content_mode_nonrd()
2948 const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; in handle_screen_content_mode_nonrd()
2949 MACROBLOCKD *const xd = &x->e_mbd; in handle_screen_content_mode_nonrd()
2950 MB_MODE_INFO *const mi = xd->mi[0]; in handle_screen_content_mode_nonrd()
2951 struct macroblockd_plane *const pd = &xd->plane[0]; in handle_screen_content_mode_nonrd()
2954 TxfmSearchInfo *txfm_info = &x->txfm_search_info; in handle_screen_content_mode_nonrd()
2955 BEST_PICKMODE *const best_pickmode = &search_state->best_pickmode; in handle_screen_content_mode_nonrd()
2957 // TODO(marpan): Only allow for 8 bit-depth for now, re-enable for 10/12 bit in handle_screen_content_mode_nonrd()
2959 if (cm->seq_params->bit_depth == 8 && in handle_screen_content_mode_nonrd()
2960 cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && !skip_idtx_palette && in handle_screen_content_mode_nonrd()
2961 !cpi->oxcf.txfm_cfg.use_inter_dct_only && !x->force_zeromv_skip_for_blk && in handle_screen_content_mode_nonrd()
2962 is_inter_mode(best_pickmode->best_mode) && in handle_screen_content_mode_nonrd()
2963 best_pickmode->best_pred != NULL && in handle_screen_content_mode_nonrd()
2964 (!rt_sf->prune_idtx_nonrd || in handle_screen_content_mode_nonrd()
2965 (rt_sf->prune_idtx_nonrd && bsize <= BLOCK_32X32 && in handle_screen_content_mode_nonrd()
2966 best_pickmode->best_mode_skip_txfm != 1 && x->source_variance > 200))) { in handle_screen_content_mode_nonrd()
2971 pd->dst.buf = this_mode_pred->data; in handle_screen_content_mode_nonrd()
2972 pd->dst.stride = bw; in handle_screen_content_mode_nonrd()
2973 const PRED_BUFFER *const best_pred = best_pickmode->best_pred; in handle_screen_content_mode_nonrd()
2974 av1_block_yrd_idtx(x, best_pred->data, best_pred->stride, &idtx_rdc, in handle_screen_content_mode_nonrd()
2975 &is_skippable, bsize, mi->tx_size); in handle_screen_content_mode_nonrd()
2976 int64_t idx_rdcost_y = RDCOST(x->rdmult, idtx_rdc.rate, idtx_rdc.dist); in handle_screen_content_mode_nonrd()
2979 if ((x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] || in handle_screen_content_mode_nonrd()
2980 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)])) { in handle_screen_content_mode_nonrd()
2983 get_plane_block_size(bsize, xd->plane[AOM_PLANE_U].subsampling_x, in handle_screen_content_mode_nonrd()
2984 xd->plane[AOM_PLANE_U].subsampling_y); in handle_screen_content_mode_nonrd()
2985 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)]) { in handle_screen_content_mode_nonrd()
2989 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)]) { in handle_screen_content_mode_nonrd()
2995 if (rdc_uv.dist < x->min_dist_inter_uv) in handle_screen_content_mode_nonrd()
2996 x->min_dist_inter_uv = rdc_uv.dist; in handle_screen_content_mode_nonrd()
3000 if (idx_rdcost_y == 0 && rdc_uv.dist > 0 && x->source_variance < 3000 && in handle_screen_content_mode_nonrd()
3001 x->content_state_sb.source_sad_nonrd > kMedSad) in handle_screen_content_mode_nonrd()
3004 int64_t idx_rdcost = RDCOST(x->rdmult, idtx_rdc.rate, idtx_rdc.dist); in handle_screen_content_mode_nonrd()
3005 if (allow_idtx && idx_rdcost < search_state->best_rdc.rdcost) { in handle_screen_content_mode_nonrd()
3006 best_pickmode->tx_type = IDTX; in handle_screen_content_mode_nonrd()
3007 search_state->best_rdc.rdcost = idx_rdcost; in handle_screen_content_mode_nonrd()
3008 best_pickmode->best_mode_skip_txfm = idtx_rdc.skip_txfm; in handle_screen_content_mode_nonrd()
3010 memcpy(ctx->blk_skip, txfm_info->blk_skip, in handle_screen_content_mode_nonrd()
3011 sizeof(txfm_info->blk_skip[0]) * ctx->num_4x4_blk); in handle_screen_content_mode_nonrd()
3013 xd->tx_type_map[0] = best_pickmode->tx_type; in handle_screen_content_mode_nonrd()
3014 memset(ctx->tx_type_map, best_pickmode->tx_type, ctx->num_4x4_blk); in handle_screen_content_mode_nonrd()
3015 memset(xd->tx_type_map, best_pickmode->tx_type, ctx->num_4x4_blk); in handle_screen_content_mode_nonrd()
3017 pd->dst = *orig_dst; in handle_screen_content_mode_nonrd()
3022 search_state->ref_costs_single[INTRA_FRAME]; in handle_screen_content_mode_nonrd()
3024 if (!is_mode_intra(best_pickmode->best_mode)) { in handle_screen_content_mode_nonrd()
3025 PRED_BUFFER *const best_pred = best_pickmode->best_pred; in handle_screen_content_mode_nonrd()
3027 if (best_pred->data == orig_dst->buf) { in handle_screen_content_mode_nonrd()
3029 aom_convolve_copy(best_pred->data, best_pred->stride, in handle_screen_content_mode_nonrd()
3030 this_mode_pred->data, this_mode_pred->stride, bw, bh); in handle_screen_content_mode_nonrd()
3031 best_pickmode->best_pred = this_mode_pred; in handle_screen_content_mode_nonrd()
3034 pd->dst = *orig_dst; in handle_screen_content_mode_nonrd()
3038 &search_state->this_rdc, in handle_screen_content_mode_nonrd()
3039 search_state->best_rdc.rdcost); in handle_screen_content_mode_nonrd()
3041 if (search_state->this_rdc.rdcost < search_state->best_rdc.rdcost) { in handle_screen_content_mode_nonrd()
3042 best_pickmode->pmi = mi->palette_mode_info; in handle_screen_content_mode_nonrd()
3043 best_pickmode->best_mode = DC_PRED; in handle_screen_content_mode_nonrd()
3044 mi->mv[0].as_int = INVALID_MV; in handle_screen_content_mode_nonrd()
3045 mi->mv[1].as_int = INVALID_MV; in handle_screen_content_mode_nonrd()
3046 best_pickmode->best_ref_frame = INTRA_FRAME; in handle_screen_content_mode_nonrd()
3047 best_pickmode->best_second_ref_frame = NONE; in handle_screen_content_mode_nonrd()
3048 search_state->best_rdc.rate = search_state->this_rdc.rate; in handle_screen_content_mode_nonrd()
3049 search_state->best_rdc.dist = search_state->this_rdc.dist; in handle_screen_content_mode_nonrd()
3050 search_state->best_rdc.rdcost = search_state->this_rdc.rdcost; in handle_screen_content_mode_nonrd()
3051 best_pickmode->best_mode_skip_txfm = search_state->this_rdc.skip_txfm; in handle_screen_content_mode_nonrd()
3053 if (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] || in handle_screen_content_mode_nonrd()
3054 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)]) in handle_screen_content_mode_nonrd()
3055 search_state->this_rdc.skip_txfm = 0; in handle_screen_content_mode_nonrd()
3056 if (!search_state->this_rdc.skip_txfm) { in handle_screen_content_mode_nonrd()
3057 memcpy(ctx->blk_skip, txfm_info->blk_skip, in handle_screen_content_mode_nonrd()
3058 sizeof(txfm_info->blk_skip[0]) * ctx->num_4x4_blk); in handle_screen_content_mode_nonrd()
3060 if (xd->tx_type_map[0] != DCT_DCT) in handle_screen_content_mode_nonrd()
3061 av1_copy_array(ctx->tx_type_map, xd->tx_type_map, ctx->num_4x4_blk); in handle_screen_content_mode_nonrd()
3065 /*!\brief AV1 inter mode selection based on Non-RD optimized model.
3069 * Top level function for Non-RD optimized inter mode selection.
3078 * \param[in] cpi Top-level encoder structure
3097 AV1_COMMON *const cm = &cpi->common; in av1_nonrd_pick_inter_mode_sb()
3098 SVC *const svc = &cpi->svc; in av1_nonrd_pick_inter_mode_sb()
3099 MACROBLOCKD *const xd = &x->e_mbd; in av1_nonrd_pick_inter_mode_sb()
3100 MB_MODE_INFO *const mi = xd->mi[0]; in av1_nonrd_pick_inter_mode_sb()
3101 struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; in av1_nonrd_pick_inter_mode_sb()
3102 const MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext; in av1_nonrd_pick_inter_mode_sb()
3104 const unsigned char segment_id = mi->segment_id; in av1_nonrd_pick_inter_mode_sb()
3109 const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; in av1_nonrd_pick_inter_mode_sb()
3110 bool check_globalmv = rt_sf->check_globalmv_on_single_ref; in av1_nonrd_pick_inter_mode_sb()
3115 rt_sf->reuse_inter_pred_nonrd && cm->seq_params->bit_depth == AOM_BITS_8; in av1_nonrd_pick_inter_mode_sb()
3125 struct buf_2d orig_dst = pd->dst; in av1_nonrd_pick_inter_mode_sb()
3126 const TxfmSearchParams *txfm_params = &x->txfm_search_params; in av1_nonrd_pick_inter_mode_sb()
3127 TxfmSearchInfo *txfm_info = &x->txfm_search_info; in av1_nonrd_pick_inter_mode_sb()
3130 assert(cpi->mt_info.num_workers <= 1); in av1_nonrd_pick_inter_mode_sb()
3131 aom_usec_timer_start(&x->ms_stat_nonrd.bsize_timer); in av1_nonrd_pick_inter_mode_sb()
3134 const int mi_row = xd->mi_row; in av1_nonrd_pick_inter_mode_sb()
3135 const int mi_col = xd->mi_col; in av1_nonrd_pick_inter_mode_sb()
3147 const ModeCosts *mode_costs = &x->mode_costs; in av1_nonrd_pick_inter_mode_sb()
3149 av1_setup_scale_factors_for_frame(&sf_no_scale, cm->width, cm->height, in av1_nonrd_pick_inter_mode_sb()
3150 cm->width, cm->height); in av1_nonrd_pick_inter_mode_sb()
3157 tmp_buffer[3].data = pd->dst.buf; in av1_nonrd_pick_inter_mode_sb()
3158 tmp_buffer[3].stride = pd->dst.stride; in av1_nonrd_pick_inter_mode_sb()
3167 // is half pixel shifted to left and top, so (-4, -4). This has more effect in av1_nonrd_pick_inter_mode_sb()
3170 if (cpi->ppi->use_svc && svc->spatial_layer_id > 0 && in av1_nonrd_pick_inter_mode_sb()
3171 !svc->has_lower_quality_layer && in av1_nonrd_pick_inter_mode_sb()
3172 svc->downsample_filter_phase[svc->spatial_layer_id - 1] == 8 && in av1_nonrd_pick_inter_mode_sb()
3173 cm->width * cm->height > 640 * 480) { in av1_nonrd_pick_inter_mode_sb()
3174 svc_mv.as_mv.row = -4; in av1_nonrd_pick_inter_mode_sb()
3175 svc_mv.as_mv.col = -4; in av1_nonrd_pick_inter_mode_sb()
3188 if (rt_sf->use_comp_ref_nonrd && is_comp_ref_allowed(bsize)) { in av1_nonrd_pick_inter_mode_sb()
3191 comp_use_zero_zeromv_only = rt_sf->check_only_zero_zeromv_on_large_blocks; in av1_nonrd_pick_inter_mode_sb()
3199 if (x->pred_mv_sad[LAST_FRAME] != INT_MAX) { in av1_nonrd_pick_inter_mode_sb()
3200 thresh_sad_pred = ((int64_t)x->pred_mv_sad[LAST_FRAME]) << 1; in av1_nonrd_pick_inter_mode_sb()
3202 if (rt_sf->nonrd_prune_ref_frame_search == 1) in av1_nonrd_pick_inter_mode_sb()
3203 thresh_sad_pred += (x->pred_mv_sad[LAST_FRAME] >> 2); in av1_nonrd_pick_inter_mode_sb()
3208 // decide block-level interp filter search flags: in av1_nonrd_pick_inter_mode_sb()
3216 x->content_state_sb.source_sad_nonrd > kVeryLowSad in av1_nonrd_pick_inter_mode_sb()
3217 ? cpi->sf.interp_sf.cb_pred_filter_search in av1_nonrd_pick_inter_mode_sb()
3224 x->ms_stat_nonrd.num_blocks[bsize]++; in av1_nonrd_pick_inter_mode_sb()
3227 mi->tx_size = AOMMIN( in av1_nonrd_pick_inter_mode_sb()
3229 tx_mode_to_biggest_tx_size[txfm_params->tx_mode_search_type]), in av1_nonrd_pick_inter_mode_sb()
3234 mbmi_ext->mode_context); in av1_nonrd_pick_inter_mode_sb()
3241 init_inter_block_params(&inter_pred_params_sr, pd->width, pd->height, in av1_nonrd_pick_inter_mode_sb()
3242 mi_row * MI_SIZE, mi_col * MI_SIZE, pd->subsampling_x, in av1_nonrd_pick_inter_mode_sb()
3243 pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd), in av1_nonrd_pick_inter_mode_sb()
3246 get_conv_params(/*do_average=*/0, AOM_PLANE_Y, xd->bd); in av1_nonrd_pick_inter_mode_sb()
3248 x->block_is_zero_sad = x->content_state_sb.source_sad_nonrd == kZeroSad || in av1_nonrd_pick_inter_mode_sb()
3249 segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP); in av1_nonrd_pick_inter_mode_sb()
3250 if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && in av1_nonrd_pick_inter_mode_sb()
3251 !x->force_zeromv_skip_for_blk && in av1_nonrd_pick_inter_mode_sb()
3252 x->content_state_sb.source_sad_nonrd != kZeroSad && in av1_nonrd_pick_inter_mode_sb()
3253 x->source_variance == 0 && bsize < cm->seq_params->sb_size && in av1_nonrd_pick_inter_mode_sb()
3254 search_state.yv12_mb[LAST_FRAME][0].width == cm->width && in av1_nonrd_pick_inter_mode_sb()
3255 search_state.yv12_mb[LAST_FRAME][0].height == cm->height) { in av1_nonrd_pick_inter_mode_sb()
3260 x->sb_me_block = x->sb_me_partition; in av1_nonrd_pick_inter_mode_sb()
3263 if (x->sb_me_block) { in av1_nonrd_pick_inter_mode_sb()
3264 if (cm->seq_params->sb_size == BLOCK_128X128 && bsize < BLOCK_64X64) in av1_nonrd_pick_inter_mode_sb()
3265 x->sb_me_block = 0; in av1_nonrd_pick_inter_mode_sb()
3266 else if (cm->seq_params->sb_size == BLOCK_64X64 && bsize < BLOCK_32X32) in av1_nonrd_pick_inter_mode_sb()
3267 x->sb_me_block = 0; in av1_nonrd_pick_inter_mode_sb()
3270 x->min_dist_inter_uv = INT64_MAX; in av1_nonrd_pick_inter_mode_sb()
3274 if (rt_sf->skip_compound_based_on_var && idx == num_inter_modes && in av1_nonrd_pick_inter_mode_sb()
3282 if (idx == 0 && !x->force_zeromv_skip_for_blk) { in av1_nonrd_pick_inter_mode_sb()
3284 // Use y-sad already computed in find_predictors: take the sad with motion in av1_nonrd_pick_inter_mode_sb()
3285 // vector closest to 0; the uv-sad computed below in set_color_sensitivity in av1_nonrd_pick_inter_mode_sb()
3287 // For screen: first check if golden reference is being used, if so, in av1_nonrd_pick_inter_mode_sb()
3291 if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && in av1_nonrd_pick_inter_mode_sb()
3293 if (x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_U)] == 1) in av1_nonrd_pick_inter_mode_sb()
3294 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] = 1; in av1_nonrd_pick_inter_mode_sb()
3295 if (x->color_sensitivity_sb_g[COLOR_SENS_IDX(AOM_PLANE_V)] == 1) in av1_nonrd_pick_inter_mode_sb()
3296 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)] = 1; in av1_nonrd_pick_inter_mode_sb()
3299 x->pred_mv0_sad[LAST_FRAME] != INT_MAX) { in av1_nonrd_pick_inter_mode_sb()
3300 int y_sad = x->pred_mv0_sad[LAST_FRAME]; in av1_nonrd_pick_inter_mode_sb()
3301 if (x->pred_mv1_sad[LAST_FRAME] != INT_MAX && in av1_nonrd_pick_inter_mode_sb()
3306 y_sad = x->pred_mv1_sad[LAST_FRAME]; in av1_nonrd_pick_inter_mode_sb()
3307 set_color_sensitivity(cpi, x, bsize, y_sad, x->source_variance, in av1_nonrd_pick_inter_mode_sb()
3324 xd->plane[plane].pre[0] = search_state.yv12_mb[ref_frame][plane]; in av1_nonrd_pick_inter_mode_sb()
3326 xd->plane[plane].pre[1] = search_state.yv12_mb[ref_frame2][plane]; in av1_nonrd_pick_inter_mode_sb()
3329 mi->ref_frame[0] = ref_frame; in av1_nonrd_pick_inter_mode_sb()
3330 mi->ref_frame[1] = ref_frame2; in av1_nonrd_pick_inter_mode_sb()
3337 xd->block_ref_scale_factors[0] = &sf_no_scale; in av1_nonrd_pick_inter_mode_sb()
3340 xd->block_ref_scale_factors[1] = &sf_no_scale; in av1_nonrd_pick_inter_mode_sb()
3343 // Perform inter mode evaluation for non-rd in av1_nonrd_pick_inter_mode_sb()
3360 mi->mode = best_pickmode->best_mode; in av1_nonrd_pick_inter_mode_sb()
3361 mi->motion_mode = best_pickmode->best_motion_mode; in av1_nonrd_pick_inter_mode_sb()
3362 mi->wm_params = best_pickmode->wm_params; in av1_nonrd_pick_inter_mode_sb()
3363 mi->num_proj_ref = best_pickmode->num_proj_ref; in av1_nonrd_pick_inter_mode_sb()
3364 mi->interp_filters = best_pickmode->best_pred_filter; in av1_nonrd_pick_inter_mode_sb()
3365 mi->tx_size = best_pickmode->best_tx_size; in av1_nonrd_pick_inter_mode_sb()
3366 memset(mi->inter_tx_size, mi->tx_size, sizeof(mi->inter_tx_size)); in av1_nonrd_pick_inter_mode_sb()
3367 mi->ref_frame[0] = best_pickmode->best_ref_frame; in av1_nonrd_pick_inter_mode_sb()
3368 mi->mv[0].as_int = search_state in av1_nonrd_pick_inter_mode_sb()
3369 .frame_mv_best[best_pickmode->best_mode] in av1_nonrd_pick_inter_mode_sb()
3370 [best_pickmode->best_ref_frame] in av1_nonrd_pick_inter_mode_sb()
3372 mi->mv[1].as_int = 0; in av1_nonrd_pick_inter_mode_sb()
3373 if (best_pickmode->best_second_ref_frame > INTRA_FRAME) { in av1_nonrd_pick_inter_mode_sb()
3374 mi->ref_frame[1] = best_pickmode->best_second_ref_frame; in av1_nonrd_pick_inter_mode_sb()
3375 mi->mv[1].as_int = search_state in av1_nonrd_pick_inter_mode_sb()
3376 .frame_mv_best[best_pickmode->best_mode] in av1_nonrd_pick_inter_mode_sb()
3377 [best_pickmode->best_second_ref_frame] in av1_nonrd_pick_inter_mode_sb()
3382 mi->angle_delta[PLANE_TYPE_Y] = 0; in av1_nonrd_pick_inter_mode_sb()
3383 mi->angle_delta[PLANE_TYPE_UV] = 0; in av1_nonrd_pick_inter_mode_sb()
3384 mi->filter_intra_mode_info.use_filter_intra = 0; in av1_nonrd_pick_inter_mode_sb()
3387 aom_usec_timer_start(&x->ms_stat_nonrd.timer1); in av1_nonrd_pick_inter_mode_sb()
3388 x->ms_stat_nonrd.num_searches[bsize][DC_PRED]++; in av1_nonrd_pick_inter_mode_sb()
3389 x->ms_stat_nonrd.num_nonskipped_searches[bsize][DC_PRED]++; in av1_nonrd_pick_inter_mode_sb()
3393 if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && in av1_nonrd_pick_inter_mode_sb()
3394 x->content_state_sb.source_sad_nonrd != kZeroSad && in av1_nonrd_pick_inter_mode_sb()
3396 unsigned int thresh_sse = cpi->rc.high_source_sad ? 15000 : 200000; in av1_nonrd_pick_inter_mode_sb()
3397 unsigned int thresh_source_var = cpi->rc.high_source_sad ? 50 : 200; in av1_nonrd_pick_inter_mode_sb()
3403 x->source_variance > thresh_source_var) in av1_nonrd_pick_inter_mode_sb()
3408 if (!x->force_zeromv_skip_for_blk) in av1_nonrd_pick_inter_mode_sb()
3415 int skip_idtx_palette = (x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_U)] || in av1_nonrd_pick_inter_mode_sb()
3416 x->color_sensitivity[COLOR_SENS_IDX(AOM_PLANE_V)]) && in av1_nonrd_pick_inter_mode_sb()
3417 x->content_state_sb.source_sad_nonrd != kZeroSad && in av1_nonrd_pick_inter_mode_sb()
3418 !cpi->rc.high_source_sad; in av1_nonrd_pick_inter_mode_sb()
3421 !skip_idtx_palette && cpi->oxcf.tool_cfg.enable_palette && in av1_nonrd_pick_inter_mode_sb()
3422 av1_allow_palette(cpi->common.features.allow_screen_content_tools, in av1_nonrd_pick_inter_mode_sb()
3423 mi->bsize); in av1_nonrd_pick_inter_mode_sb()
3426 (is_mode_intra(best_pickmode->best_mode) || force_palette_test) && in av1_nonrd_pick_inter_mode_sb()
3427 x->source_variance > 0 && !x->force_zeromv_skip_for_blk && in av1_nonrd_pick_inter_mode_sb()
3428 (cpi->rc.high_source_sad || x->source_variance > 300); in av1_nonrd_pick_inter_mode_sb()
3430 if (rt_sf->prune_palette_nonrd && bsize > BLOCK_16X16) try_palette = 0; in av1_nonrd_pick_inter_mode_sb()
3432 // Perform screen content mode evaluation for non-rd in av1_nonrd_pick_inter_mode_sb()
3438 aom_usec_timer_mark(&x->ms_stat_nonrd.timer1); in av1_nonrd_pick_inter_mode_sb()
3439 x->ms_stat_nonrd.nonskipped_search_times[bsize][DC_PRED] += in av1_nonrd_pick_inter_mode_sb()
3440 aom_usec_timer_elapsed(&x->ms_stat_nonrd.timer1); in av1_nonrd_pick_inter_mode_sb()
3443 pd->dst = orig_dst; in av1_nonrd_pick_inter_mode_sb()
3445 if (try_palette) mi->palette_mode_info = best_pickmode->pmi; in av1_nonrd_pick_inter_mode_sb()
3446 mi->mode = best_pickmode->best_mode; in av1_nonrd_pick_inter_mode_sb()
3447 mi->ref_frame[0] = best_pickmode->best_ref_frame; in av1_nonrd_pick_inter_mode_sb()
3448 mi->ref_frame[1] = best_pickmode->best_second_ref_frame; in av1_nonrd_pick_inter_mode_sb()
3450 if (is_lossless_requested(&cpi->oxcf.rc_cfg)) { in av1_nonrd_pick_inter_mode_sb()
3451 txfm_info->skip_txfm = 0; in av1_nonrd_pick_inter_mode_sb()
3452 memset(ctx->blk_skip, 0, sizeof(ctx->blk_skip[0]) * ctx->num_4x4_blk); in av1_nonrd_pick_inter_mode_sb()
3454 txfm_info->skip_txfm = best_pickmode->best_mode_skip_txfm; in av1_nonrd_pick_inter_mode_sb()
3457 mi->comp_group_idx = 0; in av1_nonrd_pick_inter_mode_sb()
3458 mi->compound_idx = 1; in av1_nonrd_pick_inter_mode_sb()
3459 mi->interinter_comp.type = COMPOUND_AVERAGE; in av1_nonrd_pick_inter_mode_sb()
3463 mi->interp_filters = av1_broadcast_interp_filter(SWITCHABLE_FILTERS); in av1_nonrd_pick_inter_mode_sb()
3467 if (search_state.use_scaled_ref_frame[best_pickmode->best_ref_frame] || in av1_nonrd_pick_inter_mode_sb()
3470 .use_scaled_ref_frame[best_pickmode->best_second_ref_frame])) in av1_nonrd_pick_inter_mode_sb()
3471 x->reuse_inter_pred = 0; in av1_nonrd_pick_inter_mode_sb()
3475 if (reuse_inter_pred && best_pickmode->best_pred != NULL) { in av1_nonrd_pick_inter_mode_sb()
3476 PRED_BUFFER *const best_pred = best_pickmode->best_pred; in av1_nonrd_pick_inter_mode_sb()
3477 if (best_pred->data != orig_dst.buf && is_inter_mode(mi->mode)) { in av1_nonrd_pick_inter_mode_sb()
3478 aom_convolve_copy(best_pred->data, best_pred->stride, pd->dst.buf, in av1_nonrd_pick_inter_mode_sb()
3479 pd->dst.stride, bw, bh); in av1_nonrd_pick_inter_mode_sb()
3484 if (cpi->oxcf.noise_sensitivity > 0 && resize_pending == 0 && in av1_nonrd_pick_inter_mode_sb()
3485 denoise_svc_pickmode && cpi->denoiser.denoising_level > kDenLowLow && in av1_nonrd_pick_inter_mode_sb()
3486 cpi->denoiser.reset == 0) { in av1_nonrd_pick_inter_mode_sb()
3488 ctx->sb_skip_denoising = 0; in av1_nonrd_pick_inter_mode_sb()
3498 best_pickmode->best_ref_frame = ctx_den.best_ref_frame; in av1_nonrd_pick_inter_mode_sb()
3503 if (cpi->sf.inter_sf.adaptive_rd_thresh && !has_second_ref(mi)) { in av1_nonrd_pick_inter_mode_sb()
3505 mode_idx[best_pickmode->best_ref_frame][mode_offset(mi->mode)]; in av1_nonrd_pick_inter_mode_sb()
3506 if (best_pickmode->best_ref_frame == INTRA_FRAME) { in av1_nonrd_pick_inter_mode_sb()
3516 update_thresh_freq_fact(cpi, x, bsize, best_pickmode->best_ref_frame, in av1_nonrd_pick_inter_mode_sb()
3523 store_coding_context_nonrd(x, ctx, mi->mode); in av1_nonrd_pick_inter_mode_sb()
3529 aom_usec_timer_mark(&x->ms_stat_nonrd.bsize_timer); in av1_nonrd_pick_inter_mode_sb()
3530 x->ms_stat_nonrd.total_block_times[bsize] += in av1_nonrd_pick_inter_mode_sb()
3531 aom_usec_timer_elapsed(&x->ms_stat_nonrd.bsize_timer); in av1_nonrd_pick_inter_mode_sb()
3532 print_time(&x->ms_stat_nonrd, bsize, cm->mi_params.mi_rows, in av1_nonrd_pick_inter_mode_sb()
3533 cm->mi_params.mi_cols, mi_row, mi_col); in av1_nonrd_pick_inter_mode_sb()
3538 // Reset the xd->block_ref_scale_factors[i], as they may have in av1_nonrd_pick_inter_mode_sb()
3541 set_ref_ptrs(cm, xd, mi->ref_frame[0], mi->ref_frame[1]); in av1_nonrd_pick_inter_mode_sb()