diff mbox series

[FFmpeg-devel] avcodec/x86/vvc/vvcdsp_init: fix linking error when configuring with --disable-ssse3 --disable-optimizations options

Message ID TYWP286MB2172C45C89A014B481CD93A6CA5F2@TYWP286MB2172.JPNP286.PROD.OUTLOOK.COM
State New
Headers show
Series [FFmpeg-devel] avcodec/x86/vvc/vvcdsp_init: fix linking error when configuring with --disable-ssse3 --disable-optimizations options | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Wu Jianhua Feb. 29, 2024, 5:41 p.m. UTC
From: Wu Jianhua <toqsxw@outlook.com>

Signed-off-by: Wu Jianhua <toqsxw@outlook.com>
---
 libavcodec/x86/vvc/vvcdsp_init.c | 115 ++++++++++++++++++++++---------
 1 file changed, 82 insertions(+), 33 deletions(-)

Comments

Nuo Mi March 3, 2024, 2:49 p.m. UTC | #1
Thank you, Jianhua.
This patch mixes many things.
Could you help split it into smaller, more atomic patches?
For example, one for moving code blocks and another for fixing
--disable-ssse3.

On Fri, Mar 1, 2024 at 1:42 AM <toqsxw@outlook.com> wrote:

> From: Wu Jianhua <toqsxw@outlook.com>
>
> Signed-off-by: Wu Jianhua <toqsxw@outlook.com>
> ---
>  libavcodec/x86/vvc/vvcdsp_init.c | 115 ++++++++++++++++++++++---------
>  1 file changed, 82 insertions(+), 33 deletions(-)
>
> diff --git a/libavcodec/x86/vvc/vvcdsp_init.c
> b/libavcodec/x86/vvc/vvcdsp_init.c
> index 0d2c683f0f..9ae84bda48 100644
> --- a/libavcodec/x86/vvc/vvcdsp_init.c
> +++ b/libavcodec/x86/vvc/vvcdsp_init.c
> @@ -31,9 +31,67 @@
>  #include "libavcodec/vvc/vvcdsp.h"
>  #include "libavcodec/x86/h26x/h2656dsp.h"
>
> +#define PUT_PROTOTYPE(name, depth, opt) \
> +void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const
> uint8_t *src, ptrdiff_t srcstride, int height, const int8_t *hf, const
> int8_t *vf, int width);
> +
> +#define PUT_PROTOTYPES(name, bitd, opt) \
> +        PUT_PROTOTYPE(name##2,   bitd, opt) \
> +        PUT_PROTOTYPE(name##4,   bitd, opt) \
> +        PUT_PROTOTYPE(name##8,   bitd, opt) \
> +        PUT_PROTOTYPE(name##12,  bitd, opt) \
> +        PUT_PROTOTYPE(name##16,  bitd, opt) \
> +        PUT_PROTOTYPE(name##24,  bitd, opt) \
> +        PUT_PROTOTYPE(name##32,  bitd, opt) \
> +        PUT_PROTOTYPE(name##48,  bitd, opt) \
> +        PUT_PROTOTYPE(name##64,  bitd, opt) \
> +        PUT_PROTOTYPE(name##128, bitd, opt)
> +
> +#define PUT_BPC_PROTOTYPES(name, opt) \
> +    PUT_PROTOTYPES(name,  8, opt)     \
> +    PUT_PROTOTYPES(name, 10, opt)     \
> +    PUT_PROTOTYPES(name, 12, opt)
> +
> +#define PUT_TAP_PROTOTYPES(n, opt) \
> +    PUT_BPC_PROTOTYPES(n##tap_h,  opt) \
> +    PUT_BPC_PROTOTYPES(n##tap_v,  opt) \
> +    PUT_BPC_PROTOTYPES(n##tap_hv, opt)
> +
> +PUT_BPC_PROTOTYPES(pixels, sse4)
> +PUT_BPC_PROTOTYPES(pixels, avx2)
> +
> +PUT_TAP_PROTOTYPES(4, sse4)
> +PUT_TAP_PROTOTYPES(8, sse4)
> +PUT_TAP_PROTOTYPES(4, avx2)
> +PUT_TAP_PROTOTYPES(8, avx2)
> +
> +#define bf(fn, bd,  opt) fn##_##bd##_##opt
> +#define BF(fn, bpc, opt) fn##_##bpc##bpc_##opt
> +
> +#define AVG_BPC_PROTOTYPES(bpc, opt)
>                            \
> +void BF(ff_vvc_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                             \
> +    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t
> height, intptr_t pixel_max);  \
> +void BF(ff_vvc_w_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                             \
> +    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t
> height,                       \
> +    intptr_t denom, intptr_t w0, intptr_t w1,  intptr_t o0, intptr_t o1,
> intptr_t pixel_max);
> +
> +#define AVG_PROTOTYPES(bd, opt)
>                             \
> +void bf(ff_vvc_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                            \
> +    const int16_t *src0, const int16_t *src1, int width, int height);
>                             \
> +void bf(ff_vvc_w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                            \
> +    const int16_t *src0, const int16_t *src1, int width, int height,
>                            \
> +    int denom, int w0, int w1, int o0, int o1);
> +
> +AVG_BPC_PROTOTYPES( 8, avx2)
> +AVG_BPC_PROTOTYPES(16, avx2)
> +
> +AVG_PROTOTYPES( 8, avx2)
> +AVG_PROTOTYPES(10, avx2)
> +AVG_PROTOTYPES(12, avx2)
> +
>  #if ARCH_X86_64
> +#if HAVE_SSE4_EXTERNAL
>  #define FW_PUT(name, depth, opt) \
> -static void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst,
> const uint8_t *src, ptrdiff_t srcstride, \
> +void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const
> uint8_t *src, ptrdiff_t srcstride,        \
>                                                   int height, const int8_t
> *hf, const int8_t *vf, int width)    \
>  {
>                                       \
>      ff_h2656_put_## name ## _ ## depth ## _##opt(dst, 2 * MAX_PB_SIZE,
> src, srcstride, height, hf, vf, width); \
> @@ -69,7 +127,9 @@ static void ff_vvc_put_ ## name ## _ ## depth ##
> _##opt(int16_t *dst, const uint
>  FW_PUT_SSE4( 8)
>  FW_PUT_SSE4(10)
>  FW_PUT_SSE4(12)
> +#endif
>
> +#if HAVE_AVX2_EXTERNAL
>  #define FW_PUT_TAP_AVX2(n, bitd)        \
>      FW_PUT(n ## tap_h32,   bitd, avx2)  \
>      FW_PUT(n ## tap_h64,   bitd, avx2)  \
> @@ -105,6 +165,25 @@ FW_PUT_AVX2(12)
>  FW_PUT_16BPC_AVX2(10)
>  FW_PUT_16BPC_AVX2(12)
>
> +#define AVG_FUNCS(bpc, bd, opt)
>                            \
> +void bf(ff_vvc_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                           \
> +    const int16_t *src0, const int16_t *src1, int width, int height)
>                           \
> +{
>                            \
> +    BF(ff_vvc_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height,
> (1 << bd)  - 1);           \
> +}
>                            \
> +void bf(ff_vvc_w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                           \
> +    const int16_t *src0, const int16_t *src1, int width, int height,
>                           \
> +    int denom, int w0, int w1, int o0, int o1)
>                           \
> +{
>                            \
> +    BF(ff_vvc_w_avg, bpc, opt)(dst, dst_stride, src0, src1, width,
> height,                          \
> +        denom, w0, w1, o0, o1, (1 << bd)  - 1);
>                            \
> +}
> +
> +AVG_FUNCS(8,  8,  avx2)
> +AVG_FUNCS(16, 10, avx2)
> +AVG_FUNCS(16, 12, avx2)
> +#endif
> +
>  #define PEL_LINK(dst, C, W, idx1, idx2, name, D, opt)
>           \
>      dst[C][W][idx1][idx2] = ff_vvc_put_## name ## _ ## D ## _##opt;
>           \
>      dst ## _uni[C][W][idx1][idx2] = ff_h2656_put_uni_ ## name ## _ ## D
> ## _##opt; \
> @@ -170,40 +249,10 @@ FW_PUT_16BPC_AVX2(12)
>      MC_TAP_LINKS_16BPC_AVX2(LUMA,   8, bd);                          \
>      MC_TAP_LINKS_16BPC_AVX2(CHROMA, 4, bd);
>
> -#define bf(fn, bd,  opt) fn##_##bd##_##opt
> -#define BF(fn, bpc, opt) fn##_##bpc##bpc_##opt
> -
> -#define AVG_BPC_FUNC(bpc, opt)
>                           \
> -void BF(ff_vvc_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                            \
> -    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t
> height, intptr_t pixel_max); \
> -void BF(ff_vvc_w_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                            \
> -    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t
> height,                      \
> -    intptr_t denom, intptr_t w0, intptr_t w1,  intptr_t o0, intptr_t o1,
> intptr_t pixel_max);
> -
> -#define AVG_FUNCS(bpc, bd, opt)
>                            \
> -static void bf(avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                           \
> -    const int16_t *src0, const int16_t *src1, int width, int height)
>                           \
> -{
>                            \
> -    BF(ff_vvc_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height,
> (1 << bd)  - 1);           \
> -}
>                            \
> -static void bf(w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,
>                           \
> -    const int16_t *src0, const int16_t *src1, int width, int height,
>                           \
> -    int denom, int w0, int w1, int o0, int o1)
>                           \
> -{
>                            \
> -    BF(ff_vvc_w_avg, bpc, opt)(dst, dst_stride, src0, src1, width,
> height,                          \
> -        denom, w0, w1, o0, o1, (1 << bd)  - 1);
>                            \
> -}
> -
> -AVG_BPC_FUNC(8,   avx2)
> -AVG_BPC_FUNC(16,  avx2)
> -
> -AVG_FUNCS(8,  8,  avx2)
> -AVG_FUNCS(16, 10, avx2)
> -AVG_FUNCS(16, 12, avx2)
>
>  #define AVG_INIT(bd, opt) do {                                          \
> -    c->inter.avg    = bf(avg, bd, opt);                                 \
> -    c->inter.w_avg  = bf(w_avg, bd, opt);                               \
> +    c->inter.avg    = bf(ff_vvc_avg, bd, opt);                          \
> +    c->inter.w_avg  = bf(ff_vvc_w_avg, bd, opt);                        \
>
Why change the function scope to fix a compilation issue?

>  } while (0)
>  #endif
>
> --
> 2.33.0.windows.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
Wu Jianhua April 15, 2024, 5:47 p.m. UTC | #2
> 发件人: Nuo Mi <nuomi2021@gmail.com>
> 发送时间: 2024年3月3日 6:49
> 收件人: FFmpeg development discussions and patches
> 抄送: Wu Jianhua
> 主题: Re: [FFmpeg-devel] [PATCH] avcodec/x86/vvc/vvcdsp_init: fix linking error when configuring with --disable-> > ssse3 --disable-optimizations options
> 
> Thank you, Jianhua.
> This patch mixes many things.
> Could you help split it into smaller, more atomic patches?
> For example, one for moving code blocks and another for fixing --disable-ssse3.
> 

Sure. I sent the v2.

>  #define AVG_INIT(bd, opt) do {                                          \
> -    c->inter.avg    = bf(avg, bd, opt);                                 \
> -    c->inter.w_avg  = bf(w_avg, bd, opt);                               \
> +    c->inter.avg    = bf(ff_vvc_avg, bd, opt);                          \
> +    c->inter.w_avg  = bf(ff_vvc_w_avg, bd, opt);                        \
> Why change the function scope to fix a compilation issue?

I use the same way that adds prototypes for the functions as HEVC DSP. Hence, the functions
cannot be declared with static and need the prefix to avoid naming conflict.
diff mbox series

Patch

diff --git a/libavcodec/x86/vvc/vvcdsp_init.c b/libavcodec/x86/vvc/vvcdsp_init.c
index 0d2c683f0f..9ae84bda48 100644
--- a/libavcodec/x86/vvc/vvcdsp_init.c
+++ b/libavcodec/x86/vvc/vvcdsp_init.c
@@ -31,9 +31,67 @@ 
 #include "libavcodec/vvc/vvcdsp.h"
 #include "libavcodec/x86/h26x/h2656dsp.h"
 
+#define PUT_PROTOTYPE(name, depth, opt) \
+void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, int height, const int8_t *hf, const int8_t *vf, int width);
+
+#define PUT_PROTOTYPES(name, bitd, opt) \
+        PUT_PROTOTYPE(name##2,   bitd, opt) \
+        PUT_PROTOTYPE(name##4,   bitd, opt) \
+        PUT_PROTOTYPE(name##8,   bitd, opt) \
+        PUT_PROTOTYPE(name##12,  bitd, opt) \
+        PUT_PROTOTYPE(name##16,  bitd, opt) \
+        PUT_PROTOTYPE(name##24,  bitd, opt) \
+        PUT_PROTOTYPE(name##32,  bitd, opt) \
+        PUT_PROTOTYPE(name##48,  bitd, opt) \
+        PUT_PROTOTYPE(name##64,  bitd, opt) \
+        PUT_PROTOTYPE(name##128, bitd, opt)
+
+#define PUT_BPC_PROTOTYPES(name, opt) \
+    PUT_PROTOTYPES(name,  8, opt)     \
+    PUT_PROTOTYPES(name, 10, opt)     \
+    PUT_PROTOTYPES(name, 12, opt)
+
+#define PUT_TAP_PROTOTYPES(n, opt) \
+    PUT_BPC_PROTOTYPES(n##tap_h,  opt) \
+    PUT_BPC_PROTOTYPES(n##tap_v,  opt) \
+    PUT_BPC_PROTOTYPES(n##tap_hv, opt)
+
+PUT_BPC_PROTOTYPES(pixels, sse4)
+PUT_BPC_PROTOTYPES(pixels, avx2)
+
+PUT_TAP_PROTOTYPES(4, sse4)
+PUT_TAP_PROTOTYPES(8, sse4)
+PUT_TAP_PROTOTYPES(4, avx2)
+PUT_TAP_PROTOTYPES(8, avx2)
+
+#define bf(fn, bd,  opt) fn##_##bd##_##opt
+#define BF(fn, bpc, opt) fn##_##bpc##bpc_##opt
+
+#define AVG_BPC_PROTOTYPES(bpc, opt)                                                                 \
+void BF(ff_vvc_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                    \
+    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height, intptr_t pixel_max);  \
+void BF(ff_vvc_w_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                  \
+    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height,                       \
+    intptr_t denom, intptr_t w0, intptr_t w1,  intptr_t o0, intptr_t o1, intptr_t pixel_max);
+
+#define AVG_PROTOTYPES(bd, opt)                                                                      \
+void bf(ff_vvc_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                     \
+    const int16_t *src0, const int16_t *src1, int width, int height);                                \
+void bf(ff_vvc_w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                   \
+    const int16_t *src0, const int16_t *src1, int width, int height,                                 \
+    int denom, int w0, int w1, int o0, int o1);
+
+AVG_BPC_PROTOTYPES( 8, avx2)
+AVG_BPC_PROTOTYPES(16, avx2)
+
+AVG_PROTOTYPES( 8, avx2)
+AVG_PROTOTYPES(10, avx2)
+AVG_PROTOTYPES(12, avx2)
+
 #if ARCH_X86_64
+#if HAVE_SSE4_EXTERNAL
 #define FW_PUT(name, depth, opt) \
-static void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, \
+void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride,        \
                                                  int height, const int8_t *hf, const int8_t *vf, int width)    \
 {                                                                                                              \
     ff_h2656_put_## name ## _ ## depth ## _##opt(dst, 2 * MAX_PB_SIZE, src, srcstride, height, hf, vf, width); \
@@ -69,7 +127,9 @@  static void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const uint
 FW_PUT_SSE4( 8)
 FW_PUT_SSE4(10)
 FW_PUT_SSE4(12)
+#endif
 
+#if HAVE_AVX2_EXTERNAL
 #define FW_PUT_TAP_AVX2(n, bitd)        \
     FW_PUT(n ## tap_h32,   bitd, avx2)  \
     FW_PUT(n ## tap_h64,   bitd, avx2)  \
@@ -105,6 +165,25 @@  FW_PUT_AVX2(12)
 FW_PUT_16BPC_AVX2(10)
 FW_PUT_16BPC_AVX2(12)
 
+#define AVG_FUNCS(bpc, bd, opt)                                                                     \
+void bf(ff_vvc_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                    \
+    const int16_t *src0, const int16_t *src1, int width, int height)                                \
+{                                                                                                   \
+    BF(ff_vvc_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height, (1 << bd)  - 1);           \
+}                                                                                                   \
+void bf(ff_vvc_w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                  \
+    const int16_t *src0, const int16_t *src1, int width, int height,                                \
+    int denom, int w0, int w1, int o0, int o1)                                                      \
+{                                                                                                   \
+    BF(ff_vvc_w_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height,                          \
+        denom, w0, w1, o0, o1, (1 << bd)  - 1);                                                     \
+}
+
+AVG_FUNCS(8,  8,  avx2)
+AVG_FUNCS(16, 10, avx2)
+AVG_FUNCS(16, 12, avx2)
+#endif
+
 #define PEL_LINK(dst, C, W, idx1, idx2, name, D, opt)                              \
     dst[C][W][idx1][idx2] = ff_vvc_put_## name ## _ ## D ## _##opt;                \
     dst ## _uni[C][W][idx1][idx2] = ff_h2656_put_uni_ ## name ## _ ## D ## _##opt; \
@@ -170,40 +249,10 @@  FW_PUT_16BPC_AVX2(12)
     MC_TAP_LINKS_16BPC_AVX2(LUMA,   8, bd);                          \
     MC_TAP_LINKS_16BPC_AVX2(CHROMA, 4, bd);
 
-#define bf(fn, bd,  opt) fn##_##bd##_##opt
-#define BF(fn, bpc, opt) fn##_##bpc##bpc_##opt
-
-#define AVG_BPC_FUNC(bpc, opt)                                                                      \
-void BF(ff_vvc_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                   \
-    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height, intptr_t pixel_max); \
-void BF(ff_vvc_w_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                 \
-    const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height,                      \
-    intptr_t denom, intptr_t w0, intptr_t w1,  intptr_t o0, intptr_t o1, intptr_t pixel_max);
-
-#define AVG_FUNCS(bpc, bd, opt)                                                                     \
-static void bf(avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                    \
-    const int16_t *src0, const int16_t *src1, int width, int height)                                \
-{                                                                                                   \
-    BF(ff_vvc_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height, (1 << bd)  - 1);           \
-}                                                                                                   \
-static void bf(w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride,                                  \
-    const int16_t *src0, const int16_t *src1, int width, int height,                                \
-    int denom, int w0, int w1, int o0, int o1)                                                      \
-{                                                                                                   \
-    BF(ff_vvc_w_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height,                          \
-        denom, w0, w1, o0, o1, (1 << bd)  - 1);                                                     \
-}
-
-AVG_BPC_FUNC(8,   avx2)
-AVG_BPC_FUNC(16,  avx2)
-
-AVG_FUNCS(8,  8,  avx2)
-AVG_FUNCS(16, 10, avx2)
-AVG_FUNCS(16, 12, avx2)
 
 #define AVG_INIT(bd, opt) do {                                          \
-    c->inter.avg    = bf(avg, bd, opt);                                 \
-    c->inter.w_avg  = bf(w_avg, bd, opt);                               \
+    c->inter.avg    = bf(ff_vvc_avg, bd, opt);                          \
+    c->inter.w_avg  = bf(ff_vvc_w_avg, bd, opt);                        \
 } while (0)
 #endif