From 02375bf7e53306d6ee3c5c6503104499b3f76c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arttu=20Yl=C3=A4-Outinen?= Date: Mon, 31 Aug 2015 10:41:35 +0300 Subject: [PATCH] Make kvz_inter_get_mv_cand work with SMP blocks. Replaces the depth parameter of kvz_inter_get_mv_cand with parameters width and height. --- src/inter.c | 51 ++++++++++++++++++++++++++++++++-------------- src/inter.h | 6 ++---- src/search_inter.c | 4 ++-- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/inter.c b/src/inter.c index e9c2d62f..b62799e1 100644 --- a/src/inter.c +++ b/src/inter.c @@ -409,17 +409,29 @@ static void inter_clear_cu_unused(cu_info_t* cu) { * \param encoder encoder control struct to use * \param x_cu block x position in SCU * \param y_cu block y position in SCU - * \param depth current block depth + * \param width current block width + * \param height current block height * \param b0 candidate b0 * \param b1 candidate b1 * \param b2 candidate b2 * \param a0 candidate a0 * \param a1 candidate a1 */ -void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int8_t depth, cu_info_t **b0, cu_info_t **b1, - cu_info_t **b2,cu_info_t **a0,cu_info_t **a1, lcu_t *lcu) +void kvz_inter_get_spatial_merge_candidates(int32_t x, + int32_t y, + int32_t width, + int32_t height, + cu_info_t **b0, + cu_info_t **b1, + cu_info_t **b2, + cu_info_t **a0, + cu_info_t **a1, + lcu_t *lcu) { - uint8_t cur_block_in_scu = (LCU_WIDTH>>depth) / CU_MIN_SIZE_PIXELS; //!< the width of the current block on SCU + // the width and height of the current block on SCU + uint8_t width_in_scu = width / CU_MIN_SIZE_PIXELS; + uint8_t height_in_scu = height / CU_MIN_SIZE_PIXELS; + /* Predictor block locations ____ _______ @@ -434,12 +446,12 @@ void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int8_t depth, int32_t y_cu = SUB_SCU(y) >> MAX_DEPTH; // A0 and A1 availability testing if (x != 0) { - *a1 = LCU_GET_CU(lcu, x_cu - 1, y_cu + cur_block_in_scu - 1); + *a1 = LCU_GET_CU(lcu, x_cu - 1, y_cu + height_in_scu - 1); if (!(*a1)->coded) *a1 = NULL; if(*a1) inter_clear_cu_unused(*a1); - if (y_cu + cur_block_in_scu < LCU_WIDTH>>3) { - *a0 = LCU_GET_CU(lcu, x_cu - 1, y_cu + cur_block_in_scu); + if (y_cu + height_in_scu < LCU_WIDTH>>3) { + *a0 = LCU_GET_CU(lcu, x_cu - 1, y_cu + height_in_scu); if (!(*a0)->coded) *a0 = NULL; } if(*a0) inter_clear_cu_unused(*a0); @@ -447,8 +459,8 @@ void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int8_t depth, // B0, B1 and B2 availability testing if (y != 0) { - if (x_cu + cur_block_in_scu < LCU_WIDTH>>3) { - *b0 = LCU_GET_CU(lcu, x_cu + cur_block_in_scu, y_cu - 1); + if (x_cu + width_in_scu < LCU_WIDTH>>3) { + *b0 = LCU_GET_CU(lcu, x_cu + width_in_scu, y_cu - 1); if (!(*b0)->coded) *b0 = NULL; } else if(y_cu == 0) { // Special case, top-right CU @@ -457,7 +469,7 @@ void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int8_t depth, } if(*b0) inter_clear_cu_unused(*b0); - *b1 = LCU_GET_CU(lcu, x_cu + cur_block_in_scu - 1, y_cu - 1); + *b1 = LCU_GET_CU(lcu, x_cu + width_in_scu - 1, y_cu - 1); if (!(*b1)->coded) *b1 = NULL; if(*b1) inter_clear_cu_unused(*b1); @@ -474,10 +486,19 @@ void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int8_t depth, * \param encoder encoder control struct to use * \param x_cu block x position in SCU * \param y_cu block y position in SCU - * \param depth current block depth - * \param mv_pred[2][2] 2x motion vector prediction + * \param width current block width + * \param height current block height + * \param mv_cand[2][2] return the motion vector candidates */ -void kvz_inter_get_mv_cand(const encoder_state_t * const state, int32_t x, int32_t y, int8_t depth, int16_t mv_cand[2][2], cu_info_t* cur_cu, lcu_t *lcu, int8_t reflist) +void kvz_inter_get_mv_cand(const encoder_state_t * const state, + int32_t x, + int32_t y, + int32_t width, + int32_t height, + int16_t mv_cand[2][2], + cu_info_t* cur_cu, + lcu_t *lcu, + int8_t reflist) { uint8_t candidates = 0; uint8_t b_candidates = 0; @@ -485,7 +506,7 @@ void kvz_inter_get_mv_cand(const encoder_state_t * const state, int32_t x, int32 cu_info_t *b0, *b1, *b2, *a0, *a1; b0 = b1 = b2 = a0 = a1 = NULL; - kvz_inter_get_spatial_merge_candidates(x, y, depth, &b0, &b1, &b2, &a0, &a1, lcu); + kvz_inter_get_spatial_merge_candidates(x, y, width, height, &b0, &b1, &b2, &a0, &a1, lcu); #define CALCULATE_SCALE(cu,tb,td) ((tb * ((0x4000 + (abs(td)>>1))/td) + 32) >> 6) #define APPLY_MV_SCALING(cu, cand, list) {int td = state->global->poc - state->global->ref->pocs[(cu)->inter.mv_ref[list]];\ @@ -666,7 +687,7 @@ uint8_t kvz_inter_get_merge_cand(const encoder_state_t * const state, int32_t x, cu_info_t *b0, *b1, *b2, *a0, *a1; int8_t zero_idx = 0; b0 = b1 = b2 = a0 = a1 = NULL; - kvz_inter_get_spatial_merge_candidates(x, y, depth, &b0, &b1, &b2, &a0, &a1, lcu); + kvz_inter_get_spatial_merge_candidates(x, y, LCU_WIDTH >> depth, LCU_WIDTH >> depth, &b0, &b1, &b2, &a0, &a1, lcu); #define CHECK_DUPLICATE(CU1,CU2) {duplicate = 0; if ((CU2) && (CU2)->type == CU_INTER && \ diff --git a/src/inter.h b/src/inter.h index e49ae61f..ec5f271d 100644 --- a/src/inter.h +++ b/src/inter.h @@ -42,9 +42,7 @@ typedef struct { //void kvz_inter_set_block(image* im,uint32_t x_cu, uint32_t y_cu, uint8_t depth, cu_info *cur_cu); void kvz_inter_recon_lcu(const encoder_state_t * const state, const kvz_picture * ref, int32_t xpos, int32_t ypos, int32_t width, const int16_t mv_param[2], lcu_t* lcu, hi_prec_buf_t *hi_prec_out); void kvz_inter_recon_lcu_bipred(const encoder_state_t * const state, const kvz_picture * ref1, const kvz_picture * ref2, int32_t xpos, int32_t ypos, int32_t width, int16_t mv_param[2][2], lcu_t* lcu); - -void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int8_t depth, cu_info_t **b0, cu_info_t **b1, - cu_info_t **b2, cu_info_t **a0, cu_info_t **a1, lcu_t *lcu); -void kvz_inter_get_mv_cand(const encoder_state_t *state, int32_t x, int32_t y, int8_t depth, int16_t mv_cand[2][2], cu_info_t* cur_cu, lcu_t *lcu, int8_t reflist); +void kvz_inter_get_spatial_merge_candidates(int32_t x, int32_t y, int32_t width, int32_t height, cu_info_t **b0, cu_info_t **b1, cu_info_t **b2, cu_info_t **a0, cu_info_t **a1, lcu_t *lcu); +void kvz_inter_get_mv_cand(const encoder_state_t *state, int32_t x, int32_t y, int32_t width, int32_t height, int16_t mv_cand[2][2], cu_info_t* cur_cu, lcu_t *lcu, int8_t reflist); uint8_t kvz_inter_get_merge_cand(const encoder_state_t *state, int32_t x, int32_t y, int8_t depth, inter_merge_cand_t mv_cand[MRG_MAX_NUM_CANDS], lcu_t *lcu); #endif diff --git a/src/search_inter.c b/src/search_inter.c index 596e91dd..989eca7d 100644 --- a/src/search_inter.c +++ b/src/search_inter.c @@ -995,7 +995,7 @@ static void search_cu_inter_ref(const encoder_state_t * const state, orig.y = y_cu * CU_MIN_SIZE_PIXELS; // Get MV candidates cur_cu->inter.mv_ref[ref_list] = ref_idx; - kvz_inter_get_mv_cand(state, x, y, depth, mv_cand, cur_cu, lcu, ref_list); + kvz_inter_get_mv_cand(state, x, y, LCU_WIDTH >> depth, LCU_WIDTH >> depth, mv_cand, cur_cu, lcu, ref_list); cur_cu->inter.mv_ref[ref_list] = temp_ref_idx; @@ -1244,7 +1244,7 @@ int kvz_search_cu_inter(const encoder_state_t * const state, int x, int y, int d // Each motion vector has its own candidate for (int reflist = 0; reflist < 2; reflist++) { cu_mv_cand = 0; - kvz_inter_get_mv_cand(state, x, y, depth, mv_cand, cur_cu, lcu, reflist); + kvz_inter_get_mv_cand(state, x, y, LCU_WIDTH >> depth, LCU_WIDTH >> depth, mv_cand, cur_cu, lcu, reflist); if ((mv_cand[0][0] != mv_cand[1][0] || mv_cand[0][1] != mv_cand[1][1])) { vector2d_t mvd_temp1, mvd_temp2; int cand1_cost, cand2_cost;