diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/aom/av1/encoder/mcomp_structs.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/third_party/aom/av1/encoder/mcomp_structs.h b/third_party/aom/av1/encoder/mcomp_structs.h new file mode 100644 index 0000000000..06660cf4a6 --- /dev/null +++ b/third_party/aom/av1/encoder/mcomp_structs.h @@ -0,0 +1,109 @@ +/* + * 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_ |