mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
Split residual quantization to separate luma and chroma function.
This commit is contained in:
parent
6c7e4dbeef
commit
9147b7acbf
|
@ -892,5 +892,6 @@ void intra_recon_lcu(encoder_state * const encoder_state, int x, int y, int dept
|
||||||
rec_stride, width, width);
|
rec_stride, width, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
encode_transform_tree(encoder_state, x, y, depth, lcu);
|
quantize_lcu_luma_residual(encoder_state, x, y, depth, lcu);
|
||||||
|
quantize_lcu_chroma_residual(encoder_state, x, y, depth, lcu);
|
||||||
}
|
}
|
|
@ -913,7 +913,8 @@ static int search_cu(encoder_state * const encoder_state, int x, int y, int dept
|
||||||
} else if (cur_cu->type == CU_INTER) {
|
} else if (cur_cu->type == CU_INTER) {
|
||||||
int cbf;
|
int cbf;
|
||||||
inter_recon_lcu(encoder_state, encoder_state->global->ref->pics[cur_cu->inter.mv_ref], x, y, LCU_WIDTH>>depth, cur_cu->inter.mv, &work_tree[depth]);
|
inter_recon_lcu(encoder_state, encoder_state->global->ref->pics[cur_cu->inter.mv_ref], x, y, LCU_WIDTH>>depth, cur_cu->inter.mv, &work_tree[depth]);
|
||||||
encode_transform_tree(encoder_state, x, y, depth, &work_tree[depth]);
|
quantize_lcu_luma_residual(encoder_state, x, y, depth, &work_tree[depth]);
|
||||||
|
quantize_lcu_chroma_residual(encoder_state, x, y, depth, &work_tree[depth]);
|
||||||
|
|
||||||
cbf = cbf_is_set(cur_cu->cbf.y, depth) || cbf_is_set(cur_cu->cbf.u, depth) || cbf_is_set(cur_cu->cbf.v, depth);
|
cbf = cbf_is_set(cur_cu->cbf.y, depth) || cbf_is_set(cur_cu->cbf.u, depth) || cbf_is_set(cur_cu->cbf.v, depth);
|
||||||
|
|
||||||
|
|
|
@ -993,7 +993,7 @@ int quantize_residual_trskip(
|
||||||
* - lcu->cbf coded block flags for the area
|
* - lcu->cbf coded block flags for the area
|
||||||
* - lcu->cu.intra[].tr_skip for the area
|
* - lcu->cu.intra[].tr_skip for the area
|
||||||
*/
|
*/
|
||||||
void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32_t y, const uint8_t depth, lcu_t* lcu)
|
void quantize_lcu_luma_residual(encoder_state * const encoder_state, int32_t x, int32_t y, const uint8_t depth, lcu_t* lcu)
|
||||||
{
|
{
|
||||||
// we have 64>>depth transform size
|
// we have 64>>depth transform size
|
||||||
const vector2d lcu_px = {x & 0x3f, y & 0x3f};
|
const vector2d lcu_px = {x & 0x3f, y & 0x3f};
|
||||||
|
@ -1008,10 +1008,10 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
// 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) {
|
||||||
int offset = width / 2;
|
int offset = width / 2;
|
||||||
encode_transform_tree(encoder_state, x, y, depth+1, lcu);
|
quantize_lcu_luma_residual(encoder_state, x, y, depth+1, lcu);
|
||||||
encode_transform_tree(encoder_state, x + offset, y, depth+1, lcu);
|
quantize_lcu_luma_residual(encoder_state, x + offset, y, depth+1, lcu);
|
||||||
encode_transform_tree(encoder_state, x, y + offset, depth+1, lcu);
|
quantize_lcu_luma_residual(encoder_state, x, y + offset, depth+1, lcu);
|
||||||
encode_transform_tree(encoder_state, x + offset, y + offset, depth+1, lcu);
|
quantize_lcu_luma_residual(encoder_state, x + offset, y + offset, depth+1, lcu);
|
||||||
|
|
||||||
// Propagate coded block flags from child CUs to parent CU.
|
// Propagate coded block flags from child CUs to parent CU.
|
||||||
if (depth < MAX_DEPTH) {
|
if (depth < MAX_DEPTH) {
|
||||||
|
@ -1021,12 +1021,6 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
if (cbf_is_set(cu_a->cbf.y, depth+1) || cbf_is_set(cu_b->cbf.y, depth+1) || cbf_is_set(cu_c->cbf.y, depth+1)) {
|
if (cbf_is_set(cu_a->cbf.y, depth+1) || cbf_is_set(cu_b->cbf.y, depth+1) || cbf_is_set(cu_c->cbf.y, depth+1)) {
|
||||||
cbf_set(&cur_cu->cbf.y, depth);
|
cbf_set(&cur_cu->cbf.y, depth);
|
||||||
}
|
}
|
||||||
if (cbf_is_set(cu_a->cbf.u, depth+1) || cbf_is_set(cu_b->cbf.u, depth+1) || cbf_is_set(cu_c->cbf.u, depth+1)) {
|
|
||||||
cbf_set(&cur_cu->cbf.u, depth);
|
|
||||||
}
|
|
||||||
if (cbf_is_set(cu_a->cbf.v, depth+1) || cbf_is_set(cu_b->cbf.v, depth+1) || cbf_is_set(cu_c->cbf.v, depth+1)) {
|
|
||||||
cbf_set(&cur_cu->cbf.v, depth);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1052,10 +1046,6 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
// This should ensure that the CBF data doesn't get corrupted if this function
|
// This should ensure that the CBF data doesn't get corrupted if this function
|
||||||
// is called more than once.
|
// is called more than once.
|
||||||
cbf_clear(&cur_cu->cbf.y, depth + pu_index);
|
cbf_clear(&cur_cu->cbf.y, depth + pu_index);
|
||||||
if (pu_index == 0) {
|
|
||||||
cbf_clear(&cur_cu->cbf.u, depth);
|
|
||||||
cbf_clear(&cur_cu->cbf.v, depth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (width == 4 && encoder_state->encoder_control->trskip_enable) {
|
if (width == 4 && encoder_state->encoder_control->trskip_enable) {
|
||||||
// Try quantization with trskip and use it if it's better.
|
// Try quantization with trskip and use it if it's better.
|
||||||
|
@ -1080,6 +1070,44 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void quantize_lcu_chroma_residual(encoder_state * const encoder_state, int32_t x, int32_t y, const uint8_t depth, lcu_t* lcu)
|
||||||
|
{
|
||||||
|
// we have 64>>depth transform size
|
||||||
|
const vector2d lcu_px = {x & 0x3f, y & 0x3f};
|
||||||
|
const int pu_index = PU_INDEX(lcu_px.x / 4, lcu_px.y / 4);
|
||||||
|
cu_info *cur_cu = &lcu->cu[LCU_CU_OFFSET + (lcu_px.x>>3) + (lcu_px.y>>3)*LCU_T_CU_WIDTH];
|
||||||
|
const int8_t width = LCU_WIDTH>>depth;
|
||||||
|
|
||||||
|
// Tell clang-analyzer what is up. For some reason it can't figure out from
|
||||||
|
// asserting just depth.
|
||||||
|
assert(width == 4 || width == 8 || width == 16 || width == 32 || width == 64);
|
||||||
|
|
||||||
|
// Split transform and increase depth
|
||||||
|
if (depth == 0 || cur_cu->tr_depth > depth) {
|
||||||
|
int offset = width / 2;
|
||||||
|
quantize_lcu_chroma_residual(encoder_state, x, y, depth+1, lcu);
|
||||||
|
quantize_lcu_chroma_residual(encoder_state, x + offset, y, depth+1, lcu);
|
||||||
|
quantize_lcu_chroma_residual(encoder_state, x, y + offset, depth+1, lcu);
|
||||||
|
quantize_lcu_chroma_residual(encoder_state, x + offset, y + offset, depth+1, lcu);
|
||||||
|
|
||||||
|
// Propagate coded block flags from child CUs to parent CU.
|
||||||
|
if (depth < MAX_DEPTH) {
|
||||||
|
cu_info *cu_a = &lcu->cu[LCU_CU_OFFSET + ((lcu_px.x + offset)>>3) + (lcu_px.y>>3) *LCU_T_CU_WIDTH];
|
||||||
|
cu_info *cu_b = &lcu->cu[LCU_CU_OFFSET + (lcu_px.x>>3) + ((lcu_px.y+offset)>>3)*LCU_T_CU_WIDTH];
|
||||||
|
cu_info *cu_c = &lcu->cu[LCU_CU_OFFSET + ((lcu_px.x + offset)>>3) + ((lcu_px.y+offset)>>3)*LCU_T_CU_WIDTH];
|
||||||
|
if (cbf_is_set(cu_a->cbf.u, depth+1) || cbf_is_set(cu_b->cbf.u, depth+1) || cbf_is_set(cu_c->cbf.u, depth+1)) {
|
||||||
|
cbf_set(&cur_cu->cbf.u, depth);
|
||||||
|
}
|
||||||
|
if (cbf_is_set(cu_a->cbf.v, depth+1) || cbf_is_set(cu_b->cbf.v, depth+1) || cbf_is_set(cu_c->cbf.v, depth+1)) {
|
||||||
|
cbf_set(&cur_cu->cbf.v, depth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If luma is 4x4, do chroma for the 8x8 luma area when handling the top
|
// If luma is 4x4, do chroma for the 8x8 luma area when handling the top
|
||||||
// left PU because the coordinates are correct.
|
// left PU because the coordinates are correct.
|
||||||
|
|
|
@ -46,6 +46,7 @@ void itransform2d(const encoder_control *encoder, int16_t *block,int16_t *coeff,
|
||||||
|
|
||||||
int32_t get_scaled_qp(int8_t type, int8_t qp, int8_t qp_offset);
|
int32_t get_scaled_qp(int8_t type, int8_t qp, int8_t qp_offset);
|
||||||
|
|
||||||
void encode_transform_tree(encoder_state *encoder_state, int32_t x, int32_t y, uint8_t depth, lcu_t* lcu);
|
void quantize_lcu_luma_residual(encoder_state *encoder_state, int32_t x, int32_t y, uint8_t depth, lcu_t* lcu);
|
||||||
|
void quantize_lcu_chroma_residual(encoder_state *encoder_state, int32_t x, int32_t y, uint8_t depth, lcu_t* lcu);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue