From: Wu Jianhua <toq...@outlook.com>

prepare for adaptive color transform

Signed-off-by: Wu Jianhua <toq...@outlook.com>
---
 libavcodec/vvc/dsp.h          |  1 -
 libavcodec/vvc/dsp_template.c | 18 -------------
 libavcodec/vvc/intra.c        | 51 ++++++++++++++---------------------
 3 files changed, 20 insertions(+), 50 deletions(-)

diff --git a/libavcodec/vvc/dsp.h b/libavcodec/vvc/dsp.h
index e9ef9f5b25..fa1387aadd 100644
--- a/libavcodec/vvc/dsp.h
+++ b/libavcodec/vvc/dsp.h
@@ -122,7 +122,6 @@ typedef struct VVCIntraDSPContext {
 
 typedef struct VVCItxDSPContext {
     void (*add_residual)(uint8_t *dst, const int *res, int width, int height, 
ptrdiff_t stride);
-    void (*add_residual_joint)(uint8_t *dst, const int *res, int width, int 
height, ptrdiff_t stride, int c_sign, int shift);
     void (*pred_residual_joint)(int *dst, const int *src, int width, int 
height, int c_sign, int shift);
 
     void (*itx[VVC_N_TX_TYPE][VVC_N_TX_SIZE])(int *coeffs, ptrdiff_t step, 
size_t nz);
diff --git a/libavcodec/vvc/dsp_template.c b/libavcodec/vvc/dsp_template.c
index 218a600cce..13bd8cd4a1 100644
--- a/libavcodec/vvc/dsp_template.c
+++ b/libavcodec/vvc/dsp_template.c
@@ -45,23 +45,6 @@ static void FUNC(add_residual)(uint8_t *_dst, const int *res,
     }
 }
 
-static void FUNC(add_residual_joint)(uint8_t *_dst, const int *res,
-    const int w, const int h, const ptrdiff_t _stride, const int c_sign, const 
int shift)
-{
-    pixel *dst = (pixel *)_dst;
-
-    const int stride = _stride / sizeof(pixel);
-
-    for (int y = 0; y < h; y++) {
-        for (int x = 0; x < w; x++) {
-            const int r = ((*res) * c_sign) >> shift;
-            dst[x] = av_clip_pixel(dst[x] + r);
-            res++;
-        }
-        dst += stride;
-    }
-}
-
 static void FUNC(pred_residual_joint)(int *dst, const int *src, const int w, 
const int h,
     const int c_sign, const int shift)
 {
@@ -121,7 +104,6 @@ static void FUNC(ff_vvc_itx_dsp_init)(VVCItxDSPContext 
*const itx)
         VVC_ITX(TYPE, type, 32);
 
     itx->add_residual                = FUNC(add_residual);
-    itx->add_residual_joint          = FUNC(add_residual_joint);
     itx->pred_residual_joint         = FUNC(pred_residual_joint);
     itx->transform_bdpcm             = FUNC(transform_bdpcm);
     VVC_ITX(DCT2, dct2, 2)
diff --git a/libavcodec/vvc/intra.c b/libavcodec/vvc/intra.c
index 5f9bbea3d1..3db3347d8c 100644
--- a/libavcodec/vvc/intra.c
+++ b/libavcodec/vvc/intra.c
@@ -164,28 +164,6 @@ static void derive_transform_type(const VVCFrameContext 
*fc, const VVCLocalConte
     *trv = mts_to_trv[cu->mts_idx];
 }
 
-static void add_residual_for_joint_coding_chroma(VVCLocalContext *lc,
-    const TransformUnit *tu, TransformBlock *tb, const int chroma_scale)
-{
-    const VVCFrameContext *fc  = lc->fc;
-    const CodingUnit *cu = lc->cu;
-    const int c_sign = 1 - 2 * fc->ps.ph.r->ph_joint_cbcr_sign_flag;
-    const int shift  = tu->coded_flag[1] ^ tu->coded_flag[2];
-    const int c_idx  = 1 + tu->coded_flag[1];
-    const ptrdiff_t stride = fc->frame->linesize[c_idx];
-    const int hs = fc->ps.sps->hshift[c_idx];
-    const int vs = fc->ps.sps->vshift[c_idx];
-    uint8_t *dst = &fc->frame->data[c_idx][(tb->y0 >> vs) * stride +
-                                          ((tb->x0 >> hs) << 
fc->ps.sps->pixel_shift)];
-    if (chroma_scale) {
-        fc->vvcdsp.itx.pred_residual_joint(tb->coeffs, tb->coeffs, 
tb->tb_width, tb->tb_height, c_sign, shift);
-        fc->vvcdsp.intra.lmcs_scale_chroma(lc, tb->coeffs, tb->coeffs, 
tb->tb_width, tb->tb_height, cu->x0, cu->y0);
-        fc->vvcdsp.itx.add_residual(dst, tb->coeffs, tb->tb_width, 
tb->tb_height, stride);
-    } else {
-        fc->vvcdsp.itx.add_residual_joint(dst, tb->coeffs, tb->tb_width, 
tb->tb_height, stride, c_sign, shift);
-    }
-}
-
 static int add_reconstructed_area(VVCLocalContext *lc, const int ch_type, 
const int x0, const int y0, const int w, const int h)
 {
     const VVCSPS *sps       = lc->fc->ps.sps;
@@ -531,7 +509,7 @@ static void itransform(VVCLocalContext *lc, TransformUnit 
*tu, const int tu_idx,
             const ptrdiff_t stride  = fc->frame->linesize[c_idx];
             const int hs            = sps->hshift[c_idx];
             const int vs            = sps->vshift[c_idx];
-            uint8_t *dst            = &fc->frame->data[c_idx][(tb->y0 >> vs) * 
stride + ((tb->x0 >> hs) << ps)];
+            const int has_jcbcr     = tu->joint_cbcr_residual_flag && c_idx;
 
             if (cu->bdpcm_flag[tb->c_idx])
                 transform_bdpcm(tb, lc, cu);
@@ -548,14 +526,25 @@ static void itransform(VVCLocalContext *lc, TransformUnit 
*tu, const int tu_idx,
                     itx_1d(fc, tb, trh, trv);
             }
 
-            if (chroma_scale)
-                fc->vvcdsp.intra.lmcs_scale_chroma(lc, temp, tb->coeffs, w, h, 
cu->x0, cu->y0);
-            // TODO: Address performance issue here by combining transform, 
lmcs_scale_chroma, and add_residual into one function.
-            // Complete this task before implementing ASM code.
-            fc->vvcdsp.itx.add_residual(dst, chroma_scale ? temp : tb->coeffs, 
w, h, stride);
-
-            if (tu->joint_cbcr_residual_flag && tb->c_idx)
-                add_residual_for_joint_coding_chroma(lc, tu, tb, chroma_scale);
+            for (int j = 0; j < 1 + has_jcbcr; j++) {
+                const bool is_jcbcr   = j > 0;
+                const int jcbcr_idx   = CB + tu->coded_flag[CB];
+                TransformBlock *jcbcr = &tu->tbs[jcbcr_idx - tu->tbs[0].c_idx];
+                const int c           = is_jcbcr ? jcbcr_idx : tb->c_idx;
+                int *coeffs           = is_jcbcr ? jcbcr->coeffs : tb->coeffs;
+                uint8_t *dst          = &fc->frame->data[c][(tb->y0 >> vs) * 
stride + ((tb->x0 >> hs) << ps)];
+
+                if (!j && has_jcbcr) {
+                    const int c_sign = 1 - 2 * 
fc->ps.ph.r->ph_joint_cbcr_sign_flag;
+                    const int shift  = tu->coded_flag[CB] ^ tu->coded_flag[CR];
+                    fc->vvcdsp.itx.pred_residual_joint(jcbcr->coeffs, 
tb->coeffs, tb->tb_width, tb->tb_height, c_sign, shift);
+                }
+                if (chroma_scale)
+                    fc->vvcdsp.intra.lmcs_scale_chroma(lc, temp, coeffs, w, h, 
cu->x0, cu->y0);
+                // TODO: Address performance issue here by combining 
transform, lmcs_scale_chroma, and add_residual into one function.
+                // Complete this task before implementing ASM code.
+                fc->vvcdsp.itx.add_residual(dst, chroma_scale ? temp : coeffs, 
w, h, stride);
+            }
         }
     }
 }
-- 
2.44.0.windows.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to