[ibc] Calculate hashes every 4 pixels and change the IBC costs a bit

This commit is contained in:
Marko Viitanen 2023-07-27 10:29:55 +03:00
parent 0fefd3f621
commit 20875a9819
2 changed files with 7 additions and 13 deletions

View file

@ -761,8 +761,8 @@ static void encoder_state_worker_encode_lcu_search(void * opaque)
const uint32_t ibc_block_height = MIN(LCU_WIDTH, (state->tile->frame->height-lcu->position_px.y)); const uint32_t ibc_block_height = MIN(LCU_WIDTH, (state->tile->frame->height-lcu->position_px.y));
int items = 0; int items = 0;
// Hash the current LCU to the IBC hashmap // Hash the current LCU to the IBC hashmap
for (int32_t xx = 0; xx < (int32_t)(ibc_block_width)-7; xx+=UVG_HASHMAP_BLOCKSIZE) { for (int32_t xx = 0; xx < (int32_t)(ibc_block_width)-7; xx+=UVG_HASHMAP_BLOCKSIZE>>1) {
for (int32_t yy = 0; yy < (int32_t)(ibc_block_height)-7; yy+=UVG_HASHMAP_BLOCKSIZE) { for (int32_t yy = 0; yy < (int32_t)(ibc_block_height)-7; yy+=UVG_HASHMAP_BLOCKSIZE>>1) {
int cur_x = lcu->position_px.x + xx; int cur_x = lcu->position_px.x + xx;
int cur_y = lcu->position_px.y + yy; int cur_y = lcu->position_px.y + yy;
@ -782,12 +782,6 @@ static void encoder_state_worker_encode_lcu_search(void * opaque)
if (xx % UVG_HASHMAP_BLOCKSIZE == 0 && yy % UVG_HASHMAP_BLOCKSIZE == 0) { if (xx % UVG_HASHMAP_BLOCKSIZE == 0 && yy % UVG_HASHMAP_BLOCKSIZE == 0) {
state->tile->frame->ibc_hashmap_pos_to_hash[(cur_y / UVG_HASHMAP_BLOCKSIZE)*state->tile->frame->ibc_hashmap_pos_to_hash_stride + cur_x / UVG_HASHMAP_BLOCKSIZE] = crc; state->tile->frame->ibc_hashmap_pos_to_hash[(cur_y / UVG_HASHMAP_BLOCKSIZE)*state->tile->frame->ibc_hashmap_pos_to_hash_stride + cur_x / UVG_HASHMAP_BLOCKSIZE] = crc;
} }
/*
if (state->encoder_control->chroma_format != UVG_CSP_400) {
crc ^= uvg_crc32c_4x4(&frame->rec->u[(cur_y>>1) * (frame->rec->stride>>1) + (cur_x>>1)],frame->rec->stride>>1);
crc ^= uvg_crc32c_4x4(&frame->rec->v[(cur_y>>1) * (frame->rec->stride>>1) + (cur_x>>1)],frame->rec->stride>>1);
}
*/
uvg_hashmap_insert(frame->ibc_hashmap_row[ctu_row], crc, ((cur_x&0xffff)<<16) | (cur_y&0xffff)); uvg_hashmap_insert(frame->ibc_hashmap_row[ctu_row], crc, ((cur_x&0xffff)<<16) | (cur_y&0xffff));
items++; items++;
} }

View file

@ -489,7 +489,7 @@ static double calc_ibc_mvd_cost(const encoder_state_t *state,
temp_bitcost += mvd_cost; temp_bitcost += mvd_cost;
} }
*bitcost = temp_bitcost; *bitcost = temp_bitcost;
return temp_bitcost * state->lambda_sqrt; return temp_bitcost * state->lambda;
} }
@ -1008,7 +1008,7 @@ static void search_pu_ibc(encoder_state_t * const state,
info->width, info->width,
(best_mv.x >> INTERNAL_MV_PREC), (best_mv.x >> INTERNAL_MV_PREC),
(best_mv.y >> INTERNAL_MV_PREC)); (best_mv.y >> INTERNAL_MV_PREC));
best_cost += best_bits * info->state->lambda_sqrt; best_cost += best_bits * info->state->lambda;
} }
@ -1069,7 +1069,7 @@ static void search_pu_ibc(encoder_state_t * const state,
if(amvp[0].size > 0) { if(amvp[0].size > 0) {
const uint8_t best_key = amvp[0].keys[0]; const uint8_t best_key = amvp[0].keys[0];
amvp[0].bits[best_key] += total_bits; amvp[0].bits[best_key] += total_bits;
amvp[0].cost[best_key] += (total_bits)* state->lambda_sqrt; amvp[0].cost[best_key] += (total_bits)* state->lambda;
} }
} }
} }
@ -1240,7 +1240,7 @@ static int uvg_search_hash_cu_ibc(encoder_state_t* const state,
if (!found_block) return; if (!found_block) return;
*inter_cost = 2; *inter_cost = ibc_cost;
*inter_bitcost = ibc_bitcost; *inter_bitcost = ibc_bitcost;
uint32_t merge_idx; uint32_t merge_idx;
@ -1268,7 +1268,7 @@ static int uvg_search_hash_cu_ibc(encoder_state_t* const state,
const int ibc_flag = CTX_ENTROPY_FBITS(&state->search_cabac.ctx.ibc_flag[0], 1); const int ibc_flag = CTX_ENTROPY_FBITS(&state->search_cabac.ctx.ibc_flag[0], 1);
ibc_cost += ibc_flag * state->lambda_sqrt; ibc_cost += ibc_flag * state->lambda;
ibc_bitcost += ibc_flag; ibc_bitcost += ibc_flag;
uvg_inter_recon_cu( uvg_inter_recon_cu(