Refactoring related to shear parameter computation

Shear parameters for global motion are now computed once
when the parameters are determined.

Change-Id: Idfd53410079a81a81ddd4728f173a0d0ec60230b
This commit is contained in:
Debargha Mukherjee 2017-03-30 08:22:00 -07:00
Родитель 5ddac0aac8
Коммит 3b6c54479b
5 изменённых файлов: 30 добавлений и 33 удалений

Просмотреть файл

@ -87,6 +87,7 @@ static const int trans_model_params[TRANS_TYPES] = { 0, 2, 4, 6, 6, 6, 8 };
typedef struct {
TransformationType wmtype;
int32_t wmmat[8];
int32_t alpha, beta, gamma, delta;
} WarpedMotionParams;
#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
@ -219,6 +220,7 @@ static INLINE void set_default_gmparams(WarpedMotionParams *wm) {
0, 0, (1 << WARPEDMODEL_PREC_BITS), 0, 0, (1 << WARPEDMODEL_PREC_BITS), 0, 0
};
memcpy(wm->wmmat, default_wm_mat, sizeof(wm->wmmat));
wm->alpha = wm->beta = wm->gamma = wm->delta = 0;
wm->wmtype = IDENTITY;
}
#endif // CONFIG_GLOBAL_MOTION

Просмотреть файл

@ -669,29 +669,24 @@ static int is_affine_shear_allowed(int32_t alpha, int32_t beta, int32_t gamma,
}
// Returns 1 on success or 0 on an invalid affine set
static int get_shear_params(WarpedMotionParams *wm, int32_t *alpha,
int32_t *beta, int32_t *gamma, int32_t *delta) {
int get_shear_params(WarpedMotionParams *wm) {
const int32_t *mat = wm->wmmat;
if (!is_affine_valid(wm)) return 0;
*alpha = mat[2] - (1 << WARPEDMODEL_PREC_BITS);
*beta = mat[3];
wm->alpha = mat[2] - (1 << WARPEDMODEL_PREC_BITS);
wm->beta = mat[3];
int16_t shift;
int16_t y = resolve_divisor_32(abs(mat[2]), &shift) * (mat[2] < 0 ? -1 : 1);
int64_t v;
v = ((int64_t)mat[4] << WARPEDMODEL_PREC_BITS) * y;
*gamma = ROUND_POWER_OF_TWO_SIGNED_64(v, shift);
wm->gamma = ROUND_POWER_OF_TWO_SIGNED_64(v, shift);
v = ((int64_t)mat[3] * mat[4]) * y;
*delta = mat[5] - ROUND_POWER_OF_TWO_SIGNED_64(v, shift) -
(1 << WARPEDMODEL_PREC_BITS);
if (!is_affine_shear_allowed(*alpha, *beta, *gamma, *delta)) return 0;
wm->delta = mat[5] - ROUND_POWER_OF_TWO_SIGNED_64(v, shift) -
(1 << WARPEDMODEL_PREC_BITS);
if (!is_affine_shear_allowed(wm->alpha, wm->beta, wm->gamma, wm->delta))
return 0;
return 1;
}
int is_shearable_params(WarpedMotionParams *wm) {
int32_t alpha, beta, gamma, delta;
return get_shear_params(wm, &alpha, &beta, &gamma, &delta);
}
#if CONFIG_AOM_HIGHBITDEPTH
static INLINE void highbd_get_subcolumn(int taps, uint16_t *ref, int32_t *col,
int stride, int x, int y_start) {
@ -867,14 +862,13 @@ static void highbd_warp_plane(WarpedMotionParams *wm, uint8_t *ref8, int width,
int32_t tmp[15 * 8];
int i, j, k, l, m;
int32_t *mat = wm->wmmat;
int32_t alpha, beta, gamma, delta;
uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
if (!get_shear_params(wm, &alpha, &beta, &gamma, &delta)) {
assert(0 && "Warped motion model is incompatible with shear warp filter");
return;
}
const int32_t alpha = wm->alpha;
const int32_t beta = wm->beta;
const int32_t gamma = wm->gamma;
const int32_t delta = wm->delta;
for (i = p_row; i < p_row + p_height; i += 8) {
for (j = p_col; j < p_col + p_width; j += 8) {
@ -1200,12 +1194,10 @@ static void warp_plane(WarpedMotionParams *wm, uint8_t *ref, int width,
if ((wm->wmtype == ROTZOOM || wm->wmtype == AFFINE) && x_scale == 16 &&
y_scale == 16) {
int32_t *mat = wm->wmmat;
int32_t alpha, beta, gamma, delta;
if (!get_shear_params(wm, &alpha, &beta, &gamma, &delta)) {
assert(0 && "Warped motion model is incompatible with shear warp filter");
return;
}
const int32_t alpha = wm->alpha;
const int32_t beta = wm->beta;
const int32_t gamma = wm->gamma;
const int32_t delta = wm->delta;
// printf("%d %d %d %d\n", mat[2], mat[3], mat[4], mat[5]);
av1_warp_affine(mat, ref, width, height, stride, pred, p_col, p_row,
@ -1253,6 +1245,8 @@ double av1_warp_erroradv(WarpedMotionParams *wm,
uint8_t *dst, int p_col, int p_row, int p_width,
int p_height, int p_stride, int subsampling_x,
int subsampling_y, int x_scale, int y_scale) {
if (wm->wmtype <= AFFINE)
if (!get_shear_params(wm)) return 1;
#if CONFIG_AOM_HIGHBITDEPTH
if (use_hbd)
return highbd_warp_erroradv(
@ -1557,8 +1551,7 @@ int find_projection(const int np, int *pts1, int *pts2, BLOCK_SIZE bsize,
}
if (wm_params->wmtype == AFFINE || wm_params->wmtype == ROTZOOM) {
// check compatibility with the fast warp filter
int32_t alpha, beta, gamma, delta;
if (!get_shear_params(wm_params, &alpha, &beta, &gamma, &delta)) return 1;
if (!get_shear_params(wm_params)) return 1;
}
}

Просмотреть файл

@ -90,5 +90,5 @@ int find_projection(const int np, int *pts1, int *pts2, BLOCK_SIZE bsize,
int mvy, int mvx, WarpedMotionParams *wm_params, int mi_row,
int mi_col);
int is_shearable_params(WarpedMotionParams *wm);
int get_shear_params(WarpedMotionParams *wm);
#endif // AV1_COMMON_WARPED_MOTION_H_

Просмотреть файл

@ -58,9 +58,9 @@
#include "av1/decoder/detokenize.h"
#include "av1/decoder/dsubexp.h"
#if CONFIG_WARPED_MOTION
#if CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION
#include "av1/common/warped_motion.h"
#endif // CONFIG_WARPED_MOTION
#endif // CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION
#define MAX_AV1_HEADER_SIZE 80
#define ACCT_STR __func__
@ -4479,6 +4479,8 @@ static void read_global_motion_params(WarpedMotionParams *params,
case IDENTITY: break;
default: assert(0);
}
if (params->wmtype <= AFFINE)
if (!get_shear_params(params)) assert(0);
}
static void read_global_motion(AV1_COMMON *cm, aom_reader *r) {

Просмотреть файл

@ -5156,10 +5156,6 @@ static void encode_frame_internal(AV1_COMP *cpi) {
}
}
}
if (cm->global_motion[frame].wmtype <= AFFINE)
if (!is_shearable_params(&cm->global_motion[frame]))
set_default_gmparams(&cm->global_motion[frame]);
// If the best error advantage found doesn't meet the threshold for
// this motion type, revert to IDENTITY.
if (best_erroradvantage >
@ -5167,6 +5163,10 @@ static void encode_frame_internal(AV1_COMP *cpi) {
set_default_gmparams(&cm->global_motion[frame]);
}
if (cm->global_motion[frame].wmtype <= AFFINE)
if (!get_shear_params(&cm->global_motion[frame]))
set_default_gmparams(&cm->global_motion[frame]);
if (cm->global_motion[frame].wmtype != IDENTITY) break;
}
aom_clear_system_state();