mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-24 10:34:05 +00:00
Move transform unit coding to its own function.
This commit is contained in:
parent
a38a5fd647
commit
35ba873abc
167
src/encoder.c
167
src/encoder.c
|
@ -1673,89 +1673,15 @@ void encode_transform_tree(encoder_control *encoder, int32_t x_pu, int32_t y_pu,
|
||||||
// end Residual Coding
|
// end Residual Coding
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void encode_transform_unit(encoder_control *encoder, int x_pu, int y_pu, int depth, int tr_depth)
|
||||||
* \param encoder
|
|
||||||
* \param x_pu Prediction units' x coordinate.
|
|
||||||
* \param y_pu Prediction units' y coordinate.
|
|
||||||
* \param depth Depth from LCU.
|
|
||||||
* \param tr_depth Depth from last CU.
|
|
||||||
* \param parent_coeff_u What was signaled at previous level for cbf_cb.
|
|
||||||
* \param parent_coeff_v What was signlaed at previous level for cbf_cr.
|
|
||||||
*/
|
|
||||||
void encode_transform_coeff(encoder_control *encoder, int32_t x_pu,int32_t y_pu,
|
|
||||||
int8_t depth, int8_t tr_depth, uint8_t parent_coeff_u, uint8_t parent_coeff_v)
|
|
||||||
{
|
{
|
||||||
int32_t x_cu = x_pu / 2;
|
int width = LCU_WIDTH >> depth;
|
||||||
int32_t y_cu = y_pu / 2;
|
int width_c = (depth == MAX_PU_DEPTH ? width : width >> 1);
|
||||||
|
|
||||||
|
int x_cu = x_pu / 2;
|
||||||
|
int y_cu = y_pu / 2;
|
||||||
cu_info *cur_cu = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + y_cu * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
cu_info *cur_cu = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + y_cu * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
||||||
int8_t width = LCU_WIDTH >> depth;
|
|
||||||
int8_t width_c = (depth == MAX_PU_DEPTH ? width : width >> 1);
|
|
||||||
|
|
||||||
// NxN signifies implicit transform split at the first transform level.
|
|
||||||
// There is a similar implicit split for inter, but it is only used when
|
|
||||||
// transform hierarchy is not in use.
|
|
||||||
int intra_split_flag = (cur_cu->type == CU_INTRA && cur_cu->part_size == SIZE_NxN);
|
|
||||||
|
|
||||||
// The implicit split by intra NxN is not counted towards max_tr_depth.
|
|
||||||
int max_tr_depth = (cur_cu->type == CU_INTRA ? TR_DEPTH_INTRA + intra_split_flag : TR_DEPTH_INTER);
|
|
||||||
|
|
||||||
int8_t split = cur_cu->tr_depth > depth;
|
|
||||||
|
|
||||||
int8_t cb_flag_u = !split ? cur_cu->coeff_u : cur_cu->coeff_top_u[depth];
|
|
||||||
int8_t cb_flag_v = !split ? cur_cu->coeff_v : cur_cu->coeff_top_v[depth];
|
|
||||||
|
|
||||||
// The split_transform_flag is not signaled when:
|
|
||||||
// - transform size is greater than 32 (depth == 0)
|
|
||||||
// - transform size is 4 (depth == MAX_PU_DEPTH)
|
|
||||||
// - transform depth is max
|
|
||||||
// - cu is intra NxN and it's the first split
|
|
||||||
if (depth > 0 &&
|
|
||||||
depth < MAX_PU_DEPTH &&
|
|
||||||
tr_depth < max_tr_depth &&
|
|
||||||
!(intra_split_flag && tr_depth == 0))
|
|
||||||
{
|
|
||||||
cabac.ctx = &g_trans_subdiv_model[5 - ((g_convert_to_bit[LCU_WIDTH] + 2) - depth)];
|
|
||||||
CABAC_BIN(&cabac, split, "split_transform_flag");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chroma cb flags are not signaled when one of the following:
|
|
||||||
// - transform size is 4 (2x2 chroma transform doesn't exist)
|
|
||||||
// - they have already been signaled to 0 previously
|
|
||||||
// When they are not present they are inferred to be 0, except for size 4
|
|
||||||
// when the flags from previous level are used.
|
|
||||||
if (depth < MAX_PU_DEPTH) {
|
|
||||||
cabac.ctx = &g_qt_cbf_model_chroma[tr_depth];
|
|
||||||
if (tr_depth == 0 || parent_coeff_u) {
|
|
||||||
CABAC_BIN(&cabac, cb_flag_u, "cbf_cb");
|
|
||||||
}
|
|
||||||
if (tr_depth == 0 || parent_coeff_v) {
|
|
||||||
CABAC_BIN(&cabac, cb_flag_v, "cbf_cr");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (split) {
|
|
||||||
uint8_t pu_offset = 1 << (MAX_PU_DEPTH - (depth + 1));
|
|
||||||
encode_transform_coeff(encoder, x_pu, y_pu, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
|
||||||
encode_transform_coeff(encoder, x_pu + pu_offset, y_pu, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
|
||||||
encode_transform_coeff(encoder, x_pu, y_pu + pu_offset, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
|
||||||
encode_transform_coeff(encoder, x_pu + pu_offset, y_pu + pu_offset, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Luma coded block flag is signaled when one of the following:
|
|
||||||
// - prediction mode is intra
|
|
||||||
// - transform depth > 0
|
|
||||||
// - we have chroma coefficients at this level
|
|
||||||
// When it is not present, it is inferred to be 1.
|
|
||||||
if(cur_cu->type == CU_INTRA || tr_depth > 0 || cur_cu->coeff_u || cur_cu->coeff_v) {
|
|
||||||
cabac.ctx = &g_qt_cbf_model_luma[!tr_depth];
|
|
||||||
CABAC_BIN(&cabac, cur_cu->coeff_y, "cbf_luma");
|
|
||||||
}
|
|
||||||
|
|
||||||
// End of transform tree.
|
|
||||||
// Beginning of transform unit.
|
|
||||||
|
|
||||||
{
|
|
||||||
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH+1];
|
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];
|
||||||
|
@ -1865,6 +1791,87 @@ void encode_transform_coeff(encoder_control *encoder, int32_t x_pu,int32_t y_pu,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \param encoder
|
||||||
|
* \param x_pu Prediction units' x coordinate.
|
||||||
|
* \param y_pu Prediction units' y coordinate.
|
||||||
|
* \param depth Depth from LCU.
|
||||||
|
* \param tr_depth Depth from last CU.
|
||||||
|
* \param parent_coeff_u What was signaled at previous level for cbf_cb.
|
||||||
|
* \param parent_coeff_v What was signlaed at previous level for cbf_cr.
|
||||||
|
*/
|
||||||
|
void encode_transform_coeff(encoder_control *encoder, int32_t x_pu,int32_t y_pu,
|
||||||
|
int8_t depth, int8_t tr_depth, uint8_t parent_coeff_u, uint8_t parent_coeff_v)
|
||||||
|
{
|
||||||
|
int32_t x_cu = x_pu / 2;
|
||||||
|
int32_t y_cu = y_pu / 2;
|
||||||
|
cu_info *cur_cu = &encoder->in.cur_pic->cu_array[MAX_DEPTH][x_cu + y_cu * (encoder->in.width_in_lcu << MAX_DEPTH)];
|
||||||
|
|
||||||
|
// NxN signifies implicit transform split at the first transform level.
|
||||||
|
// There is a similar implicit split for inter, but it is only used when
|
||||||
|
// transform hierarchy is not in use.
|
||||||
|
int intra_split_flag = (cur_cu->type == CU_INTRA && cur_cu->part_size == SIZE_NxN);
|
||||||
|
|
||||||
|
// The implicit split by intra NxN is not counted towards max_tr_depth.
|
||||||
|
int max_tr_depth = (cur_cu->type == CU_INTRA ? TR_DEPTH_INTRA + intra_split_flag : TR_DEPTH_INTER);
|
||||||
|
|
||||||
|
int8_t split = cur_cu->tr_depth > depth;
|
||||||
|
|
||||||
|
int8_t cb_flag_u = !split ? cur_cu->coeff_u : cur_cu->coeff_top_u[depth];
|
||||||
|
int8_t cb_flag_v = !split ? cur_cu->coeff_v : cur_cu->coeff_top_v[depth];
|
||||||
|
|
||||||
|
// The split_transform_flag is not signaled when:
|
||||||
|
// - transform size is greater than 32 (depth == 0)
|
||||||
|
// - transform size is 4 (depth == MAX_PU_DEPTH)
|
||||||
|
// - transform depth is max
|
||||||
|
// - cu is intra NxN and it's the first split
|
||||||
|
if (depth > 0 &&
|
||||||
|
depth < MAX_PU_DEPTH &&
|
||||||
|
tr_depth < max_tr_depth &&
|
||||||
|
!(intra_split_flag && tr_depth == 0))
|
||||||
|
{
|
||||||
|
cabac.ctx = &g_trans_subdiv_model[5 - ((g_convert_to_bit[LCU_WIDTH] + 2) - depth)];
|
||||||
|
CABAC_BIN(&cabac, split, "split_transform_flag");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chroma cb flags are not signaled when one of the following:
|
||||||
|
// - transform size is 4 (2x2 chroma transform doesn't exist)
|
||||||
|
// - they have already been signaled to 0 previously
|
||||||
|
// When they are not present they are inferred to be 0, except for size 4
|
||||||
|
// when the flags from previous level are used.
|
||||||
|
if (depth < MAX_PU_DEPTH) {
|
||||||
|
cabac.ctx = &g_qt_cbf_model_chroma[tr_depth];
|
||||||
|
if (tr_depth == 0 || parent_coeff_u) {
|
||||||
|
CABAC_BIN(&cabac, cb_flag_u, "cbf_cb");
|
||||||
|
}
|
||||||
|
if (tr_depth == 0 || parent_coeff_v) {
|
||||||
|
CABAC_BIN(&cabac, cb_flag_v, "cbf_cr");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (split) {
|
||||||
|
uint8_t pu_offset = 1 << (MAX_PU_DEPTH - (depth + 1));
|
||||||
|
encode_transform_coeff(encoder, x_pu, y_pu, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
||||||
|
encode_transform_coeff(encoder, x_pu + pu_offset, y_pu, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
||||||
|
encode_transform_coeff(encoder, x_pu, y_pu + pu_offset, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
||||||
|
encode_transform_coeff(encoder, x_pu + pu_offset, y_pu + pu_offset, depth + 1, tr_depth + 1, cb_flag_u, cb_flag_v);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Luma coded block flag is signaled when one of the following:
|
||||||
|
// - prediction mode is intra
|
||||||
|
// - transform depth > 0
|
||||||
|
// - we have chroma coefficients at this level
|
||||||
|
// When it is not present, it is inferred to be 1.
|
||||||
|
if(cur_cu->type == CU_INTRA || tr_depth > 0 || cur_cu->coeff_u || cur_cu->coeff_v) {
|
||||||
|
cabac.ctx = &g_qt_cbf_model_luma[!tr_depth];
|
||||||
|
CABAC_BIN(&cabac, cur_cu->coeff_y, "cbf_luma");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur_cu->coeff_y | cur_cu->coeff_u | cur_cu->coeff_v) {
|
||||||
|
encode_transform_unit(encoder, x_pu, y_pu, depth, tr_depth);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void encode_coeff_nxn(encoder_control *encoder, coefficient *coeff, uint8_t width,
|
void encode_coeff_nxn(encoder_control *encoder, coefficient *coeff, uint8_t width,
|
||||||
|
|
Loading…
Reference in a new issue