| /* |
| * Copyright (c) 2019, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 2 Clause License and |
| * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| * was not distributed with this source code in the LICENSE file, you can |
| * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| * Media Patent License 1.0 was not distributed with this source code in the |
| * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| */ |
| |
| #ifndef AOM_AV1_ENCODER_PARTITION_STRATEGY_H_ |
| #define AOM_AV1_ENCODER_PARTITION_STRATEGY_H_ |
| |
| #include "av1/encoder/encodeframe.h" |
| #include "av1/encoder/encodemb.h" |
| #include "av1/encoder/encoder.h" |
| |
| // Performs a simple_motion_search with a single reference frame and extract |
| // the variance of residues. Then use the features to determine whether we want |
| // to go straight to splitting without trying PARTITION_NONE |
| void av1_simple_motion_search_based_split( |
| AV1_COMP *const cpi, MACROBLOCK *x, int mi_row, int mi_col, |
| BLOCK_SIZE bsize, int *partition_none_allowed, int *partition_horz_allowed, |
| int *partition_vert_allowed, int *do_rectangular_split); |
| |
| // A simplified version of set_offsets meant to be used for |
| // simple_motion_search. |
| static INLINE void set_offsets_for_motion_search(const AV1_COMP *const cpi, |
| MACROBLOCK *const x, |
| int mi_row, int mi_col, |
| BLOCK_SIZE bsize) { |
| const AV1_COMMON *const cm = &cpi->common; |
| const int num_planes = av1_num_planes(cm); |
| MACROBLOCKD *const xd = &x->e_mbd; |
| const int mi_width = mi_size_wide[bsize]; |
| const int mi_height = mi_size_high[bsize]; |
| |
| set_mode_info_offsets(cpi, x, xd, mi_row, mi_col); |
| |
| // Set up destination pointers. |
| av1_setup_dst_planes(xd->plane, bsize, &cm->cur_frame->buf, mi_row, mi_col, 0, |
| num_planes); |
| |
| // Set up limit values for MV components. |
| // Mv beyond the range do not produce new/different prediction block. |
| x->mv_limits.row_min = |
| -(((mi_row + mi_height) * MI_SIZE) + AOM_INTERP_EXTEND); |
| x->mv_limits.col_min = -(((mi_col + mi_width) * MI_SIZE) + AOM_INTERP_EXTEND); |
| x->mv_limits.row_max = (cm->mi_rows - mi_row) * MI_SIZE + AOM_INTERP_EXTEND; |
| x->mv_limits.col_max = (cm->mi_cols - mi_col) * MI_SIZE + AOM_INTERP_EXTEND; |
| |
| set_plane_n4(xd, mi_width, mi_height, num_planes); |
| |
| // Set up distance of MB to edge of frame in 1/8th pel units. |
| assert(!(mi_col & (mi_width - 1)) && !(mi_row & (mi_height - 1))); |
| xd->mb_to_top_edge = -((mi_row * MI_SIZE) * 8); |
| xd->mb_to_bottom_edge = ((cm->mi_rows - mi_height - mi_row) * MI_SIZE) * 8; |
| xd->mb_to_left_edge = -((mi_col * MI_SIZE) * 8); |
| xd->mb_to_right_edge = ((cm->mi_cols - mi_width - mi_col) * MI_SIZE) * 8; |
| |
| // Set up source buffers. |
| av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes, bsize); |
| |
| // R/D setup. |
| x->rdmult = cpi->rd.RDMULT; |
| } |
| #endif // AOM_AV1_ENCODER_PARTITION_STRATEGY_H_ |