Merge "Adjust gm parameter computation to avoid mismatch" into nextgenv2

This commit is contained in:
Sarah Parker
2016-08-03 21:42:30 +00:00
committed by Gerrit Code Review
4 changed files with 45 additions and 27 deletions

View File

@@ -50,26 +50,29 @@ typedef struct mv32 {
// //
// The ABS parameters are used to create an upper and lower bound // The ABS parameters are used to create an upper and lower bound
// for each parameter. In other words, after a parameter is integerized // for each parameter. In other words, after a parameter is integerized
// it is clamped between -(1 << ABS_XXX_BITS) and (1 << ABS_XXX_BITS) // it is clamped between -(1 << ABS_XXX_BITS) and (1 << ABS_XXX_BITS).
// //
// XXX_PREC_DIFF and XXX_DECODE_FACTOR are computed once here to // XXX_PREC_DIFF, XXX_ENCODE_FACTOR and XXX_DECODE_FACTOR
// prevent repetetive computation on the decoder side. These are // are computed once here to prevent repetitive
// computation on the decoder side. These are
// to allow the global motion parameters to be encoded in a lower // to allow the global motion parameters to be encoded in a lower
// precision than the warped model precision. This means that they // precision than the warped model precision. This means that they
// need to be changed to warped precision when they are decoded. // need to be changed to warped precision when they are decoded.
// //
// XX_MIN, XX_MAX are also computed to avoid repeated computation // XX_MIN, XX_MAX are also computed to avoid repeated computation
#define GM_TRANS_PREC_BITS 3 #define GM_TRANS_PREC_BITS 5
#define GM_TRANS_PREC_DIFF (WARPEDMODEL_PREC_BITS - GM_TRANS_PREC_BITS) #define GM_TRANS_PREC_DIFF (WARPEDMODEL_PREC_BITS - GM_TRANS_PREC_BITS)
#define GM_TRANS_DECODE_FACTOR (1 << GM_TRANS_PREC_DIFF) #define GM_TRANS_DECODE_FACTOR (1 << GM_TRANS_PREC_DIFF)
#define GM_TRANS_ENCODE_FACTOR (1 / (GM_TRANS_DECODE_FACTOR))
#define GM_ALPHA_PREC_BITS 5 #define GM_ALPHA_PREC_BITS 5
#define GM_ALPHA_PREC_DIFF (WARPEDMODEL_PREC_BITS - GM_ALPHA_PREC_BITS) #define GM_ALPHA_PREC_DIFF (WARPEDMODEL_PREC_BITS - GM_ALPHA_PREC_BITS)
#define GM_ALPHA_DECODE_FACTOR (1 << GM_ALPHA_PREC_DIFF) #define GM_ALPHA_DECODE_FACTOR (1 << GM_ALPHA_PREC_DIFF)
#define GM_ALPHA_ENCODE_FACTOR (1 / (GM_ALPHA_DECODE_FACTOR))
#define GM_ABS_ALPHA_BITS 5 #define GM_ABS_ALPHA_BITS 8
#define GM_ABS_TRANS_BITS 5 #define GM_ABS_TRANS_BITS 8
#define GM_TRANS_MAX (1 << GM_ABS_TRANS_BITS) #define GM_TRANS_MAX (1 << GM_ABS_TRANS_BITS)
#define GM_ALPHA_MAX (1 << GM_ABS_ALPHA_BITS) #define GM_ALPHA_MAX (1 << GM_ABS_ALPHA_BITS)

View File

@@ -3473,6 +3473,7 @@ static void read_global_motion_params(Global_Motion_Params *params,
params->motion_params.wmmat[5] = params->motion_params.wmmat[5] =
vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) * vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
GM_ALPHA_DECODE_FACTOR; GM_ALPHA_DECODE_FACTOR;
// fallthrough intended
case GLOBAL_ROTZOOM: case GLOBAL_ROTZOOM:
params->motion_params.wmmat[2] = params->motion_params.wmmat[2] =
(vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) * (vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
@@ -3480,6 +3481,7 @@ static void read_global_motion_params(Global_Motion_Params *params,
params->motion_params.wmmat[3] = params->motion_params.wmmat[3] =
vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) * vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
GM_ALPHA_DECODE_FACTOR; GM_ALPHA_DECODE_FACTOR;
// fallthrough intended
case GLOBAL_TRANSLATION: case GLOBAL_TRANSLATION:
params->motion_params.wmmat[0] = params->motion_params.wmmat[0] =
vp10_read_primitive_symmetric(r, GM_ABS_TRANS_BITS) * vp10_read_primitive_symmetric(r, GM_ABS_TRANS_BITS) *

View File

@@ -3200,19 +3200,29 @@ static void write_global_motion_params(Global_Motion_Params *params,
case GLOBAL_ZERO: case GLOBAL_ZERO:
break; break;
case GLOBAL_AFFINE: case GLOBAL_AFFINE:
vp10_write_primitive_symmetric(w, params->motion_params.wmmat[4], vp10_write_primitive_symmetric(w, (params->motion_params.wmmat[4] *
GM_ALPHA_ENCODE_FACTOR) -
(1 << GM_ALPHA_PREC_BITS),
GM_ABS_ALPHA_BITS); GM_ABS_ALPHA_BITS);
vp10_write_primitive_symmetric(w, params->motion_params.wmmat[5], vp10_write_primitive_symmetric(w, params->motion_params.wmmat[5] *
GM_ALPHA_ENCODE_FACTOR,
GM_ABS_ALPHA_BITS); GM_ABS_ALPHA_BITS);
// fallthrough intended
case GLOBAL_ROTZOOM: case GLOBAL_ROTZOOM:
vp10_write_primitive_symmetric(w, params->motion_params.wmmat[2], vp10_write_primitive_symmetric(w, (params->motion_params.wmmat[2] *
GM_ALPHA_ENCODE_FACTOR) -
(1 << GM_ALPHA_PREC_BITS),
GM_ABS_ALPHA_BITS); GM_ABS_ALPHA_BITS);
vp10_write_primitive_symmetric(w, params->motion_params.wmmat[3], vp10_write_primitive_symmetric(w, params->motion_params.wmmat[3] *
GM_ALPHA_ENCODE_FACTOR,
GM_ABS_ALPHA_BITS); GM_ABS_ALPHA_BITS);
// fallthrough intended
case GLOBAL_TRANSLATION: case GLOBAL_TRANSLATION:
vp10_write_primitive_symmetric(w, params->motion_params.wmmat[0], vp10_write_primitive_symmetric(w, params->motion_params.wmmat[0] *
GM_TRANS_ENCODE_FACTOR,
GM_ABS_TRANS_BITS); GM_ABS_TRANS_BITS);
vp10_write_primitive_symmetric(w, params->motion_params.wmmat[1], vp10_write_primitive_symmetric(w, params->motion_params.wmmat[1] *
GM_TRANS_ENCODE_FACTOR,
GM_ABS_TRANS_BITS); GM_ABS_TRANS_BITS);
break; break;
default: default:

View File

@@ -4549,18 +4549,20 @@ static void convert_to_params(double *H, TransformationType type,
(1 << GM_TRANS_PREC_BITS) + 0.5); (1 << GM_TRANS_PREC_BITS) + 0.5);
model->motion_params.wmmat[0] = model->motion_params.wmmat[0] =
clamp(model->motion_params.wmmat[0], clamp(model->motion_params.wmmat[0],
GM_TRANS_MIN, GM_TRANS_MAX); GM_TRANS_MIN, GM_TRANS_MAX) *
GM_TRANS_DECODE_FACTOR;
model->motion_params.wmmat[1] = model->motion_params.wmmat[1] =
clamp(model->motion_params.wmmat[1], clamp(model->motion_params.wmmat[1],
GM_TRANS_MIN, GM_TRANS_MAX); GM_TRANS_MIN, GM_TRANS_MAX) *
GM_TRANS_DECODE_FACTOR;
for (i = 2; i < n_params; ++i) { for (i = 2; i < n_params; ++i) {
model->motion_params.wmmat[i] = model->motion_params.wmmat[i] =
(int) floor(H[i] * (int) floor(H[i] *
(1 << GM_ALPHA_PREC_BITS) + 0.5) - (1 << GM_ALPHA_PREC_BITS) + 0.5);
(!(i & 1) * (1 << GM_ALPHA_PREC_BITS));
model->motion_params.wmmat[i] = clamp(model->motion_params.wmmat[i], model->motion_params.wmmat[i] = clamp(model->motion_params.wmmat[i],
GM_ALPHA_MIN, GM_ALPHA_MAX); GM_ALPHA_MIN, GM_ALPHA_MAX) *
GM_ALPHA_DECODE_FACTOR;
alpha_present |= (model->motion_params.wmmat[i] != 0); alpha_present |= (model->motion_params.wmmat[i] != 0);
} }
@@ -4579,6 +4581,7 @@ static void convert_model_to_params(double *H, TransformationType type,
if (type > HOMOGRAPHY) if (type > HOMOGRAPHY)
convert_to_params(H, type, model); convert_to_params(H, type, model);
model->gmtype = get_gmtype(model); model->gmtype = get_gmtype(model);
model->motion_params.wmtype = gm_to_trans_type(model->gmtype);
} }
#endif // CONFIG_GLOBAL_MOTION #endif // CONFIG_GLOBAL_MOTION
@@ -4610,7 +4613,7 @@ static void encode_frame_internal(VP10_COMP *cpi) {
int frame; int frame;
double H[9] = {0, 0, 0, 0, 0, 0, 0, 0, 1}; double H[9] = {0, 0, 0, 0, 0, 0, 0, 0, 1};
for (frame = LAST_FRAME; frame <= ALTREF_FRAME; ++frame) for (frame = LAST_FRAME; frame <= ALTREF_FRAME; ++frame)
convert_model_to_params(H, ROTZOOM, &cm->global_motion[frame]); convert_model_to_params(H, AFFINE, &cm->global_motion[frame]);
} }
#endif // CONFIG_GLOBAL_MOTION #endif // CONFIG_GLOBAL_MOTION