mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
Fixed the case where transform split is used (always on depth 0)
After this fix, inter coding should be working.
This commit is contained in:
parent
c9d35aeacf
commit
877e156cb8
|
@ -211,7 +211,7 @@ void filter_deblock_edge_luma(encoder_control *encoder,
|
|||
if(cu_q->type == CU_INTRA || cu_p->type == CU_INTRA) {
|
||||
strength = 2;
|
||||
// Non-zero residual/coeffs and transform boundary
|
||||
} else if(cu_q->coeff_top_y[cu_q->depth] || cu_p->coeff_top_y[cu_p->depth]) {
|
||||
} else if(cu_q->coeff_top_y[cu_q->tr_depth] || cu_p->coeff_top_y[cu_p->tr_depth]) {
|
||||
strength = 1;
|
||||
// Absolute motion vector diff between blocks >= 1 (Integer pixel)
|
||||
} else if((abs(cu_q->inter.mv[0] - cu_p->inter.mv[0]) >= 4) || (abs(cu_q->inter.mv[1] - cu_p->inter.mv[1]) >= 4)) {
|
||||
|
|
31
src/search.c
31
src/search.c
|
@ -472,16 +472,42 @@ static void lcu_set_inter(lcu_t *lcu, int x_px, int y_px, int depth, cu_info *cu
|
|||
const int y_cu = SUB_SCU(y_px) >> MAX_DEPTH;
|
||||
cu_info *const lcu_cu = &lcu->cu[LCU_CU_OFFSET];
|
||||
int x, y;
|
||||
|
||||
// Set mode in every CU covered by part_mode in this depth.
|
||||
for (y = y_cu; y < y_cu + width_cu; ++y) {
|
||||
for (x = x_cu; x < x_cu + width_cu; ++x) {
|
||||
cu_info *cu = &lcu_cu[x + y * LCU_T_CU_WIDTH];
|
||||
memcpy(cu, cur_cu, sizeof(cu_info));
|
||||
cu->coded = 1;
|
||||
cu->depth = cur_cu->depth;
|
||||
cu->type = CU_INTER;
|
||||
cu->tr_depth = cur_cu->tr_depth;
|
||||
cu->merged = cur_cu->merged;
|
||||
cu->skipped = cur_cu->skipped;
|
||||
memcpy(&cu->inter, &cur_cu->inter, sizeof(cu_info_inter));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void lcu_set_coeff(lcu_t *lcu, int x_px, int y_px, int depth, cu_info *cur_cu)
|
||||
{
|
||||
const int width_cu = LCU_CU_WIDTH >> depth;
|
||||
const int x_cu = SUB_SCU(x_px) >> MAX_DEPTH;
|
||||
const int y_cu = SUB_SCU(y_px) >> MAX_DEPTH;
|
||||
cu_info *const lcu_cu = &lcu->cu[LCU_CU_OFFSET];
|
||||
int x, y;
|
||||
int tr_split = cur_cu->tr_depth-cur_cu->depth;
|
||||
|
||||
// Set coeff flags in every CU covered by part_mode in this depth.
|
||||
for (y = y_cu; y < y_cu + width_cu; ++y) {
|
||||
for (x = x_cu; x < x_cu + width_cu; ++x) {
|
||||
cu_info *cu = &lcu_cu[x + y * LCU_T_CU_WIDTH];
|
||||
// Use TU top-left CU to propagate coeff flags
|
||||
uint32_t mask = ~((width_cu>>tr_split)-1);
|
||||
cu_info *cu_from = &lcu_cu[(x & mask) + (y & mask) * LCU_T_CU_WIDTH];
|
||||
// Chroma coeff data is not used, luma is needed for deblocking
|
||||
memcpy(cu->coeff_top_y, cu_from->coeff_top_y, 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update lcu to have best modes at this depth.
|
||||
|
@ -678,6 +704,7 @@ static int search_cu(encoder_control *encoder, int x, int y, int depth, lcu_t wo
|
|||
cur_cu->skipped = 1;
|
||||
}
|
||||
lcu_set_inter(&work_tree[depth], x, y, depth, cur_cu);
|
||||
lcu_set_coeff(&work_tree[depth], x, y, depth, cur_cu);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue