1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/vvc/intra: add palette coding decoder

Introduction at https://ieeexplore.ieee.org/document/9408666

passed files:
    10b422_G_Sony_5.bit
    10b422_H_Sony_5.bit
    10b422_I_Sony_5.bit
    10b422_J_Sony_5.bit
    10b422_K_Sony_5.bit
    10b422_L_Sony_5.bit
    8b422_G_Sony_5.bit
    8b422_H_Sony_5.bit
    8b422_I_Sony_5.bit
    8b422_J_Sony_5.bit
    8b422_K_Sony_5.bit
    8b422_L_Sony_5.bit
    8b444_A_Kwai_2.bit
    8b444_B_Kwai_2.bit
    PALETTE_A_Alibaba_2.bit
    PALETTE_B_Alibaba_2.bit
    PALETTE_C_Alibaba_2.bit
    PALETTE_D_Alibaba_2.bit
    PALETTE_E_Alibaba_2.bit

Signed-off-by: Wu Jianhua <toqsxw@outlook.com>
This commit is contained in:
Wu Jianhua
2025-05-14 21:40:19 +08:00
committed by Nuo Mi
parent 95473fae9b
commit 70a2d0d756

View File

@ -670,6 +670,27 @@ int ff_vvc_palette_derive_scale(VVCLocalContext *lc, const TransformUnit *tu, Tr
return level_scale[0][rem6[qp]] << div6[qp]; return level_scale[0][rem6[qp]] << div6[qp];
} }
// 8.4.5.3 Decoding process for palette mode
static void vvc_predict_palette(VVCLocalContext *lc)
{
const VVCFrameContext *fc = lc->fc;
const CodingUnit *cu = lc->cu;
TransformUnit *tu = cu->tus.head;
const VVCSPS *sps = fc->ps.sps;
const int ps = sps->pixel_shift;
for (int i = 0; i < tu->nb_tbs; i++) {
TransformBlock *tb = &tu->tbs[i];
const int c_idx = tb->c_idx;
const int w = tb->tb_width;
const int h = tb->tb_height;
const ptrdiff_t stride = fc->frame->linesize[c_idx];
uint8_t *dst = POS(c_idx, cu->x0, cu->y0);
av_image_copy_plane(dst, stride, (uint8_t*)tb->coeffs, w << ps, w << ps, h);
}
}
int ff_vvc_reconstruct(VVCLocalContext *lc, const int rs, const int rx, const int ry) int ff_vvc_reconstruct(VVCLocalContext *lc, const int rs, const int rx, const int ry)
{ {
const VVCFrameContext *fc = lc->fc; const VVCFrameContext *fc = lc->fc;
@ -690,6 +711,8 @@ int ff_vvc_reconstruct(VVCLocalContext *lc, const int rs, const int rx, const in
ff_vvc_predict_ciip(lc); ff_vvc_predict_ciip(lc);
else if (cu->pred_mode == MODE_IBC) else if (cu->pred_mode == MODE_IBC)
vvc_predict_ibc(lc); vvc_predict_ibc(lc);
else if (cu->pred_mode == MODE_PLT)
vvc_predict_palette(lc);
if (cu->coded_flag) { if (cu->coded_flag) {
ret = reconstruct(lc); ret = reconstruct(lc);
} else { } else {