1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +02:00

avcodec/vvc/ctu: fix derive_chroma_intra_pred_mode

See 8.4.3 Derivation process for chroma intra prediction mode

Signed-off-by: Wu Jianhua <toqsxw@outlook.com>
This commit is contained in:
Wu Jianhua
2025-05-14 21:40:22 +08:00
committed by Nuo Mi
parent c58357edc2
commit d00a249dbf

View File

@@ -895,7 +895,7 @@ static void derive_chroma_intra_pred_mode(VVCLocalContext *lc,
enum IntraPredMode luma_intra_pred_mode = SAMPLE_CTB(fc->tab.ipm, x_cb, y_cb); enum IntraPredMode luma_intra_pred_mode = SAMPLE_CTB(fc->tab.ipm, x_cb, y_cb);
if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444 && if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444 &&
intra_chroma_pred_mode == 4 && intra_mip_flag) { (intra_chroma_pred_mode == 4 || cu->act_enabled_flag) && intra_mip_flag) {
cu->mip_chroma_direct_flag = 1; cu->mip_chroma_direct_flag = 1;
cu->intra_pred_mode_c = luma_intra_pred_mode; cu->intra_pred_mode_c = luma_intra_pred_mode;
return; return;
@@ -1011,7 +1011,11 @@ static void intra_chroma_pred_modes(VVCLocalContext *lc)
CodingUnit *cu = lc->cu; CodingUnit *cu = lc->cu;
const int hs = sps->hshift[CHROMA]; const int hs = sps->hshift[CHROMA];
const int vs = sps->vshift[CHROMA]; const int vs = sps->vshift[CHROMA];
int cclm_mode_flag = 0;
int cclm_mode_idx = 0;
int intra_chroma_pred_mode = 0;
if (!cu->act_enabled_flag) {
cu->mip_chroma_direct_flag = 0; cu->mip_chroma_direct_flag = 0;
if (sps->r->sps_bdpcm_enabled_flag && if (sps->r->sps_bdpcm_enabled_flag &&
(cu->cb_width >> hs) <= sps->max_ts_size && (cu->cb_width >> hs) <= sps->max_ts_size &&
@@ -1022,9 +1026,6 @@ static void intra_chroma_pred_modes(VVCLocalContext *lc)
cu->intra_pred_mode_c = ff_vvc_intra_bdpcm_chroma_dir_flag(lc) ? INTRA_VERT : INTRA_HORZ; cu->intra_pred_mode_c = ff_vvc_intra_bdpcm_chroma_dir_flag(lc) ? INTRA_VERT : INTRA_HORZ;
} else { } else {
const int cclm_enabled = get_cclm_enabled(lc, cu->x0, cu->y0); const int cclm_enabled = get_cclm_enabled(lc, cu->x0, cu->y0);
int cclm_mode_flag = 0;
int cclm_mode_idx = 0;
int intra_chroma_pred_mode = 0;
if (cclm_enabled) if (cclm_enabled)
cclm_mode_flag = ff_vvc_cclm_mode_flag(lc); cclm_mode_flag = ff_vvc_cclm_mode_flag(lc);
@@ -1033,10 +1034,13 @@ static void intra_chroma_pred_modes(VVCLocalContext *lc)
cclm_mode_idx = ff_vvc_cclm_mode_idx(lc); cclm_mode_idx = ff_vvc_cclm_mode_idx(lc);
else else
intra_chroma_pred_mode = ff_vvc_intra_chroma_pred_mode(lc); intra_chroma_pred_mode = ff_vvc_intra_chroma_pred_mode(lc);
derive_chroma_intra_pred_mode(lc, cclm_mode_flag, cclm_mode_idx, intra_chroma_pred_mode);
} }
} }
if (!cu->bdpcm_flag[CHROMA])
derive_chroma_intra_pred_mode(lc, cclm_mode_flag, cclm_mode_idx, intra_chroma_pred_mode);
}
static PredMode pred_mode_decode(VVCLocalContext *lc, static PredMode pred_mode_decode(VVCLocalContext *lc,
const VVCTreeType tree_type, const VVCTreeType tree_type,
const VVCModeType mode_type) const VVCModeType mode_type)
@@ -2122,7 +2126,6 @@ static int intra_data(VVCLocalContext *lc)
if ((ret = hls_palette_coding(lc, tree_type)) < 0) if ((ret = hls_palette_coding(lc, tree_type)) < 0)
return ret; return ret;
} else if (!pred_mode_plt_flag) { } else if (!pred_mode_plt_flag) {
if (!cu->act_enabled_flag)
intra_chroma_pred_modes(lc); intra_chroma_pred_modes(lc);
} }
} }