• Home
  • Raw
  • Download

Lines Matching +full:- +full:- +full:features

36     int mi_row, int mi_col, BLOCK_SIZE bsize, float *features,
88 default: assert(0 && "Invalid bsize"); return -1; in convert_bsize_to_idx()
109 const float *features, in write_features_to_file() argument
124 fprintf(pfile, "%.6f", features[i]); in write_features_to_file()
125 if (i < feature_size - 1) fprintf(pfile, ","); in write_features_to_file()
133 // -- add support for hdres
134 // -- add support for pruning rectangular partitions
135 // -- use reconstructed pixels instead of source pixels for padding
136 // -- use chroma pixels in addition to luma pixels
141 assert(cm->seq_params->sb_size >= BLOCK_64X64 && in av1_intra_mode_cnn_partition()
143 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_intra_mode_cnn_partition()
144 const BLOCK_SIZE bsize = blk_params->bsize; in av1_intra_mode_cnn_partition()
152 PartitionSearchInfo *part_info = &x->part_search_info; in av1_intra_mode_cnn_partition()
155 if (bsize == BLOCK_64X64 && !part_info->cnn_output_valid) { in av1_intra_mode_cnn_partition()
167 float *curr_buf_ptr = part_info->cnn_buffer; in av1_intra_mode_cnn_partition()
186 const MACROBLOCKD *xd = &x->e_mbd; in av1_intra_mode_cnn_partition()
187 const int bit_depth = xd->bd; in av1_intra_mode_cnn_partition()
189 av1_dc_quant_QTX(x->qindex, 0, bit_depth) >> (bit_depth - 8); in av1_intra_mode_cnn_partition()
190 part_info->log_q = logf(1.0f + (float)(dc_q * dc_q) / 256.0f); in av1_intra_mode_cnn_partition()
191 part_info->log_q = in av1_intra_mode_cnn_partition()
192 (part_info->log_q - av1_intra_mode_cnn_partition_mean[0]) / in av1_intra_mode_cnn_partition()
196 stride = x->plane[AOM_PLANE_Y].src.stride; in av1_intra_mode_cnn_partition()
198 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { in av1_intra_mode_cnn_partition()
200 CONVERT_TO_SHORTPTR(x->plane[AOM_PLANE_Y].src.buf) - stride - 1 in av1_intra_mode_cnn_partition()
206 aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, in av1_intra_mode_cnn_partition()
211 uint8_t *image[1] = { x->plane[AOM_PLANE_Y].src.buf - stride - 1 }; in av1_intra_mode_cnn_partition()
215 aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, in av1_intra_mode_cnn_partition()
221 part_info->cnn_output_valid = 1; in av1_intra_mode_cnn_partition()
224 if (!part_info->cnn_output_valid) { in av1_intra_mode_cnn_partition()
241 const float *branch_0 = part_info->cnn_buffer; in av1_intra_mode_cnn_partition()
258 dnn_features[f_idx++] = part_info->log_q; in av1_intra_mode_cnn_partition()
265 const int curr_lin_idx = quad_to_linear_1[quad_tree_idx - 1]; in av1_intra_mode_cnn_partition()
270 dnn_features[f_idx++] = part_info->log_q; in av1_intra_mode_cnn_partition()
273 const int prev_quad_idx = (quad_tree_idx - 1) / 4; in av1_intra_mode_cnn_partition()
274 const int prev_lin_idx = quad_to_linear_1[prev_quad_idx - 1]; in av1_intra_mode_cnn_partition()
280 const int curr_lin_idx = quad_to_linear_2[quad_tree_idx - 5]; in av1_intra_mode_cnn_partition()
285 dnn_features[f_idx++] = part_info->log_q; in av1_intra_mode_cnn_partition()
288 const int prev_quad_idx = (quad_tree_idx - 1) / 4; in av1_intra_mode_cnn_partition()
289 const int prev_lin_idx = quad_to_linear_2[prev_quad_idx - 5]; in av1_intra_mode_cnn_partition()
295 const int curr_lin_idx = quad_to_linear_3[quad_tree_idx - 21]; in av1_intra_mode_cnn_partition()
300 dnn_features[f_idx++] = part_info->log_q; in av1_intra_mode_cnn_partition()
308 const int is_720p_or_larger = AOMMIN(cm->width, cm->height) >= 720; in av1_intra_mode_cnn_partition()
309 const int is_480p_or_larger = AOMMIN(cm->width, cm->height) >= 480; in av1_intra_mode_cnn_partition()
310 float split_only_thresh = 100.0f, no_split_thresh = -100.0f; in av1_intra_mode_cnn_partition()
332 part_state->partition_none_allowed = 0; in av1_intra_mode_cnn_partition()
334 part_state->do_square_split = 1; in av1_intra_mode_cnn_partition()
348 return -1; in get_simple_motion_search_prune_agg()
359 // Aggressive pruning for lower quantizers in non-boosted frames to prune in get_simple_motion_search_prune_agg()
369 const AV1_COMMON *const cm = &cpi->common; in av1_simple_motion_search_based_split()
370 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_simple_motion_search_based_split()
371 const int mi_row = blk_params->mi_row, mi_col = blk_params->mi_col; in av1_simple_motion_search_based_split()
372 const BLOCK_SIZE bsize = blk_params->bsize; in av1_simple_motion_search_based_split()
375 const int is_720p_or_larger = AOMMIN(cm->width, cm->height) >= 720; in av1_simple_motion_search_based_split()
376 const int is_480p_or_larger = AOMMIN(cm->width, cm->height) >= 480; in av1_simple_motion_search_based_split()
389 x->qindex, cpi->sf.part_sf.simple_motion_search_prune_agg, 0); in av1_simple_motion_search_based_split()
399 float features[FEATURE_SIZE_SMS_SPLIT] = { 0.0f }; in av1_simple_motion_search_based_split() local
401 bsize, features, in av1_simple_motion_search_based_split()
404 // Write features to file in av1_simple_motion_search_based_split()
405 write_features_to_file(cpi->oxcf.partition_info_path, in av1_simple_motion_search_based_split()
406 cpi->ext_part_controller.test_mode, features, in av1_simple_motion_search_based_split()
409 // Note: it is intended to not normalize the features here, to keep it in av1_simple_motion_search_based_split()
410 // consistent for all features collected and passed to the external model. in av1_simple_motion_search_based_split()
412 cpi, features, &part_state->partition_none_allowed, in av1_simple_motion_search_based_split()
413 &part_state->partition_rect_allowed[HORZ], in av1_simple_motion_search_based_split()
414 &part_state->partition_rect_allowed[VERT], in av1_simple_motion_search_based_split()
415 &part_state->do_rectangular_split, &part_state->do_square_split)) { in av1_simple_motion_search_based_split()
420 features[idx] = (features[idx] - ml_mean[idx]) / ml_std[idx]; in av1_simple_motion_search_based_split()
425 av1_nn_predict(features, nn_config, 1, &score); in av1_simple_motion_search_based_split()
431 if (cpi->sf.part_sf.simple_motion_search_split >= 2 && in av1_simple_motion_search_based_split()
438 if (cpi->sf.part_sf.simple_motion_search_rect_split) { in av1_simple_motion_search_based_split()
442 [cpi->sf.part_sf.simple_motion_search_rect_split][res_idx] in av1_simple_motion_search_based_split()
445 part_state->do_rectangular_split = 0; in av1_simple_motion_search_based_split()
451 // the refs and returns the ref with the smallest sse. Returns -1 if none of the
461 const AV1_COMMON *const cm = &cpi->common; in simple_motion_search_get_best_ref()
462 int best_ref = -1; in simple_motion_search_get_best_ref()
464 if (mi_col >= cm->mi_params.mi_cols || mi_row >= cm->mi_params.mi_rows) { in simple_motion_search_get_best_ref()
474 const MACROBLOCKD *xd = &x->e_mbd; in simple_motion_search_get_best_ref()
483 if (cpi->ref_frame_flags & av1_ref_frame_flag_list[ref]) { in simple_motion_search_get_best_ref()
484 const FULLPEL_MV *start_mvs = sms_tree->start_mvs; in simple_motion_search_get_best_ref()
489 curr_var = cpi->ppi->fn_ptr[bsize].vf( in simple_motion_search_get_best_ref()
490 x->plane[0].src.buf, x->plane[0].src.stride, xd->plane[0].dst.buf, in simple_motion_search_get_best_ref()
491 xd->plane[0].dst.stride, &curr_sse); in simple_motion_search_get_best_ref()
499 sms_tree->start_mvs[ref].row = best_mv.as_mv.row / 8; in simple_motion_search_get_best_ref()
500 sms_tree->start_mvs[ref].col = best_mv.as_mv.col / 8; in simple_motion_search_get_best_ref()
505 SIMPLE_MOTION_DATA_TREE *sub_tree = sms_tree->split[r_idx]; in simple_motion_search_get_best_ref()
506 sub_tree->start_mvs[ref] = sms_tree->start_mvs[ref]; in simple_motion_search_get_best_ref()
516 // Collects features using simple_motion_search and store them in features. The
517 // features are also cached in SIMPLE_MOTION_DATA_TREE. By default, the features
519 // Furthermore, if features is not NULL, then 7 more features are appended to
520 // the end of features:
521 // - log(1.0 + dc_q ** 2)
522 // - whether an above macroblock exists
523 // - width of above macroblock
524 // - height of above macroblock
525 // - whether a left marcoblock exists
526 // - width of left macroblock
527 // - height of left macroblock
530 int mi_row, int mi_col, BLOCK_SIZE bsize, float *features, in simple_motion_search_prune_part_features() argument
536 assert(cpi->ref_frame_flags & av1_ref_frame_flag_list[LAST_FRAME] || in simple_motion_search_prune_part_features()
537 cpi->ref_frame_flags & av1_ref_frame_flag_list[ALTREF_FRAME]); in simple_motion_search_prune_part_features()
540 const int ref_list[] = { cpi->rc.is_src_frame_alt_ref ? ALTREF_FRAME in simple_motion_search_prune_part_features()
546 if (!sms_tree->sms_none_valid && features_to_get & FEATURE_SMS_NONE_FLAG) { in simple_motion_search_prune_part_features()
549 &sms_tree->sms_none_feat[0], in simple_motion_search_prune_part_features()
550 &sms_tree->sms_none_feat[1]); in simple_motion_search_prune_part_features()
551 sms_tree->sms_none_valid = 1; in simple_motion_search_prune_part_features()
560 SIMPLE_MOTION_DATA_TREE *sub_tree = sms_tree->split[r_idx]; in simple_motion_search_prune_part_features()
562 if (!sub_tree->sms_none_valid) { in simple_motion_search_prune_part_features()
565 num_refs, use_subpixel, 1, &sub_tree->sms_none_feat[0], in simple_motion_search_prune_part_features()
566 &sub_tree->sms_none_feat[1]); in simple_motion_search_prune_part_features()
567 sub_tree->sms_none_valid = 1; in simple_motion_search_prune_part_features()
573 if (!sms_tree->sms_rect_valid && features_to_get & FEATURE_SMS_RECT_FLAG) { in simple_motion_search_prune_part_features()
582 use_subpixel, 0, &sms_tree->sms_rect_feat[2 * r_idx], in simple_motion_search_prune_part_features()
583 &sms_tree->sms_rect_feat[2 * r_idx + 1]); in simple_motion_search_prune_part_features()
594 use_subpixel, 0, &sms_tree->sms_rect_feat[4 + 2 * r_idx], in simple_motion_search_prune_part_features()
595 &sms_tree->sms_rect_feat[4 + 2 * r_idx + 1]); in simple_motion_search_prune_part_features()
597 sms_tree->sms_rect_valid = 1; in simple_motion_search_prune_part_features()
600 if (!features) return; in simple_motion_search_prune_part_features()
605 features[f_idx++] = logf(1.0f + sms_tree->sms_none_feat[sub_idx]); in simple_motion_search_prune_part_features()
611 SIMPLE_MOTION_DATA_TREE *sub_tree = sms_tree->split[sub_idx]; in simple_motion_search_prune_part_features()
612 features[f_idx++] = logf(1.0f + sub_tree->sms_none_feat[0]); in simple_motion_search_prune_part_features()
613 features[f_idx++] = logf(1.0f + sub_tree->sms_none_feat[1]); in simple_motion_search_prune_part_features()
619 features[f_idx++] = logf(1.0f + sms_tree->sms_rect_feat[sub_idx]); in simple_motion_search_prune_part_features()
623 const MACROBLOCKD *xd = &x->e_mbd; in simple_motion_search_prune_part_features()
627 const int dc_q = av1_dc_quant_QTX(x->qindex, 0, xd->bd) >> (xd->bd - 8); in simple_motion_search_prune_part_features()
628 features[f_idx++] = logf(1.0f + (float)(dc_q * dc_q) / 256.0f); in simple_motion_search_prune_part_features()
631 const int has_above = !!xd->above_mbmi; in simple_motion_search_prune_part_features()
632 const int has_left = !!xd->left_mbmi; in simple_motion_search_prune_part_features()
633 const BLOCK_SIZE above_bsize = has_above ? xd->above_mbmi->bsize : bsize; in simple_motion_search_prune_part_features()
634 const BLOCK_SIZE left_bsize = has_left ? xd->left_mbmi->bsize : bsize; in simple_motion_search_prune_part_features()
635 features[f_idx++] = (float)has_above; in simple_motion_search_prune_part_features()
636 features[f_idx++] = (float)mi_size_wide_log2[above_bsize]; in simple_motion_search_prune_part_features()
637 features[f_idx++] = (float)mi_size_high_log2[above_bsize]; in simple_motion_search_prune_part_features()
638 features[f_idx++] = (float)has_left; in simple_motion_search_prune_part_features()
639 features[f_idx++] = (float)mi_size_wide_log2[left_bsize]; in simple_motion_search_prune_part_features()
640 features[f_idx++] = (float)mi_size_high_log2[left_bsize]; in simple_motion_search_prune_part_features()
646 const AV1_COMMON *const cm = &cpi->common; in av1_simple_motion_search_prune_rect()
647 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_simple_motion_search_prune_rect()
648 const int mi_row = blk_params->mi_row, mi_col = blk_params->mi_col; in av1_simple_motion_search_prune_rect()
649 const BLOCK_SIZE bsize = blk_params->bsize; in av1_simple_motion_search_prune_rect()
652 const int is_720p_or_larger = AOMMIN(cm->width, cm->height) >= 720; in av1_simple_motion_search_prune_rect()
653 const int is_480p_or_larger = AOMMIN(cm->width, cm->height) >= 480; in av1_simple_motion_search_prune_rect()
664 x->qindex, cpi->sf.part_sf.simple_motion_search_prune_agg, 1); in av1_simple_motion_search_prune_rect()
677 // Get features in av1_simple_motion_search_prune_rect()
678 float features[FEATURE_SIZE_SMS_PRUNE_PART] = { 0.0f }; in av1_simple_motion_search_prune_rect() local
680 bsize, features, in av1_simple_motion_search_prune_rect()
683 // Note: it is intended to not normalize the features here, to keep it in av1_simple_motion_search_prune_rect()
684 // consistent for all features collected and passed to the external model. in av1_simple_motion_search_prune_rect()
685 if (cpi->sf.part_sf.simple_motion_search_prune_rect && in av1_simple_motion_search_prune_rect()
687 (part_state->partition_rect_allowed[HORZ] || in av1_simple_motion_search_prune_rect()
688 part_state->partition_rect_allowed[VERT]) && in av1_simple_motion_search_prune_rect()
690 // Write features to file in av1_simple_motion_search_prune_rect()
692 cpi->oxcf.partition_info_path, cpi->ext_part_controller.test_mode, in av1_simple_motion_search_prune_rect()
693 features, FEATURE_SIZE_SMS_PRUNE_PART, 1, bsize, mi_row, mi_col); in av1_simple_motion_search_prune_rect()
696 cpi, features, &part_state->prune_rect_part[HORZ], in av1_simple_motion_search_prune_rect()
697 &part_state->prune_rect_part[VERT])) { in av1_simple_motion_search_prune_rect()
703 features[f_idx] = (features[f_idx] - ml_mean[f_idx]) / ml_std[f_idx]; in av1_simple_motion_search_prune_rect()
713 av1_nn_predict(features, nn_config, 1, scores); in av1_simple_motion_search_prune_rect()
719 part_state->prune_rect_part[HORZ] = 1; in av1_simple_motion_search_prune_rect()
722 part_state->prune_rect_part[VERT] = 1; in av1_simple_motion_search_prune_rect()
726 // Early terminates PARTITION_NONE using simple_motion_search features and the
728 // - The frame is a show frame
729 // - The frame is not intra only
730 // - The current bsize is > BLOCK_8X8
731 // - blk_row + blk_height/2 < total_rows and blk_col + blk_width/2 < total_cols
735 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_simple_motion_search_early_term_none()
736 const int mi_row = blk_params->mi_row, mi_col = blk_params->mi_col; in av1_simple_motion_search_early_term_none()
737 const BLOCK_SIZE bsize = blk_params->bsize; in av1_simple_motion_search_early_term_none()
739 float features[FEATURE_SIZE_SMS_TERM_NONE] = { 0.0f }; in av1_simple_motion_search_early_term_none() local
741 bsize, features, in av1_simple_motion_search_early_term_none()
745 features[f_idx++] = logf(1.0f + (float)none_rdc->rate); in av1_simple_motion_search_early_term_none()
746 features[f_idx++] = logf(1.0f + (float)none_rdc->dist); in av1_simple_motion_search_early_term_none()
747 features[f_idx++] = logf(1.0f + (float)none_rdc->rdcost); in av1_simple_motion_search_early_term_none()
775 // Write features to file in av1_simple_motion_search_early_term_none()
776 write_features_to_file(cpi->oxcf.partition_info_path, in av1_simple_motion_search_early_term_none()
777 cpi->ext_part_controller.test_mode, features, in av1_simple_motion_search_early_term_none()
781 cpi, features, &part_state->terminate_partition_search)) { in av1_simple_motion_search_early_term_none()
789 ml_model[f_idx] * (features[f_idx] - ml_mean[f_idx]) / ml_std[f_idx]; in av1_simple_motion_search_early_term_none()
794 part_state->terminate_partition_search = 1; in av1_simple_motion_search_early_term_none()
801 float *features) { in av1_get_max_min_partition_features() argument
802 AV1_COMMON *const cm = &cpi->common; in av1_get_max_min_partition_features()
803 MACROBLOCKD *xd = &x->e_mbd; in av1_get_max_min_partition_features()
804 const BLOCK_SIZE sb_size = cm->seq_params->sb_size; in av1_get_max_min_partition_features()
811 const int dc_q = av1_dc_quant_QTX(x->qindex, 0, xd->bd) >> (xd->bd - 8); in av1_get_max_min_partition_features()
814 // Perform full-pixel single motion search in Y plane of 16x16 mbs in the sb in av1_get_max_min_partition_features()
870 sum_mv_row_sq / (float)blks - avg_mv_row * avg_mv_row; in av1_get_max_min_partition_features()
874 sum_mv_col_sq / (float)blks - avg_mv_col * avg_mv_col; in av1_get_max_min_partition_features()
878 sum_log_sse_sq / (float)blks - avg_log_sse * avg_log_sse; in av1_get_max_min_partition_features()
880 features[f_idx++] = avg_log_sse; in av1_get_max_min_partition_features()
881 features[f_idx++] = avg_mv_col; in av1_get_max_min_partition_features()
882 features[f_idx++] = avg_mv_row; in av1_get_max_min_partition_features()
883 features[f_idx++] = log_q_sq; in av1_get_max_min_partition_features()
884 features[f_idx++] = max_abs_mv_col; in av1_get_max_min_partition_features()
885 features[f_idx++] = max_abs_mv_row; in av1_get_max_min_partition_features()
886 features[f_idx++] = max_log_sse; in av1_get_max_min_partition_features()
887 features[f_idx++] = min_abs_mv_col; in av1_get_max_min_partition_features()
888 features[f_idx++] = min_abs_mv_row; in av1_get_max_min_partition_features()
889 features[f_idx++] = min_log_sse; in av1_get_max_min_partition_features()
890 features[f_idx++] = var_log_sse; in av1_get_max_min_partition_features()
891 features[f_idx++] = var_mv_col; in av1_get_max_min_partition_features()
892 features[f_idx++] = var_mv_row; in av1_get_max_min_partition_features()
909 const float *features) { in av1_predict_max_partition() argument
913 assert(cpi->sf.part_sf.auto_max_partition_based_on_simple_motion != in av1_predict_max_partition()
916 av1_nn_predict(features, nn_config, 1, scores); in av1_predict_max_partition()
918 int result = MAX_NUM_CLASSES_MAX_MIN_PART_PRED - 1; in av1_predict_max_partition()
919 if (cpi->sf.part_sf.auto_max_partition_based_on_simple_motion == in av1_predict_max_partition()
935 if (cpi->sf.part_sf.auto_max_partition_based_on_simple_motion == in av1_predict_max_partition()
937 for (result = MAX_NUM_CLASSES_MAX_MIN_PART_PRED - 1; result >= 0; in av1_predict_max_partition()
938 --result) { in av1_predict_max_partition()
939 if (result < MAX_NUM_CLASSES_MAX_MIN_PART_PRED - 1) { in av1_predict_max_partition()
944 } else if (cpi->sf.part_sf.auto_max_partition_based_on_simple_motion == in av1_predict_max_partition()
946 const BLOCK_SIZE sb_size = cpi->common.seq_params->sb_size; in av1_predict_max_partition()
947 // TODO(debargha): x->source_variance is unavailable at this point, in av1_predict_max_partition()
950 cpi, &x->e_mbd, &x->plane[0].src, sb_size, AOM_PLANE_Y); in av1_predict_max_partition()
953 for (result = MAX_NUM_CLASSES_MAX_MIN_PART_PRED - 1; result >= 0; in av1_predict_max_partition()
954 --result) { in av1_predict_max_partition()
955 if (result < MAX_NUM_CLASSES_MAX_MIN_PART_PRED - 1) { in av1_predict_max_partition()
972 const BLOCK_SIZE bsize = sms_tree->block_size; in get_min_bsize()
979 PARTITION_TYPE part_type = sms_tree->partitioning; in get_min_bsize()
984 get_min_bsize(sms_tree->split[i], min_bw, min_bh); in get_min_bsize()
998 static INLINE void add_rd_feature(int64_t rd, int64_t best_rd, float *features, in add_rd_feature() argument
1002 features[(*feature_idx)++] = (float)rd_valid; in add_rd_feature()
1003 features[(*feature_idx)++] = rd_ratio; in add_rd_feature()
1006 #define FEATURES 31 macro
1013 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_ml_early_term_after_split()
1014 const int mi_row = blk_params->mi_row, mi_col = blk_params->mi_col; in av1_ml_early_term_after_split()
1015 const BLOCK_SIZE bsize = blk_params->bsize; in av1_ml_early_term_after_split()
1018 part_state->terminate_partition_search) in av1_ml_early_term_after_split()
1021 const AV1_COMMON *const cm = &cpi->common; in av1_ml_early_term_after_split()
1022 const int is_480p_or_larger = AOMMIN(cm->width, cm->height) >= 480; in av1_ml_early_term_after_split()
1024 float thresh = -1e6; in av1_ml_early_term_after_split()
1029 thresh = is_480p_or_larger ? -2.0f : -1.2f; in av1_ml_early_term_after_split()
1033 thresh = is_480p_or_larger ? -2.6f : -2.3f; in av1_ml_early_term_after_split()
1037 thresh = is_480p_or_larger ? -2.0f : -2.4f; in av1_ml_early_term_after_split()
1041 thresh = is_480p_or_larger ? -1.0f : -1.4f; in av1_ml_early_term_after_split()
1051 if (cpi->sf.part_sf.ml_early_term_after_part_split_level < 2) thresh -= 0.3f; in av1_ml_early_term_after_split()
1053 const MACROBLOCKD *const xd = &x->e_mbd; in av1_ml_early_term_after_split()
1054 const int dc_q = av1_dc_quant_QTX(x->qindex, 0, xd->bd) >> (xd->bd - 8); in av1_ml_early_term_after_split()
1057 float features[FEATURES] = { 0.0f }; in av1_ml_early_term_after_split() local
1059 features[f_idx++] = logf(1.0f + (float)dc_q / 4.0f); in av1_ml_early_term_after_split()
1060 features[f_idx++] = logf(1.0f + (float)best_rd / bs / bs / 1024.0f); in av1_ml_early_term_after_split()
1062 add_rd_feature(part_none_rd, best_rd, features, &f_idx); in av1_ml_early_term_after_split()
1063 add_rd_feature(part_split_rd, best_rd, features, &f_idx); in av1_ml_early_term_after_split()
1066 add_rd_feature(split_block_rd[i], best_rd, features, &f_idx); in av1_ml_early_term_after_split()
1069 get_min_bsize(sms_tree->split[i], &min_bw, &min_bh); in av1_ml_early_term_after_split()
1070 features[f_idx++] = (float)min_bw; in av1_ml_early_term_after_split()
1071 features[f_idx++] = (float)min_bh; in av1_ml_early_term_after_split()
1078 features[f_idx++] = logf(1.0f + (float)sms_tree->sms_none_feat[1]); in av1_ml_early_term_after_split()
1080 features[f_idx++] = logf(1.0f + (float)sms_tree->split[0]->sms_none_feat[1]); in av1_ml_early_term_after_split()
1081 features[f_idx++] = logf(1.0f + (float)sms_tree->split[1]->sms_none_feat[1]); in av1_ml_early_term_after_split()
1082 features[f_idx++] = logf(1.0f + (float)sms_tree->split[2]->sms_none_feat[1]); in av1_ml_early_term_after_split()
1083 features[f_idx++] = logf(1.0f + (float)sms_tree->split[3]->sms_none_feat[1]); in av1_ml_early_term_after_split()
1085 features[f_idx++] = logf(1.0f + (float)sms_tree->sms_rect_feat[1]); in av1_ml_early_term_after_split()
1086 features[f_idx++] = logf(1.0f + (float)sms_tree->sms_rect_feat[3]); in av1_ml_early_term_after_split()
1087 features[f_idx++] = logf(1.0f + (float)sms_tree->sms_rect_feat[5]); in av1_ml_early_term_after_split()
1088 features[f_idx++] = logf(1.0f + (float)sms_tree->sms_rect_feat[7]); in av1_ml_early_term_after_split()
1090 assert(f_idx == FEATURES); in av1_ml_early_term_after_split()
1092 // Write features to file in av1_ml_early_term_after_split()
1093 write_features_to_file(cpi->oxcf.partition_info_path, in av1_ml_early_term_after_split()
1094 cpi->ext_part_controller.test_mode, features, FEATURES, in av1_ml_early_term_after_split()
1098 cpi, features, &part_state->terminate_partition_search)) { in av1_ml_early_term_after_split()
1103 av1_nn_predict(features, nn_config, 1, &score); in av1_ml_early_term_after_split()
1106 part_state->terminate_partition_search = 1; in av1_ml_early_term_after_split()
1109 #undef FEATURES
1115 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_ml_prune_rect_partition()
1116 const int mi_row = blk_params->mi_row, mi_col = blk_params->mi_col; in av1_ml_prune_rect_partition()
1117 const BLOCK_SIZE bsize = blk_params->bsize; in av1_ml_prune_rect_partition()
1149 // 1. Compute input features in av1_ml_prune_rect_partition()
1150 float features[9]; in av1_ml_prune_rect_partition() local
1153 for (int i = 0; i < 5; i++) features[i] = 1.0f; in av1_ml_prune_rect_partition()
1155 features[0] = (float)none_rd / (float)best_rd; in av1_ml_prune_rect_partition()
1158 features[1 + i] = (float)split_rd[i] / (float)best_rd; in av1_ml_prune_rect_partition()
1162 const MACROBLOCKD *const xd = &x->e_mbd; in av1_ml_prune_rect_partition()
1165 cpi, xd, &x->plane[0].src, bsize, AOM_PLANE_Y); in av1_ml_prune_rect_partition()
1171 buf.stride = x->plane[0].src.stride; in av1_ml_prune_rect_partition()
1176 buf.buf = x->plane[0].src.buf + x_idx + y_idx * buf.stride; in av1_ml_prune_rect_partition()
1182 features[5 + i] = (float)split_variance[i] / (float)whole_block_variance; in av1_ml_prune_rect_partition()
1184 // Write features to file in av1_ml_prune_rect_partition()
1185 write_features_to_file(cpi->oxcf.partition_info_path, in av1_ml_prune_rect_partition()
1186 cpi->ext_part_controller.test_mode, features, in av1_ml_prune_rect_partition()
1190 &cpi->ext_part_controller, frame_is_intra_only(&cpi->common), in av1_ml_prune_rect_partition()
1191 features, &part_state->prune_rect_part[HORZ], in av1_ml_prune_rect_partition()
1192 &part_state->prune_rect_part[VERT])) { in av1_ml_prune_rect_partition()
1196 // 2. Do the prediction and prune 0-2 partitions based on their probabilities in av1_ml_prune_rect_partition()
1198 av1_nn_predict(features, nn_config, 1, raw_scores); in av1_ml_prune_rect_partition()
1204 if (probs[1] <= cur_thresh) part_state->prune_rect_part[HORZ] = 1; in av1_ml_prune_rect_partition()
1205 if (probs[2] <= cur_thresh) part_state->prune_rect_part[VERT] = 1; in av1_ml_prune_rect_partition()
1214 const PartitionBlkParams blk_params = part_state->part_blk_params; in av1_ml_prune_ab_partition()
1231 // Generate features. in av1_ml_prune_ab_partition()
1232 float features[10]; in av1_ml_prune_ab_partition() local
1234 features[feature_index++] = (float)part_ctx; in av1_ml_prune_ab_partition()
1235 features[feature_index++] = (float)var_ctx; in av1_ml_prune_ab_partition()
1240 const int64_t *horz_rd = part_state->rect_part_rd[HORZ]; in av1_ml_prune_ab_partition()
1246 const int64_t *vert_rd = part_state->rect_part_rd[VERT]; in av1_ml_prune_ab_partition()
1252 const int64_t *split_rd = part_state->split_rd; in av1_ml_prune_ab_partition()
1258 // Ratio between the sub-block RD and the whole-block RD. in av1_ml_prune_ab_partition()
1262 features[feature_index++] = rd_ratio; in av1_ml_prune_ab_partition()
1266 // Write features to file in av1_ml_prune_ab_partition()
1267 if (!frame_is_intra_only(&cpi->common)) { in av1_ml_prune_ab_partition()
1268 write_features_to_file(cpi->oxcf.partition_info_path, in av1_ml_prune_ab_partition()
1269 cpi->ext_part_controller.test_mode, features, in av1_ml_prune_ab_partition()
1274 &cpi->ext_part_controller, frame_is_intra_only(&cpi->common), in av1_ml_prune_ab_partition()
1275 features, &ab_partitions_allowed[HORZ_A], in av1_ml_prune_ab_partition()
1283 av1_nn_predict(features, nn_config, 1, score); in av1_ml_prune_ab_partition()
1285 int max_score = -1000; in av1_ml_prune_ab_partition()
1294 case BLOCK_16X16: thresh -= 150; break; in av1_ml_prune_ab_partition()
1295 case BLOCK_32X32: thresh -= 100; break; in av1_ml_prune_ab_partition()
1309 #define FEATURES 18 macro
1317 const PartitionBlkParams blk_params = part_state->part_blk_params; in av1_ml_prune_4_partition()
1322 int64_t(*rect_part_rd)[SUB_PARTITIONS_RECT] = part_state->rect_part_rd; in av1_ml_prune_4_partition()
1323 int64_t *split_rd = part_state->split_rd; in av1_ml_prune_4_partition()
1342 // Generate features. in av1_ml_prune_4_partition()
1343 float features[FEATURES]; in av1_ml_prune_4_partition() local
1345 features[feature_index++] = (float)part_ctx; in av1_ml_prune_4_partition()
1346 features[feature_index++] = (float)get_unsigned_bits(pb_source_variance); in av1_ml_prune_4_partition()
1367 // Ratio between the sub-block RD and the whole-block RD. in av1_ml_prune_4_partition()
1371 features[feature_index++] = rd_ratio; in av1_ml_prune_4_partition()
1374 // Get variance of the 1:4 and 4:1 sub-blocks. in av1_ml_prune_4_partition()
1380 av1_setup_src_planes(x, cpi->source, mi_row, mi_col, in av1_ml_prune_4_partition()
1381 av1_num_planes(&cpi->common), bsize); in av1_ml_prune_4_partition()
1382 const int src_stride = x->plane[0].src.stride; in av1_ml_prune_4_partition()
1383 uint8_t *src = x->plane[0].src.buf; in av1_ml_prune_4_partition()
1384 const MACROBLOCKD *const xd = &x->e_mbd; in av1_ml_prune_4_partition()
1405 // Ratio between the 4:1 sub-block variance and the whole-block variance. in av1_ml_prune_4_partition()
1409 features[feature_index++] = var_ratio; in av1_ml_prune_4_partition()
1412 // Ratio between the 1:4 sub-block RD and the whole-block RD. in av1_ml_prune_4_partition()
1416 features[feature_index++] = var_ratio; in av1_ml_prune_4_partition()
1418 assert(feature_index == FEATURES); in av1_ml_prune_4_partition()
1420 // Write features to file in av1_ml_prune_4_partition()
1421 if (!frame_is_intra_only(&cpi->common)) { in av1_ml_prune_4_partition()
1422 write_features_to_file(cpi->oxcf.partition_info_path, in av1_ml_prune_4_partition()
1423 cpi->ext_part_controller.test_mode, features, in av1_ml_prune_4_partition()
1424 FEATURES, 7, bsize, mi_row, mi_col); in av1_ml_prune_4_partition()
1429 av1_nn_predict(features, nn_config, 1, score); in av1_ml_prune_4_partition()
1431 int max_score = -1000; in av1_ml_prune_4_partition()
1440 case BLOCK_16X16: thresh -= 500; break; in av1_ml_prune_4_partition()
1441 case BLOCK_32X32: thresh -= 500; break; in av1_ml_prune_4_partition()
1442 case BLOCK_64X64: thresh -= 200; break; in av1_ml_prune_4_partition()
1453 #undef FEATURES
1456 #define FEATURES 4 macro
1461 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_ml_predict_breakout()
1462 const int mi_row = blk_params->mi_row, mi_col = blk_params->mi_col; in av1_ml_predict_breakout()
1463 const BLOCK_SIZE bsize = blk_params->bsize; in av1_ml_predict_breakout()
1470 thresh = cpi->sf.part_sf.ml_partition_search_breakout_thresh[0]; in av1_ml_predict_breakout()
1474 thresh = cpi->sf.part_sf.ml_partition_search_breakout_thresh[1]; in av1_ml_predict_breakout()
1478 thresh = cpi->sf.part_sf.ml_partition_search_breakout_thresh[2]; in av1_ml_predict_breakout()
1482 thresh = cpi->sf.part_sf.ml_partition_search_breakout_thresh[3]; in av1_ml_predict_breakout()
1486 thresh = cpi->sf.part_sf.ml_partition_search_breakout_thresh[4]; in av1_ml_predict_breakout()
1495 [cpi->sf.part_sf.ml_predict_breakout_level - 1]); in av1_ml_predict_breakout()
1498 float features[FEATURES]; in av1_ml_predict_breakout() local
1502 float rate_f = (float)AOMMIN(rd_stats->rate, INT_MAX); in av1_ml_predict_breakout()
1503 rate_f = ((float)x->rdmult / 128.0f / 512.0f / (float)(1 << num_pels_log2)) * in av1_ml_predict_breakout()
1505 features[feature_index++] = rate_f; in av1_ml_predict_breakout()
1508 (float)(AOMMIN(rd_stats->dist, INT_MAX) >> num_pels_log2); in av1_ml_predict_breakout()
1509 features[feature_index++] = dist_f; in av1_ml_predict_breakout()
1511 features[feature_index++] = (float)pb_source_variance; in av1_ml_predict_breakout()
1513 const int dc_q = (int)x->plane[0].dequant_QTX[0] >> (bit_depth - 8); in av1_ml_predict_breakout()
1514 features[feature_index++] = (float)(dc_q * dc_q) / 256.0f; in av1_ml_predict_breakout()
1515 assert(feature_index == FEATURES); in av1_ml_predict_breakout()
1517 // Write features to file in av1_ml_predict_breakout()
1518 write_features_to_file(cpi->oxcf.partition_info_path, in av1_ml_predict_breakout()
1519 cpi->ext_part_controller.test_mode, features, FEATURES, in av1_ml_predict_breakout()
1522 if (ext_ml_model_decision_after_none(&cpi->ext_part_controller, in av1_ml_predict_breakout()
1523 frame_is_intra_only(&cpi->common), in av1_ml_predict_breakout()
1524 features, &part_state->do_square_split, in av1_ml_predict_breakout()
1525 &part_state->do_rectangular_split)) { in av1_ml_predict_breakout()
1531 av1_nn_predict(features, nn_config, 1, &score); in av1_ml_predict_breakout()
1535 part_state->do_square_split = 0; in av1_ml_predict_breakout()
1536 part_state->do_rectangular_split = 0; in av1_ml_predict_breakout()
1539 #undef FEATURES
1545 const AV1_COMMON *const cm = &cpi->common; in av1_prune_partitions_before_search()
1546 const CommonModeInfoParams *const mi_params = &cm->mi_params; in av1_prune_partitions_before_search()
1548 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_prune_partitions_before_search()
1549 const BLOCK_SIZE bsize = blk_params->bsize; in av1_prune_partitions_before_search()
1551 if (cpi->third_pass_ctx) { in av1_prune_partitions_before_search()
1552 int mi_row = blk_params->mi_row; in av1_prune_partitions_before_search()
1553 int mi_col = blk_params->mi_col; in av1_prune_partitions_before_search()
1555 av1_get_third_pass_ratio(cpi->third_pass_ctx, 0, cm->height, cm->width, in av1_prune_partitions_before_search()
1558 cpi->third_pass_ctx, 0, mi_row, mi_col, ratio_h, ratio_w); in av1_prune_partitions_before_search()
1563 av1_third_pass_get_sb_part_type(cpi->third_pass_ctx, this_mi); in av1_prune_partitions_before_search()
1565 int is_edge = (mi_row + mi_size_high[bsize] >= cm->mi_params.mi_rows) || in av1_prune_partitions_before_search()
1566 (mi_col + mi_size_wide[bsize] >= cm->mi_params.mi_cols); in av1_prune_partitions_before_search()
1576 part_state->partition_rect_allowed[VERT] = 0; in av1_prune_partitions_before_search()
1581 part_state->partition_rect_allowed[HORZ] = 0; in av1_prune_partitions_before_search()
1591 part_state->terminate_partition_search = 1; in av1_prune_partitions_before_search()
1597 part_state->terminate_partition_search = 1; in av1_prune_partitions_before_search()
1622 if (bsize > cpi->sf.part_sf.rect_partition_eval_thresh) { in av1_prune_partitions_before_search()
1623 part_state->do_rectangular_split = 0; in av1_prune_partitions_before_search()
1624 part_state->partition_rect_allowed[HORZ] = 0; in av1_prune_partitions_before_search()
1625 part_state->partition_rect_allowed[VERT] = 0; in av1_prune_partitions_before_search()
1628 // Prune rectangular, AB and 4-way partition based on q index and block size in av1_prune_partitions_before_search()
1629 if (cpi->sf.part_sf.prune_rectangular_split_based_on_qidx == 1) { in av1_prune_partitions_before_search()
1630 if (bsize == BLOCK_8X8 && x->qindex < 35) in av1_prune_partitions_before_search()
1633 } else if (cpi->sf.part_sf.prune_rectangular_split_based_on_qidx == 2) { in av1_prune_partitions_before_search()
1635 const int sqr_bsize_step = BLOCK_32X32 - BLOCK_16X16; in av1_prune_partitions_before_search()
1637 BLOCK_32X32 - (x->qindex * 3 / QINDEX_RANGE) * sqr_bsize_step; in av1_prune_partitions_before_search()
1651 if (cpi->sf.part_sf.prune_sub_8x8_partition_level && (bsize == BLOCK_8X8)) { in av1_prune_partitions_before_search()
1652 const MACROBLOCKD *const xd = &x->e_mbd; in av1_prune_partitions_before_search()
1654 if (cpi->sf.part_sf.prune_sub_8x8_partition_level == 1) { in av1_prune_partitions_before_search()
1656 if (xd->left_available) in av1_prune_partitions_before_search()
1657 num_neighbors_lt_8x8 += (xd->left_mbmi->bsize <= BLOCK_8X8); in av1_prune_partitions_before_search()
1658 if (xd->up_available) in av1_prune_partitions_before_search()
1659 num_neighbors_lt_8x8 += (xd->above_mbmi->bsize <= BLOCK_8X8); in av1_prune_partitions_before_search()
1670 // A CNN-based speed feature pruning out either split or all non-split in av1_prune_partitions_before_search()
1674 cpi->sf.part_sf.intra_cnn_based_part_prune_level && in av1_prune_partitions_before_search()
1675 cm->seq_params->sb_size >= BLOCK_64X64 && bsize <= BLOCK_64X64 && in av1_prune_partitions_before_search()
1676 blk_params->bsize_at_least_8x8 && in av1_prune_partitions_before_search()
1681 &cpi->common, x, x->part_search_info.quad_tree_idx, in av1_prune_partitions_before_search()
1682 cpi->sf.part_sf.intra_cnn_based_part_prune_level, part_state); in av1_prune_partitions_before_search()
1685 // Use simple motion search to prune out split or non-split partitions. This in av1_prune_partitions_before_search()
1689 cpi->sf.part_sf.simple_motion_search_split && in av1_prune_partitions_before_search()
1690 part_state->do_square_split && blk_params->bsize_at_least_8x8 && in av1_prune_partitions_before_search()
1705 part_state->do_square_split || part_state->partition_none_allowed; in av1_prune_partitions_before_search()
1707 const int rect_part_allowed = part_state->do_rectangular_split && in av1_prune_partitions_before_search()
1708 ((part_state->partition_rect_allowed[HORZ] && in av1_prune_partitions_before_search()
1709 !part_state->prune_rect_part[HORZ]) || in av1_prune_partitions_before_search()
1710 (part_state->partition_rect_allowed[VERT] && in av1_prune_partitions_before_search()
1711 !part_state->prune_rect_part[VERT])); in av1_prune_partitions_before_search()
1713 const int try_prune_rect = cpi->sf.part_sf.simple_motion_search_prune_rect && in av1_prune_partitions_before_search()
1731 assert(is_bsize_square(sb_enc->max_partition_size)); in av1_prune_partitions_by_max_min_bsize()
1732 assert(is_bsize_square(sb_enc->min_partition_size)); in av1_prune_partitions_by_max_min_bsize()
1733 assert(sb_enc->min_partition_size <= sb_enc->max_partition_size); in av1_prune_partitions_by_max_min_bsize()
1734 const PartitionBlkParams *blk_params = &part_state->part_blk_params; in av1_prune_partitions_by_max_min_bsize()
1735 const BLOCK_SIZE bsize = blk_params->bsize; in av1_prune_partitions_by_max_min_bsize()
1737 const int max_partition_size_1d = block_size_wide[sb_enc->max_partition_size]; in av1_prune_partitions_by_max_min_bsize()
1738 const int min_partition_size_1d = block_size_wide[sb_enc->min_partition_size]; in av1_prune_partitions_by_max_min_bsize()
1754 part_state->do_square_split = 0; in av1_prune_partitions_by_max_min_bsize()
1756 part_state->partition_none_allowed = !(part_state->do_square_split); in av1_prune_partitions_by_max_min_bsize()
1769 const int num_win_thresh = AOMMIN(3 * (2 * (MAXQ - qindex) / MAXQ), 3); in evaluate_ab_partition_based_on_split()
1771 (rect_part_win_info == NULL) ? (pc_tree->partitioning == rect_part) in evaluate_ab_partition_based_on_split()
1772 : (rect_part == PARTITION_HORZ) ? rect_part_win_info->rect_part_win[HORZ] in evaluate_ab_partition_based_on_split()
1773 : rect_part_win_info->rect_part_win[VERT]; in evaluate_ab_partition_based_on_split()
1775 if (pc_tree->split[split_idx1]) { in evaluate_ab_partition_based_on_split()
1777 (pc_tree->split[split_idx1]->partitioning == PARTITION_NONE) ? 1 : 0; in evaluate_ab_partition_based_on_split()
1781 if (pc_tree->split[split_idx2]) { in evaluate_ab_partition_based_on_split()
1783 (pc_tree->split[split_idx2]->partitioning == PARTITION_NONE) ? 1 : 0; in evaluate_ab_partition_based_on_split()
1800 int64_t *horz_rd = part_state->rect_part_rd[HORZ]; in av1_prune_ab_partitions()
1801 int64_t *vert_rd = part_state->rect_part_rd[VERT]; in av1_prune_ab_partitions()
1802 int64_t *split_rd = part_state->split_rd; in av1_prune_ab_partitions()
1803 const PartitionCfg *const part_cfg = &cpi->oxcf.part_cfg; in av1_prune_ab_partitions()
1804 // The standard AB partitions are allowed initially if ext-partition-types are in av1_prune_ab_partitions()
1807 part_cfg->enable_ab_partitions && in av1_prune_ab_partitions()
1808 part_state->partition_rect_allowed[HORZ]; in av1_prune_ab_partitions()
1810 part_cfg->enable_ab_partitions && in av1_prune_ab_partitions()
1811 part_state->partition_rect_allowed[VERT]; in av1_prune_ab_partitions()
1815 if (cpi->sf.part_sf.prune_ext_partition_types_search_level) { in av1_prune_ab_partitions()
1816 if (cpi->sf.part_sf.prune_ext_partition_types_search_level == 1) { in av1_prune_ab_partitions()
1819 horzab_partition_allowed &= (pc_tree->partitioning == PARTITION_HORZ || in av1_prune_ab_partitions()
1820 (pc_tree->partitioning == PARTITION_NONE && in av1_prune_ab_partitions()
1822 pc_tree->partitioning == PARTITION_SPLIT); in av1_prune_ab_partitions()
1823 vertab_partition_allowed &= (pc_tree->partitioning == PARTITION_VERT || in av1_prune_ab_partitions()
1824 (pc_tree->partitioning == PARTITION_NONE && in av1_prune_ab_partitions()
1826 pc_tree->partitioning == PARTITION_SPLIT); in av1_prune_ab_partitions()
1828 horzab_partition_allowed &= (pc_tree->partitioning == PARTITION_HORZ || in av1_prune_ab_partitions()
1829 pc_tree->partitioning == PARTITION_SPLIT); in av1_prune_ab_partitions()
1830 vertab_partition_allowed &= (pc_tree->partitioning == PARTITION_VERT || in av1_prune_ab_partitions()
1831 pc_tree->partitioning == PARTITION_SPLIT); in av1_prune_ab_partitions()
1848 if (cpi->sf.part_sf.prune_ext_partition_types_search_level) { in av1_prune_ab_partitions()
1851 switch (cpi->sf.part_sf.prune_ext_partition_types_search_level) { in av1_prune_ab_partitions()
1869 if (cpi->sf.part_sf.prune_ext_partition_types_search_level) { in av1_prune_ab_partitions()
1872 switch (cpi->sf.part_sf.prune_ext_partition_types_search_level) { in av1_prune_ab_partitions()
1886 // sub-blocks from previous basic partition types. in av1_prune_ab_partitions()
1887 if (cpi->sf.part_sf.ml_prune_partition && ext_partition_allowed && in av1_prune_ab_partitions()
1888 part_state->partition_rect_allowed[HORZ] && in av1_prune_ab_partitions()
1889 part_state->partition_rect_allowed[VERT]) { in av1_prune_ab_partitions()
1890 // TODO(huisu@google.com): x->source_variance may not be the current in av1_prune_ab_partitions()
1892 // re-train the model to fix it. in av1_prune_ab_partitions()
1893 av1_ml_prune_ab_partition(cpi, pc_tree->partitioning, in av1_prune_ab_partitions()
1894 get_unsigned_bits(x->source_variance), in av1_prune_ab_partitions()
1899 // in the current block and sub-blocks in PARTITION_SPLIT. in av1_prune_ab_partitions()
1900 if (cpi->sf.part_sf.prune_ext_part_using_split_info >= 2 && in av1_prune_ab_partitions()
1903 pc_tree, PARTITION_HORZ, rect_part_win_info, x->qindex, 0, 1); in av1_prune_ab_partitions()
1905 if (cpi->sf.part_sf.prune_ext_part_using_split_info >= 2 && in av1_prune_ab_partitions()
1908 pc_tree, PARTITION_HORZ, rect_part_win_info, x->qindex, 2, 3); in av1_prune_ab_partitions()
1910 if (cpi->sf.part_sf.prune_ext_part_using_split_info >= 2 && in av1_prune_ab_partitions()
1913 pc_tree, PARTITION_VERT, rect_part_win_info, x->qindex, 0, 2); in av1_prune_ab_partitions()
1915 if (cpi->sf.part_sf.prune_ext_part_using_split_info >= 2 && in av1_prune_ab_partitions()
1918 pc_tree, PARTITION_VERT, rect_part_win_info, x->qindex, 1, 3); in av1_prune_ab_partitions()
1922 // Prepare features for the external model. Specifically, features after
1929 int mi_row, int mi_col, aom_partition_features_t *const features) { in prepare_features_after_part_ab() argument
1933 // Generate features. in prepare_features_after_part_ab()
1935 features->after_part_ab.f[feature_index++] = (float)part_ctx; in prepare_features_after_part_ab()
1936 features->after_part_ab.f[feature_index++] = in prepare_features_after_part_ab()
1958 // Ratio between the sub-block RD and the whole-block RD. in prepare_features_after_part_ab()
1962 features->after_part_ab.f[feature_index++] = rd_ratio; in prepare_features_after_part_ab()
1965 // Get variance of the 1:4 and 4:1 sub-blocks. in prepare_features_after_part_ab()
1971 av1_setup_src_planes(x, cpi->source, mi_row, mi_col, in prepare_features_after_part_ab()
1972 av1_num_planes(&cpi->common), bsize); in prepare_features_after_part_ab()
1973 const int src_stride = x->plane[0].src.stride; in prepare_features_after_part_ab()
1974 uint8_t *src = x->plane[0].src.buf; in prepare_features_after_part_ab()
1975 const MACROBLOCKD *const xd = &x->e_mbd; in prepare_features_after_part_ab()
1996 // Ratio between the 4:1 sub-block variance and the whole-block variance. in prepare_features_after_part_ab()
2000 features->after_part_ab.f[feature_index++] = var_ratio; in prepare_features_after_part_ab()
2003 // Ratio between the 1:4 sub-block RD and the whole-block RD. in prepare_features_after_part_ab()
2007 features->after_part_ab.f[feature_index++] = var_ratio; in prepare_features_after_part_ab()
2024 ExtPartController *const ext_part_controller = &cpi->ext_part_controller; in ext_ml_model_decision_before_none()
2025 if (!ext_part_controller->ready) return false; in ext_ml_model_decision_before_none()
2027 // Setup features. in ext_ml_model_decision_before_none()
2028 aom_partition_features_t features; in ext_ml_model_decision_before_none() local
2029 features.id = AOM_EXT_PART_FEATURE_BEFORE_NONE; in ext_ml_model_decision_before_none()
2031 features.before_part_none.f[i] = features_from_motion[i]; in ext_ml_model_decision_before_none()
2034 // Send necessary features to the external model. in ext_ml_model_decision_before_none()
2035 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_before_none()
2061 ExtPartController *const ext_part_controller = &cpi->ext_part_controller; in ext_ml_model_decision_before_none_part2()
2062 if (!ext_part_controller->ready) return false; in ext_ml_model_decision_before_none_part2()
2064 // Setup features. in ext_ml_model_decision_before_none_part2()
2065 aom_partition_features_t features; in ext_ml_model_decision_before_none_part2() local
2066 features.id = AOM_EXT_PART_FEATURE_BEFORE_NONE_PART2; in ext_ml_model_decision_before_none_part2()
2068 features.before_part_none.f_part2[i] = features_from_motion[i]; in ext_ml_model_decision_before_none_part2()
2071 // Send necessary features to the external model. in ext_ml_model_decision_before_none_part2()
2072 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_before_none_part2()
2095 if (!ext_part_controller->ready || is_intra_frame) return false; in ext_ml_model_decision_after_none()
2097 // Setup features. in ext_ml_model_decision_after_none()
2098 aom_partition_features_t features; in ext_ml_model_decision_after_none() local
2099 features.id = AOM_EXT_PART_FEATURE_AFTER_NONE; in ext_ml_model_decision_after_none()
2101 features.after_part_none.f[i] = features_after_none[i]; in ext_ml_model_decision_after_none()
2104 // Send necessary features to the external model. in ext_ml_model_decision_after_none()
2105 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_after_none()
2126 AV1_COMMON *const cm = &cpi->common; in ext_ml_model_decision_after_none_part2()
2127 ExtPartController *const ext_part_controller = &cpi->ext_part_controller; in ext_ml_model_decision_after_none_part2()
2128 if (!ext_part_controller->ready || frame_is_intra_only(cm)) return false; in ext_ml_model_decision_after_none_part2()
2130 // Setup features. in ext_ml_model_decision_after_none_part2()
2131 aom_partition_features_t features; in ext_ml_model_decision_after_none_part2() local
2132 features.id = AOM_EXT_PART_FEATURE_AFTER_NONE_PART2; in ext_ml_model_decision_after_none_part2()
2134 features.after_part_none.f_terminate[i] = features_terminate[i]; in ext_ml_model_decision_after_none_part2()
2137 // Send necessary features to the external model. in ext_ml_model_decision_after_none_part2()
2138 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_after_none_part2()
2158 const AV1_COMMON *const cm = &cpi->common; in ext_ml_model_decision_after_split()
2159 ExtPartController *const ext_part_controller = &cpi->ext_part_controller; in ext_ml_model_decision_after_split()
2160 if (frame_is_intra_only(cm) || !cpi->ext_part_controller.ready) { in ext_ml_model_decision_after_split()
2164 // Setup features. in ext_ml_model_decision_after_split()
2165 aom_partition_features_t features; in ext_ml_model_decision_after_split() local
2166 features.id = AOM_EXT_PART_FEATURE_AFTER_SPLIT; in ext_ml_model_decision_after_split()
2168 features.after_part_split.f_terminate[i] = features_terminate[i]; in ext_ml_model_decision_after_split()
2171 // Send necessary features to the external model. in ext_ml_model_decision_after_split()
2172 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_after_split()
2194 if (is_intra_frame || !ext_part_controller->ready) { in ext_ml_model_decision_after_split_part2()
2198 // Setup features. in ext_ml_model_decision_after_split_part2()
2199 aom_partition_features_t features; in ext_ml_model_decision_after_split_part2() local
2200 features.id = AOM_EXT_PART_FEATURE_AFTER_SPLIT_PART2; in ext_ml_model_decision_after_split_part2()
2202 features.after_part_split.f_prune_rect[i] = features_prune[i]; in ext_ml_model_decision_after_split_part2()
2205 // Send necessary features to the external model. in ext_ml_model_decision_after_split_part2()
2206 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_after_split_part2()
2232 if (is_intra_frame || !ext_part_controller->ready) return false; in ext_ml_model_decision_after_rect()
2234 // Setup features. in ext_ml_model_decision_after_rect()
2235 aom_partition_features_t features; in ext_ml_model_decision_after_rect() local
2236 features.id = AOM_EXT_PART_FEATURE_AFTER_RECT; in ext_ml_model_decision_after_rect()
2238 features.after_part_rect.f[i] = features_after_rect[i]; in ext_ml_model_decision_after_rect()
2241 // Send necessary features to the external model. in ext_ml_model_decision_after_rect()
2242 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_after_rect()
2269 const AV1_COMMON *const cm = &cpi->common; in ext_ml_model_decision_after_part_ab()
2270 ExtPartController *const ext_part_controller = &cpi->ext_part_controller; in ext_ml_model_decision_after_part_ab()
2272 if (!frame_is_intra_only(cm) && ext_part_controller->ready) { in ext_ml_model_decision_after_part_ab()
2273 // Setup features. in ext_ml_model_decision_after_part_ab()
2274 aom_partition_features_t features; in ext_ml_model_decision_after_part_ab() local
2275 features.id = AOM_EXT_PART_FEATURE_AFTER_AB; in ext_ml_model_decision_after_part_ab()
2278 mi_row, mi_col, &features); in ext_ml_model_decision_after_part_ab()
2280 // Send necessary features to the external model. in ext_ml_model_decision_after_part_ab()
2281 av1_ext_part_send_features(ext_part_controller, &features); in ext_ml_model_decision_after_part_ab()
2303 AV1_COMMON *const cm = &cpi->common; in setup_sms_tree()
2305 const int is_sb_size_128 = cm->seq_params->sb_size == BLOCK_128X128; in setup_sms_tree()
2321 tree->block_size = square[0]; in setup_sms_tree()
2329 tree->block_size = square[square_index]; in setup_sms_tree()
2330 for (int j = 0; j < 4; j++) tree->split[j] = this_sms++; in setup_sms_tree()
2341 tree->block_size = square[square_index]; in setup_sms_tree()
2345 return &sms_tree[tree_nodes - 1]; in setup_sms_tree()
2360 if (i < num_blocks - 1) fprintf(pfile, ","); in write_motion_feature_to_file()
2365 if (i < num_blocks - 1) fprintf(pfile, ","); in write_motion_feature_to_file()
2375 aom_partition_features_t *features) { in av1_collect_motion_search_features_sb() argument
2376 const AV1_COMMON *const cm = &cpi->common; in av1_collect_motion_search_features_sb()
2379 MACROBLOCK *const x = &td->mb; in av1_collect_motion_search_features_sb()
2385 const int is_sb_size_128 = cm->seq_params->sb_size == BLOCK_128X128; in av1_collect_motion_search_features_sb()
2390 TileInfo *const tile_info = &tile_data->tile_info; in av1_collect_motion_search_features_sb()
2395 const int ref_list[] = { cpi->rc.is_src_frame_alt_ref ? ALTREF_FRAME in av1_collect_motion_search_features_sb()
2398 AOMMIN(mi_size_wide[bsize], cm->mi_params.mi_cols - mi_col); in av1_collect_motion_search_features_sb()
2400 AOMMIN(mi_size_high[bsize], cm->mi_params.mi_rows - mi_row); in av1_collect_motion_search_features_sb()
2410 aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, in av1_collect_motion_search_features_sb()
2416 row < AOMMIN(mi_row + mi_size_high[bsize], cm->mi_params.mi_rows); in av1_collect_motion_search_features_sb()
2419 col < AOMMIN(mi_col + mi_size_wide[bsize], cm->mi_params.mi_cols); in av1_collect_motion_search_features_sb()
2428 if (features == NULL) { in av1_collect_motion_search_features_sb()
2429 write_motion_feature_to_file(cpi->oxcf.partition_info_path, cpi->sb_counter, in av1_collect_motion_search_features_sb()
2433 features->sb_features.motion_features.unit_length = in av1_collect_motion_search_features_sb()
2435 features->sb_features.motion_features.num_units = idx; in av1_collect_motion_search_features_sb()
2437 features->sb_features.motion_features.block_sse[i] = block_sse[i]; in av1_collect_motion_search_features_sb()
2438 features->sb_features.motion_features.block_var[i] = block_var[i]; in av1_collect_motion_search_features_sb()
2455 const AV1_COMMON *const cm = &cpi->common; in av1_prepare_motion_search_features_block()
2457 MACROBLOCK *const x = &td->mb; in av1_prepare_motion_search_features_block()
2460 const int is_sb_size_128 = cm->seq_params->sb_size == BLOCK_128X128; in av1_prepare_motion_search_features_block()
2465 TileInfo *const tile_info = &tile_data->tile_info; in av1_prepare_motion_search_features_block()
2468 const int ref_list[] = { cpi->rc.is_src_frame_alt_ref ? ALTREF_FRAME in av1_prepare_motion_search_features_block()
2518 memcpy(sms_tree->start_mvs, start_mvs, sizeof(sms_tree->start_mvs)); in init_simple_motion_search_mvs()
2519 av1_zero(sms_tree->sms_none_feat); in init_simple_motion_search_mvs()
2520 av1_zero(sms_tree->sms_rect_feat); in init_simple_motion_search_mvs()
2521 av1_zero(sms_tree->sms_none_valid); in init_simple_motion_search_mvs()
2522 av1_zero(sms_tree->sms_rect_valid); in init_simple_motion_search_mvs()
2524 if (sms_tree->block_size >= BLOCK_8X8) { in init_simple_motion_search_mvs()
2525 init_simple_motion_search_mvs(sms_tree->split[0], start_mvs); in init_simple_motion_search_mvs()
2526 init_simple_motion_search_mvs(sms_tree->split[1], start_mvs); in init_simple_motion_search_mvs()
2527 init_simple_motion_search_mvs(sms_tree->split[2], start_mvs); in init_simple_motion_search_mvs()
2528 init_simple_motion_search_mvs(sms_tree->split[3], start_mvs); in init_simple_motion_search_mvs()
2538 const AV1_COMMON *cm = &cpi->common; in av1_init_simple_motion_search_mvs_for_sb()
2539 MACROBLOCKD *const xd = &x->e_mbd; in av1_init_simple_motion_search_mvs_for_sb()
2541 const BLOCK_SIZE sb_size = cm->seq_params->sb_size; in av1_init_simple_motion_search_mvs_for_sb()
2551 cpi->rc.is_src_frame_alt_ref ? ALTREF_FRAME : LAST_FRAME; in av1_init_simple_motion_search_mvs_for_sb()
2552 av1_find_mv_refs(cm, xd, xd->mi[0], ref_frame, mbmi_ext.ref_mv_count, in av1_init_simple_motion_search_mvs_for_sb()
2553 xd->ref_mv_stack, xd->weight, NULL, mbmi_ext.global_mvs, in av1_init_simple_motion_search_mvs_for_sb()
2557 get_fullmv_from_mv(&xd->ref_mv_stack[ref_frame][0].this_mv.as_mv); in av1_init_simple_motion_search_mvs_for_sb()