|
|
|
@ -545,6 +545,16 @@ typedef struct NeighbourContext { |
|
|
|
|
const VVCLocalContext *lc; |
|
|
|
|
} NeighbourContext; |
|
|
|
|
|
|
|
|
|
static int is_available(const VVCFrameContext *fc, const int x0, const int y0) |
|
|
|
|
{ |
|
|
|
|
const VVCSPS *sps = fc->ps.sps; |
|
|
|
|
const int x = x0 >> sps->min_cb_log2_size_y; |
|
|
|
|
const int y = y0 >> sps->min_cb_log2_size_y; |
|
|
|
|
const int min_cb_width = fc->ps.pps->min_cb_width; |
|
|
|
|
|
|
|
|
|
return SAMPLE_CTB(fc->tab.cb_width[0], x, y) != 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int is_a0_available(const VVCLocalContext *lc, const CodingUnit *cu) |
|
|
|
|
{ |
|
|
|
|
const VVCFrameContext *fc = lc->fc; |
|
|
|
@ -555,15 +565,11 @@ static int is_a0_available(const VVCLocalContext *lc, const CodingUnit *cu) |
|
|
|
|
if (!x0b && !lc->ctb_left_flag) { |
|
|
|
|
cand_bottom_left = 0; |
|
|
|
|
} else { |
|
|
|
|
const int log2_min_cb_size = sps->min_cb_log2_size_y; |
|
|
|
|
const int min_cb_width = fc->ps.pps->min_cb_width; |
|
|
|
|
const int x = (cu->x0 - 1) >> log2_min_cb_size; |
|
|
|
|
const int y = (cu->y0 + cu->cb_height) >> log2_min_cb_size; |
|
|
|
|
const int max_y = FFMIN(fc->ps.pps->height, ((cu->y0 >> sps->ctb_log2_size_y) + 1) << sps->ctb_log2_size_y); |
|
|
|
|
const int max_y = FFMIN(fc->ps.pps->height, ((cu->y0 >> sps->ctb_log2_size_y) + 1) << sps->ctb_log2_size_y); |
|
|
|
|
if (cu->y0 + cu->cb_height >= max_y) |
|
|
|
|
cand_bottom_left = 0; |
|
|
|
|
else |
|
|
|
|
cand_bottom_left = SAMPLE_CTB(fc->tab.cb_width[0], x, y) != 0; |
|
|
|
|
cand_bottom_left = is_available(fc, cu->x0 - 1, cu->y0 + cu->cb_height); |
|
|
|
|
} |
|
|
|
|
return cand_bottom_left; |
|
|
|
|
} |
|
|
|
|