mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
Added top_coeff array to cu_info and implemented derivation logic
This commit is contained in:
parent
2efcc12678
commit
bcb900371f
|
@ -841,7 +841,6 @@ void encode_coding_tree(encoder_control *encoder, uint16_t x_ctb,
|
||||||
if (!border || (border_split_x && border_split_y)) {
|
if (!border || (border_split_x && border_split_y)) {
|
||||||
encode_coding_tree(encoder, x_ctb + change, y_ctb + change, depth + 1);
|
encode_coding_tree(encoder, x_ctb + change, y_ctb + change, depth + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1057,21 +1056,19 @@ void encode_coding_tree(encoder_control *encoder, uint16_t x_ctb,
|
||||||
inter_recon(encoder->ref->pics[0], x_ctb * CU_MIN_SIZE_PIXELS,
|
inter_recon(encoder->ref->pics[0], x_ctb * CU_MIN_SIZE_PIXELS,
|
||||||
y_ctb * CU_MIN_SIZE_PIXELS, LCU_WIDTH >> depth, cur_cu->inter.mv,
|
y_ctb * CU_MIN_SIZE_PIXELS, LCU_WIDTH >> depth, cur_cu->inter.mv,
|
||||||
encoder->in.cur_pic);
|
encoder->in.cur_pic);
|
||||||
|
|
||||||
// Mark this block as "coded" (can be used for predictions..)
|
// Mark this block as "coded" (can be used for predictions..)
|
||||||
picture_set_block_coded(encoder->in.cur_pic, x_ctb, y_ctb, depth, 1);
|
picture_set_block_coded(encoder->in.cur_pic, x_ctb, y_ctb, depth, 1);
|
||||||
|
|
||||||
encode_transform_tree(encoder,x_ctb, y_ctb, depth);
|
encode_transform_tree(encoder,x_ctb, y_ctb, depth);
|
||||||
|
|
||||||
// Only need to signal coded block flag if not skipped or merged
|
// Only need to signal coded block flag if not skipped or merged
|
||||||
// skip = no coded residual, merge = coded residual
|
// skip = no coded residual, merge = coded residual
|
||||||
if (!cur_cu->merged) {
|
if (!cur_cu->merged) {
|
||||||
cabac.ctx = &g_cu_qt_root_cbf_model;
|
cabac.ctx = &g_cu_qt_root_cbf_model;
|
||||||
CABAC_BIN(&cabac, cur_cu->coeff_y | cur_cu->coeff_u | cur_cu->coeff_v, "rqt_root_cbf");
|
CABAC_BIN(&cabac, cur_cu->coeff_top_y[depth] | cur_cu->coeff_top_u[depth] | cur_cu->coeff_top_v[depth], "rqt_root_cbf");
|
||||||
}
|
}
|
||||||
// Code (possible) coeffs to bitstream
|
// Code (possible) coeffs to bitstream
|
||||||
|
|
||||||
if(cur_cu->coeff_y | cur_cu->coeff_u | cur_cu->coeff_v) {
|
if(cur_cu->coeff_top_y[depth] | cur_cu->coeff_top_u[depth] | cur_cu->coeff_top_v[depth]) {
|
||||||
encode_transform_coeff(encoder, x_ctb, y_ctb, depth, 0);
|
encode_transform_coeff(encoder, x_ctb, y_ctb, depth, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1277,10 +1274,23 @@ void encode_transform_tree(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
// Split transform and increase depth
|
// Split transform and increase depth
|
||||||
if (depth == 0 || cur_cu->tr_depth > depth) {
|
if (depth == 0 || cur_cu->tr_depth > depth) {
|
||||||
uint8_t offset = 1<<(MAX_DEPTH-1-depth);
|
uint8_t offset = 1<<(MAX_DEPTH-1-depth);
|
||||||
|
cu_info *cu_a = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + offset + y_cu * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
||||||
|
cu_info *cu_b = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + (y_cu + offset) * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
||||||
|
cu_info *cu_c = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + offset + (y_cu + offset) * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
||||||
encode_transform_tree(encoder, x_cu, y_cu, depth+1);
|
encode_transform_tree(encoder, x_cu, y_cu, depth+1);
|
||||||
encode_transform_tree(encoder, x_cu + offset, y_cu, depth+1);
|
encode_transform_tree(encoder, x_cu + offset, y_cu, depth+1);
|
||||||
encode_transform_tree(encoder, x_cu, y_cu + offset, depth+1);
|
encode_transform_tree(encoder, x_cu, y_cu + offset, depth+1);
|
||||||
encode_transform_tree(encoder, x_cu + offset, y_cu + offset, depth+1);
|
encode_transform_tree(encoder, x_cu + offset, y_cu + offset, depth+1);
|
||||||
|
|
||||||
|
// Derive coded coeff flags from the next depth
|
||||||
|
cur_cu->coeff_top_y[depth] = cur_cu->coeff_top_y[depth+1] | cu_a->coeff_top_y[depth+1] | cu_b->coeff_top_y[depth+1]
|
||||||
|
| cu_c->coeff_top_y[depth+1];
|
||||||
|
cur_cu->coeff_top_u[depth] = cur_cu->coeff_top_u[depth+1] | cu_a->coeff_top_u[depth+1] | cu_b->coeff_top_u[depth+1]
|
||||||
|
| cu_c->coeff_top_u[depth+1];
|
||||||
|
cur_cu->coeff_top_v[depth] = cur_cu->coeff_top_v[depth+1] | cu_a->coeff_top_v[depth+1] | cu_b->coeff_top_v[depth+1]
|
||||||
|
| cu_c->coeff_top_v[depth+1];
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1301,7 +1311,7 @@ void encode_transform_tree(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
pixel *pred_v = &encoder->in.cur_pic->pred_v[x_cu * (LCU_WIDTH >> (MAX_DEPTH + 1)) + (y_cu * (LCU_WIDTH >> (MAX_DEPTH + 1))) * (encoder->in.width >> 1)];
|
pixel *pred_v = &encoder->in.cur_pic->pred_v[x_cu * (LCU_WIDTH >> (MAX_DEPTH + 1)) + (y_cu * (LCU_WIDTH >> (MAX_DEPTH + 1))) * (encoder->in.width >> 1)];
|
||||||
int32_t pred_stride = encoder->in.width;
|
int32_t pred_stride = encoder->in.width;
|
||||||
|
|
||||||
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH];
|
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH<<2];
|
||||||
coefficient coeff_u[LCU_WIDTH*LCU_WIDTH>>2];
|
coefficient coeff_u[LCU_WIDTH*LCU_WIDTH>>2];
|
||||||
coefficient coeff_v[LCU_WIDTH*LCU_WIDTH>>2];
|
coefficient coeff_v[LCU_WIDTH*LCU_WIDTH>>2];
|
||||||
coefficient *orig_coeff_y = &encoder->in.cur_pic->coeff_y[x_cu * (LCU_WIDTH >> (MAX_DEPTH)) + (y_cu * (LCU_WIDTH >> (MAX_DEPTH))) * encoder->in.width];
|
coefficient *orig_coeff_y = &encoder->in.cur_pic->coeff_y[x_cu * (LCU_WIDTH >> (MAX_DEPTH)) + (y_cu * (LCU_WIDTH >> (MAX_DEPTH))) * encoder->in.width];
|
||||||
|
@ -1450,7 +1460,7 @@ void encode_transform_tree(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
for (i = 0; i < width * width; i++) {
|
for (i = 0; i < width * width; i++) {
|
||||||
if (coeff_y[i] != 0) {
|
if (coeff_y[i] != 0) {
|
||||||
// Found one, we can break here
|
// Found one, we can break here
|
||||||
cur_cu->coeff_y = 1;
|
cur_cu->coeff_top_y[depth] = cur_cu->coeff_y = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1509,7 +1519,7 @@ void encode_transform_tree(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
for (i = 0; i < width *width >> 2; i++) {
|
for (i = 0; i < width *width >> 2; i++) {
|
||||||
if (coeff_u[i] != 0) {
|
if (coeff_u[i] != 0) {
|
||||||
// Found one, we can break here
|
// Found one, we can break here
|
||||||
cur_cu->coeff_u = 1;
|
cur_cu->coeff_top_u[depth] = cur_cu->coeff_u = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1533,7 +1543,7 @@ void encode_transform_tree(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
for (i = 0; i < width *width >> 2; i++) {
|
for (i = 0; i < width *width >> 2; i++) {
|
||||||
if (coeff_v[i] != 0) {
|
if (coeff_v[i] != 0) {
|
||||||
// Found one, we can break here
|
// Found one, we can break here
|
||||||
cur_cu->coeff_v = 1;
|
cur_cu->coeff_top_v[depth] = cur_cu->coeff_v = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1628,23 +1638,19 @@ void encode_transform_coeff(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
if (encoder->in.video_format != FORMAT_400) {
|
if (encoder->in.video_format != FORMAT_400) {
|
||||||
uint8_t offset = 1<<(MAX_DEPTH-1-depth);
|
uint8_t offset = 1<<(MAX_DEPTH-1-depth);
|
||||||
|
|
||||||
//cu_info *cur_cu_idx_2 = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + offset + y_cu * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
|
||||||
//cu_info *cur_cu_idx_3 = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + (y_cu + offset) * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
|
||||||
//cu_info *cur_cu_idx_4 = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + offset + (y_cu + offset) * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
|
||||||
|
|
||||||
// Non-zero chroma U Tcoeffs
|
// Non-zero chroma U Tcoeffs
|
||||||
int8_t cb_flag = (!split) ? cur_cu->coeff_u : cur_cu->coeff_u;//(cur_cu->coeff_u | cur_cu_idx_2->coeff_u | cur_cu_idx_3->coeff_u | cur_cu_idx_4->coeff_u);
|
int8_t cb_flag = (!split) ? cur_cu->coeff_u : cur_cu->coeff_top_u[depth];
|
||||||
cabac.ctx = &g_qt_cbf_model_chroma[tr_depth];
|
cabac.ctx = &g_qt_cbf_model_chroma[tr_depth];
|
||||||
|
|
||||||
if (tr_depth == 0 /*|| ti->cb_top[1]*/) {
|
if (tr_depth == 0 || cur_cu->coeff_top_u[depth]) {
|
||||||
CABAC_BIN(&cabac, cb_flag, "cbf_chroma_u");
|
CABAC_BIN(&cabac, cb_flag, "cbf_chroma_u");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Non-zero chroma V Tcoeffs
|
// Non-zero chroma V Tcoeffs
|
||||||
// NOTE: Using the same ctx as before
|
// NOTE: Using the same ctx as before
|
||||||
cb_flag = (!split) ? cur_cu->coeff_v : cur_cu->coeff_v;//(cur_cu->coeff_v | cur_cu_idx_2->coeff_v | cur_cu_idx_3->coeff_v | cur_cu_idx_4->coeff_v);
|
cb_flag = (!split) ? cur_cu->coeff_v : cur_cu->coeff_top_v[depth];
|
||||||
|
|
||||||
if (tr_depth == 0 /*|| ti->cb_top[2]*/) {
|
if (tr_depth == 0 || cur_cu->coeff_top_v[depth]) {
|
||||||
CABAC_BIN(&cabac, cb_flag, "cbf_chroma_v");
|
CABAC_BIN(&cabac, cb_flag, "cbf_chroma_v");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1666,7 +1672,7 @@ void encode_transform_coeff(encoder_control *encoder, int32_t x_cu,int32_t y_cu,
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH];
|
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH+1];
|
||||||
coefficient coeff_u[LCU_WIDTH*LCU_WIDTH>>2];
|
coefficient coeff_u[LCU_WIDTH*LCU_WIDTH>>2];
|
||||||
coefficient coeff_v[LCU_WIDTH*LCU_WIDTH>>2];
|
coefficient coeff_v[LCU_WIDTH*LCU_WIDTH>>2];
|
||||||
int32_t coeff_stride = encoder->in.width;
|
int32_t coeff_stride = encoder->in.width;
|
||||||
|
@ -1820,7 +1826,7 @@ void encode_coeff_nxn(encoder_control *encoder, coefficient *coeff, uint8_t widt
|
||||||
|
|
||||||
if (coeff[pos_last] != 0) {
|
if (coeff[pos_last] != 0) {
|
||||||
sig_coeffgroup_flag[(num_blk_side * (POSY >> shift) + (POSX >> shift))] = 1;
|
sig_coeffgroup_flag[(num_blk_side * (POSY >> shift) + (POSX >> shift))] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_nonzero -= (coeff[pos_last] != 0) ? 1 : 0;
|
num_nonzero -= (coeff[pos_last] != 0) ? 1 : 0;
|
||||||
#undef POSY
|
#undef POSY
|
||||||
|
@ -1885,7 +1891,7 @@ void encode_coeff_nxn(encoder_control *encoder, coefficient *coeff, uint8_t widt
|
||||||
log2_block_size, width, type);
|
log2_block_size, width, type);
|
||||||
cabac.ctx = &baseCtx[ctx_sig];
|
cabac.ctx = &baseCtx[ctx_sig];
|
||||||
CABAC_BIN(&cabac, sig, "significant_coeff_flag");
|
CABAC_BIN(&cabac, sig, "significant_coeff_flag");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sig) {
|
if (sig) {
|
||||||
abs_coeff[num_non_zero] = abs(coeff[blk_pos]);
|
abs_coeff[num_non_zero] = abs(coeff[blk_pos]);
|
||||||
|
@ -1894,14 +1900,14 @@ void encode_coeff_nxn(encoder_control *encoder, coefficient *coeff, uint8_t widt
|
||||||
|
|
||||||
if (last_nz_pos_in_cg == -1) {
|
if (last_nz_pos_in_cg == -1) {
|
||||||
last_nz_pos_in_cg = scan_pos_sig;
|
last_nz_pos_in_cg = scan_pos_sig;
|
||||||
}
|
}
|
||||||
|
|
||||||
first_nz_pos_in_cg = scan_pos_sig;
|
first_nz_pos_in_cg = scan_pos_sig;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
scan_pos_sig = sub_pos - 1;
|
scan_pos_sig = sub_pos - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_non_zero > 0) {
|
if (num_non_zero > 0) {
|
||||||
int8_t sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >=
|
int8_t sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >=
|
||||||
|
@ -1912,7 +1918,7 @@ void encode_coeff_nxn(encoder_control *encoder, coefficient *coeff, uint8_t widt
|
||||||
|
|
||||||
if (c1 == 0) {
|
if (c1 == 0) {
|
||||||
ctx_set++;
|
ctx_set++;
|
||||||
}
|
}
|
||||||
|
|
||||||
c1 = 1;
|
c1 = 1;
|
||||||
|
|
||||||
|
|
|
@ -64,9 +64,9 @@ typedef struct
|
||||||
int8_t coeff_u; //!< \brief is there coded coeffs U
|
int8_t coeff_u; //!< \brief is there coded coeffs U
|
||||||
int8_t coeff_v; //!< \brief is there coded coeffs V
|
int8_t coeff_v; //!< \brief is there coded coeffs V
|
||||||
|
|
||||||
int8_t coeff_top_y; //!< \brief is there coded coeffs Y in top level
|
int8_t coeff_top_y[MAX_DEPTH+1]; //!< \brief is there coded coeffs Y in top level
|
||||||
int8_t coeff_top_u; //!< \brief is there coded coeffs U in top level
|
int8_t coeff_top_u[MAX_DEPTH+1]; //!< \brief is there coded coeffs U in top level
|
||||||
int8_t coeff_top_v; //!< \brief is there coded coeffs V in top level
|
int8_t coeff_top_v[MAX_DEPTH+1]; //!< \brief is there coded coeffs V in top level
|
||||||
cu_info_intra intra;
|
cu_info_intra intra;
|
||||||
cu_info_inter inter;
|
cu_info_inter inter;
|
||||||
} cu_info;
|
} cu_info;
|
||||||
|
|
Loading…
Reference in a new issue