diff options
Diffstat (limited to 'third_party/aom/av1/common/mv.h')
-rw-r--r-- | third_party/aom/av1/common/mv.h | 110 |
1 files changed, 24 insertions, 86 deletions
diff --git a/third_party/aom/av1/common/mv.h b/third_party/aom/av1/common/mv.h index 65f0f7eda..a6227f18f 100644 --- a/third_party/aom/av1/common/mv.h +++ b/third_party/aom/av1/common/mv.h @@ -27,6 +27,8 @@ typedef struct mv { int16_t col; } MV; +static const MV kZeroMv = { 0, 0 }; + typedef union int_mv { uint32_t as_int; MV as_mv; @@ -37,11 +39,6 @@ typedef struct mv32 { int32_t col; } MV32; -#if CONFIG_WARPED_MOTION -#define WARPED_MOTION_SORT_SAMPLES 1 -#endif // CONFIG_WARPED_MOTION - -#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION // Bits of precision used for the model #define WARPEDMODEL_PREC_BITS 16 #define WARPEDMODEL_ROW3HOMO_PREC_BITS 16 @@ -54,19 +51,8 @@ typedef struct mv32 { #define WARPEDPIXEL_PREC_BITS 6 #define WARPEDPIXEL_PREC_SHIFTS (1 << WARPEDPIXEL_PREC_BITS) -// Taps for ntap filter -#define WARPEDPIXEL_FILTER_TAPS 6 - -// Precision of filter taps -#define WARPEDPIXEL_FILTER_BITS 7 - #define WARP_PARAM_REDUCE_BITS 6 -// Precision bits reduction after horizontal shear -#define HORSHEAR_REDUCE_PREC_BITS 5 -#define VERSHEAR_REDUCE_PREC_BITS \ - (2 * WARPEDPIXEL_FILTER_BITS - HORSHEAR_REDUCE_PREC_BITS) - #define WARPEDDIFF_PREC_BITS (WARPEDMODEL_PREC_BITS - WARPEDPIXEL_PREC_BITS) /* clang-format off */ @@ -75,10 +61,7 @@ typedef enum { TRANSLATION = 1, // translational motion 2-parameter ROTZOOM = 2, // simplified affine with rotation + zoom only, 4-parameter AFFINE = 3, // affine, 6-parameter - HORTRAPEZOID = 4, // constrained homography, hor trapezoid, 6-parameter - VERTRAPEZOID = 5, // constrained homography, ver trapezoid, 6-parameter - HOMOGRAPHY = 6, // homography, 8-parameter - TRANS_TYPES = 7, + TRANS_TYPES, } TransformationType; /* clang-format on */ @@ -90,24 +73,13 @@ typedef enum { // GLOBAL_TRANS_TYPES 7 - up to full homography #define GLOBAL_TRANS_TYPES 4 -#if GLOBAL_TRANS_TYPES > 4 -// First bit indicates whether using identity or not -// GLOBAL_TYPE_BITS=ceiling(log2(GLOBAL_TRANS_TYPES-1)) is the -// number of bits needed to cover the remaining possibilities -#define GLOBAL_TYPE_BITS (get_msb(2 * GLOBAL_TRANS_TYPES - 3)) -#endif // GLOBAL_TRANS_TYPES > 4 - typedef struct { -#if CONFIG_GLOBAL_MOTION int global_warp_allowed; -#endif // CONFIG_GLOBAL_MOTION -#if CONFIG_WARPED_MOTION int local_warp_allowed; -#endif // CONFIG_WARPED_MOTION } WarpTypesAllowed; // number of parameters used by each transformation in TransformationTypes -static const int trans_model_params[TRANS_TYPES] = { 0, 2, 4, 6, 6, 6, 8 }; +static const int trans_model_params[TRANS_TYPES] = { 0, 2, 4, 6 }; // The order of values in the wmmat matrix below is best described // by the homography: @@ -118,6 +90,7 @@ typedef struct { TransformationType wmtype; int32_t wmmat[8]; int16_t alpha, beta, gamma, delta; + int8_t invalid; } WarpedMotionParams; /* clang-format off */ @@ -125,12 +98,11 @@ static const WarpedMotionParams default_warp_params = { IDENTITY, { 0, 0, (1 << WARPEDMODEL_PREC_BITS), 0, 0, (1 << WARPEDMODEL_PREC_BITS), 0, 0 }, - 0, 0, 0, 0 + 0, 0, 0, 0, + 0, }; /* clang-format on */ -#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION -#if CONFIG_GLOBAL_MOTION // The following constants describe the various precisions // of different parameters in the global motion experiment. // @@ -187,9 +159,6 @@ static const WarpedMotionParams default_warp_params = { #define GM_ALPHA_MIN -GM_ALPHA_MAX #define GM_ROW3HOMO_MIN -GM_ROW3HOMO_MAX -// Use global motion parameters for sub8x8 blocks -#define GLOBAL_SUB8X8_USED 0 - static INLINE int block_center_x(int mi_col, BLOCK_SIZE bs) { const int bw = block_size_wide[bs]; return mi_col * MI_SIZE + bw / 2 - 1; @@ -206,7 +175,6 @@ static INLINE int convert_to_trans_prec(int allow_hp, int coor) { else return ROUND_POWER_OF_TWO_SIGNED(coor, WARPEDMODEL_PREC_BITS - 2) * 2; } -#if CONFIG_AMVR static INLINE void integer_mv_precision(MV *mv) { int mod = (mv->row % 8); if (mod != 0) { @@ -232,7 +200,6 @@ static INLINE void integer_mv_precision(MV *mv) { } } } -#endif // Convert a global motion vector into a motion vector at the centre of the // given block. // @@ -242,14 +209,15 @@ static INLINE void integer_mv_precision(MV *mv) { // represents an integer) static INLINE int_mv gm_get_motion_vector(const WarpedMotionParams *gm, int allow_hp, BLOCK_SIZE bsize, - int mi_col, int mi_row, int block_idx -#if CONFIG_AMVR - , - int is_integer -#endif - ) { - const int unify_bsize = CONFIG_CB4X4; + int mi_col, int mi_row, + int is_integer) { int_mv res; + + if (gm->wmtype == IDENTITY) { + res.as_int = 0; + return res; + } + const int32_t *mat = gm->wmmat; int x, y, tx, ty; @@ -265,65 +233,37 @@ static INLINE int_mv gm_get_motion_vector(const WarpedMotionParams *gm, res.as_mv.row = gm->wmmat[0] >> GM_TRANS_ONLY_PREC_DIFF; res.as_mv.col = gm->wmmat[1] >> GM_TRANS_ONLY_PREC_DIFF; assert(IMPLIES(1 & (res.as_mv.row | res.as_mv.col), allow_hp)); -#if CONFIG_AMVR if (is_integer) { integer_mv_precision(&res.as_mv); } -#endif return res; } - if (bsize >= BLOCK_8X8 || unify_bsize) { - x = block_center_x(mi_col, bsize); - y = block_center_y(mi_row, bsize); - } else { - x = block_center_x(mi_col, bsize); - y = block_center_y(mi_row, bsize); - x += (block_idx & 1) * MI_SIZE / 2; - y += (block_idx & 2) * MI_SIZE / 4; - } + x = block_center_x(mi_col, bsize); + y = block_center_y(mi_row, bsize); if (gm->wmtype == ROTZOOM) { assert(gm->wmmat[5] == gm->wmmat[2]); assert(gm->wmmat[4] == -gm->wmmat[3]); } - if (gm->wmtype > AFFINE) { - int xc = (int)((int64_t)mat[2] * x + (int64_t)mat[3] * y + mat[0]); - int yc = (int)((int64_t)mat[4] * x + (int64_t)mat[5] * y + mat[1]); - const int Z = (int)((int64_t)mat[6] * x + (int64_t)mat[7] * y + - (1 << WARPEDMODEL_ROW3HOMO_PREC_BITS)); - xc *= 1 << (WARPEDMODEL_ROW3HOMO_PREC_BITS - WARPEDMODEL_PREC_BITS); - yc *= 1 << (WARPEDMODEL_ROW3HOMO_PREC_BITS - WARPEDMODEL_PREC_BITS); - xc = (int)(xc > 0 ? ((int64_t)xc + Z / 2) / Z : ((int64_t)xc - Z / 2) / Z); - yc = (int)(yc > 0 ? ((int64_t)yc + Z / 2) / Z : ((int64_t)yc - Z / 2) / Z); - tx = convert_to_trans_prec(allow_hp, xc) - (x << 3); - ty = convert_to_trans_prec(allow_hp, yc) - (y << 3); - } else { - const int xc = - (mat[2] - (1 << WARPEDMODEL_PREC_BITS)) * x + mat[3] * y + mat[0]; - const int yc = - mat[4] * x + (mat[5] - (1 << WARPEDMODEL_PREC_BITS)) * y + mat[1]; - tx = convert_to_trans_prec(allow_hp, xc); - ty = convert_to_trans_prec(allow_hp, yc); - } + + const int xc = + (mat[2] - (1 << WARPEDMODEL_PREC_BITS)) * x + mat[3] * y + mat[0]; + const int yc = + mat[4] * x + (mat[5] - (1 << WARPEDMODEL_PREC_BITS)) * y + mat[1]; + tx = convert_to_trans_prec(allow_hp, xc); + ty = convert_to_trans_prec(allow_hp, yc); res.as_mv.row = ty; res.as_mv.col = tx; -#if CONFIG_AMVR if (is_integer) { integer_mv_precision(&res.as_mv); } -#endif return res; } static INLINE TransformationType get_gmtype(const WarpedMotionParams *gm) { - if (gm->wmmat[6] != 0 || gm->wmmat[7] != 0) { - if (!gm->wmmat[6] && !gm->wmmat[4]) return HORTRAPEZOID; - if (!gm->wmmat[7] && !gm->wmmat[3]) return VERTRAPEZOID; - return HOMOGRAPHY; - } if (gm->wmmat[5] == (1 << WARPEDMODEL_PREC_BITS) && !gm->wmmat[4] && gm->wmmat[2] == (1 << WARPEDMODEL_PREC_BITS) && !gm->wmmat[3]) { return ((!gm->wmmat[1] && !gm->wmmat[0]) ? IDENTITY : TRANSLATION); @@ -333,12 +273,10 @@ static INLINE TransformationType get_gmtype(const WarpedMotionParams *gm) { else return AFFINE; } -#endif // CONFIG_GLOBAL_MOTION typedef struct candidate_mv { int_mv this_mv; int_mv comp_mv; - uint8_t pred_diff[2]; int weight; } CANDIDATE_MV; |