| /* | |
| * Copyright (c) 2022, 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_MCOMP_STRUCTS_H_ | |
| #define AOM_AV1_ENCODER_MCOMP_STRUCTS_H_ | |
| #include "av1/common/mv.h" | |
| // The maximum number of steps in a step search given the largest | |
| // allowed initial step | |
| #define MAX_MVSEARCH_STEPS 11 | |
| // Max full pel mv specified in the unit of full pixel | |
| // Enable the use of motion vector in range [-1023, 1023]. | |
| #define MAX_FULL_PEL_VAL ((1 << (MAX_MVSEARCH_STEPS - 1)) - 1) | |
| // Maximum size of the first step in full pel units | |
| #define MAX_FIRST_STEP (1 << (MAX_MVSEARCH_STEPS - 1)) | |
| // Maximum number of neighbors to scan per iteration during | |
| // WARPED_CAUSAL refinement | |
| // Note: The elements of warp_search_config.neighbor_mask must be at least | |
| // MAX_WARP_SEARCH_NEIGHBORS many bits wide. So the type may need to be | |
| // widened if this value is increased. | |
| #define MAX_WARP_SEARCH_NEIGHBORS 8 | |
| #define SEARCH_RANGE_8P 3 | |
| #define SEARCH_GRID_STRIDE_8P (2 * SEARCH_RANGE_8P + 1) | |
| #define SEARCH_GRID_CENTER_8P \ | |
| (SEARCH_RANGE_8P * SEARCH_GRID_STRIDE_8P + SEARCH_RANGE_8P) | |
| typedef struct { | |
| FULLPEL_MV coord; | |
| int coord_offset; | |
| } search_neighbors; | |
| // motion search site | |
| typedef struct search_site { | |
| FULLPEL_MV mv; | |
| int offset; | |
| } search_site; | |
| typedef struct search_site_config { | |
| search_site site[MAX_MVSEARCH_STEPS * 2][16 + 1]; | |
| // Number of search steps. | |
| int num_search_steps; | |
| int searches_per_step[MAX_MVSEARCH_STEPS * 2]; | |
| int radius[MAX_MVSEARCH_STEPS * 2]; | |
| int stride; | |
| } search_site_config; | |
| enum { | |
| // Search 8-points in the radius grid around center, up to 11 search stages. | |
| DIAMOND = 0, | |
| // Search 12-points in the radius/tan_radius grid around center, | |
| // up to 15 search stages. | |
| NSTEP = 1, | |
| // Search 8-points in the radius grid around center, up to 16 search stages. | |
| NSTEP_8PT = 2, | |
| // Search 8-points in the radius grid around center, upto 11 search stages | |
| // with clamping of search radius. | |
| CLAMPED_DIAMOND = 3, | |
| // Search maximum 8-points in the radius grid around center, | |
| // up to 11 search stages. First stage consists of 8 search points | |
| // and the rest with 6 search points each in hex shape. | |
| HEX = 4, | |
| // Search maximum 8-points in the radius grid around center, | |
| // up to 11 search stages. First stage consists of 4 search | |
| // points and the rest with 8 search points each. | |
| BIGDIA = 5, | |
| // Search 8-points in the square grid around center, up to 11 search stages. | |
| SQUARE = 6, | |
| // HEX search with up to 2 stages. | |
| FAST_HEX = 7, | |
| // BIGDIA search with up to 2 stages. | |
| FAST_DIAMOND = 8, | |
| // BIGDIA search with up to 3 stages. | |
| FAST_BIGDIA = 9, | |
| // BIGDIA search with up to 1 stage. | |
| VFAST_DIAMOND = 10, | |
| // Total number of search methods. | |
| NUM_SEARCH_METHODS, | |
| // Number of distinct search methods. | |
| NUM_DISTINCT_SEARCH_METHODS = SQUARE + 1, | |
| } UENUM1BYTE(SEARCH_METHODS); | |
| typedef struct warp_search_config { | |
| int num_neighbors; | |
| MV neighbors[MAX_WARP_SEARCH_NEIGHBORS]; | |
| // Bitmask which is used to prune the search neighbors at one iteration | |
| // based on which direction we chose in the previous iteration. | |
| // See comments in av1_refine_warped_mv for details. | |
| uint8_t neighbor_mask[MAX_WARP_SEARCH_NEIGHBORS]; | |
| } warp_search_config; | |
| // Methods for refining WARPED_CAUSAL motion vectors | |
| enum { | |
| // Search 4 adjacent points in a diamond shape at each iteration | |
| WARP_SEARCH_DIAMOND, | |
| // Search 8 adjacent points in a square at each iteration | |
| WARP_SEARCH_SQUARE, | |
| WARP_SEARCH_METHODS | |
| } UENUM1BYTE(WARP_SEARCH_METHOD); | |
| #endif // AOM_AV1_ENCODER_MCOMP_STRUCTS_H_ |