mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
[fme] Change fracmv_within_tile() to use internal MV resolution
This commit is contained in:
parent
ad8bad3f94
commit
d183c78fad
|
@ -94,9 +94,11 @@ typedef struct {
|
||||||
static INLINE bool fracmv_within_tile(const inter_search_info_t *info, int x, int y)
|
static INLINE bool fracmv_within_tile(const inter_search_info_t *info, int x, int y)
|
||||||
{
|
{
|
||||||
const encoder_control_t *ctrl = info->state->encoder_control;
|
const encoder_control_t *ctrl = info->state->encoder_control;
|
||||||
|
const int frac_mask = (1 << INTERNAL_MV_PREC) - 1;
|
||||||
|
const int frac_mask_c = (1 << (INTERNAL_MV_PREC + 1)) - 1;
|
||||||
|
|
||||||
const bool is_frac_luma = x % 4 != 0 || y % 4 != 0;
|
const bool is_frac_luma = (x & frac_mask) != 0 || (y & frac_mask) != 0;
|
||||||
const bool is_frac_chroma = x % 8 != 0 || y % 8 != 0;
|
const bool is_frac_chroma = (x & frac_mask_c) != 0 || (y & frac_mask_c) != 0;
|
||||||
|
|
||||||
if (ctrl->cfg.owf && ctrl->cfg.wpp) {
|
if (ctrl->cfg.owf && ctrl->cfg.wpp) {
|
||||||
// Check that the block does not reference pixels that are not final.
|
// Check that the block does not reference pixels that are not final.
|
||||||
|
@ -131,8 +133,8 @@ static INLINE bool fracmv_within_tile(const inter_search_info_t *info, int x, in
|
||||||
// bottom-left corner of the referenced block and the LCU containing
|
// bottom-left corner of the referenced block and the LCU containing
|
||||||
// this block.
|
// this block.
|
||||||
const vector2d_t mv_lcu = {
|
const vector2d_t mv_lcu = {
|
||||||
((info->origin.x + info->width + margin) * 4 + x) / (LCU_WIDTH << 2) - orig_lcu.x,
|
((info->origin.x + info->width + margin) * (1 << INTERNAL_MV_PREC) + x) / (LCU_WIDTH << INTERNAL_MV_PREC) - orig_lcu.x,
|
||||||
((info->origin.y + info->height + margin) * 4 + y) / (LCU_WIDTH << 2) - orig_lcu.y,
|
((info->origin.y + info->height + margin) * (1 << INTERNAL_MV_PREC) + y) / (LCU_WIDTH << INTERNAL_MV_PREC) - orig_lcu.y,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (mv_lcu.y > ctrl->max_inter_ref_lcu.down) {
|
if (mv_lcu.y > ctrl->max_inter_ref_lcu.down) {
|
||||||
|
@ -184,7 +186,7 @@ static INLINE bool fracmv_within_tile(const inter_search_info_t *info, int x, in
|
||||||
*/
|
*/
|
||||||
static INLINE bool intmv_within_tile(const inter_search_info_t *info, int x, int y)
|
static INLINE bool intmv_within_tile(const inter_search_info_t *info, int x, int y)
|
||||||
{
|
{
|
||||||
return fracmv_within_tile(info, x * 4, y * 4);
|
return fracmv_within_tile(info, x * (1 << INTERNAL_MV_PREC), y * (1 << INTERNAL_MV_PREC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1077,7 +1079,7 @@ static void search_frac(inter_search_info_t *info)
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (int step = 0; step < fme_level; ++step){
|
for (int step = 0; step < fme_level; ++step){
|
||||||
|
|
||||||
const int mv_shift = (step < 2) ? 1 : 0;
|
const int mv_shift = (step < 2) ? (INTERNAL_MV_PREC - 1) : (INTERNAL_MV_PREC - 2);
|
||||||
|
|
||||||
filter_steps[step](state->encoder_control,
|
filter_steps[step](state->encoder_control,
|
||||||
ext_origin,
|
ext_origin,
|
||||||
|
@ -1415,7 +1417,7 @@ static void search_pu_inter_ref(inter_search_info_t *info,
|
||||||
|
|
||||||
// Update best unipreds for biprediction
|
// Update best unipreds for biprediction
|
||||||
if (info->best_cost < best_LX_cost[ref_list]) {
|
if (info->best_cost < best_LX_cost[ref_list]) {
|
||||||
bool valid_mv = fracmv_within_tile(info, mv.x >> (INTERNAL_MV_PREC - 2), mv.y >> (INTERNAL_MV_PREC - 2));
|
bool valid_mv = fracmv_within_tile(info, mv.x, mv.y);
|
||||||
if (valid_mv) {
|
if (valid_mv) {
|
||||||
// Map reference index to L0/L1 pictures
|
// Map reference index to L0/L1 pictures
|
||||||
unipred_LX[ref_list].inter.mv_dir = ref_list + 1;
|
unipred_LX[ref_list].inter.mv_dir = ref_list + 1;
|
||||||
|
@ -1704,8 +1706,8 @@ static void search_pu_inter(encoder_state_t * const state,
|
||||||
|
|
||||||
// Don't try merge candidates that don't satisfy mv constraints.
|
// Don't try merge candidates that don't satisfy mv constraints.
|
||||||
// Don't add duplicates to list
|
// Don't add duplicates to list
|
||||||
if (!fracmv_within_tile(&info, cur_cu->inter.mv[0][0] >> (INTERNAL_MV_PREC - 2), cur_cu->inter.mv[0][1] >> (INTERNAL_MV_PREC - 2)) ||
|
if (!fracmv_within_tile(&info, cur_cu->inter.mv[0][0], cur_cu->inter.mv[0][1]) ||
|
||||||
!fracmv_within_tile(&info, cur_cu->inter.mv[1][0] >> (INTERNAL_MV_PREC - 2), cur_cu->inter.mv[1][1] >> (INTERNAL_MV_PREC - 2)) ||
|
!fracmv_within_tile(&info, cur_cu->inter.mv[1][0], cur_cu->inter.mv[1][1]) ||
|
||||||
is_duplicate)
|
is_duplicate)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
@ -1919,7 +1921,7 @@ static void search_pu_inter(encoder_state_t * const state,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*inter_cost < INT_MAX && cur_cu->inter.mv_dir == 1) {
|
if (*inter_cost < INT_MAX && cur_cu->inter.mv_dir == 1) {
|
||||||
assert(fracmv_within_tile(&info, cur_cu->inter.mv[0][0] >> (INTERNAL_MV_PREC - 2), cur_cu->inter.mv[0][1] >> (INTERNAL_MV_PREC - 2)));
|
assert(fracmv_within_tile(&info, cur_cu->inter.mv[0][0], cur_cu->inter.mv[0][1]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue