diff mbox series

[FFmpeg-devel,v2,09/19] swscale/internal: use static_assert for enforcing offsets

Message ID 20241014134354.180848-10-ffmpeg@haasn.xyz
State New
Headers show
Series swscale: major refactoring and new API | expand

Checks

Context Check Description
yinshiyou/configure_loongarch64 warning Failed to apply patch

Commit Message

Niklas Haas Oct. 14, 2024, 1:37 p.m. UTC
From: Niklas Haas <git@haasn.dev>

Instead of sprinkling av_assert0 into random init functions.

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Niklas Haas <git@haasn.dev>
---
 libswscale/swscale_internal.h | 11 +++++++++++
 libswscale/utils.c            |  3 ++-
 libswscale/x86/swscale.c      |  4 ----
 3 files changed, 13 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 1817815b01..bdcbfc8ffb 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -22,6 +22,7 @@ 
 #define SWSCALE_SWSCALE_INTERNAL_H
 
 #include <stdatomic.h>
+#include <assert.h>
 
 #include "config.h"
 #include "swscale.h"
@@ -704,6 +705,16 @@  struct SwsInternal {
 };
 //FIXME check init (where 0)
 
+static_assert(offsetof(SwsInternal, redDither) + DITHER32_INT == offsetof(SwsInternal, dither32),
+              "dither32 must be at the same offset as redDither + DITHER32_INT");
+
+#if ARCH_X86
+/* x86 yuv2gbrp uses the SwsInternal for yuv coefficients
+   if struct offsets change the asm needs to be updated too */
+static_assert(offsetof(SwsInternal, yuv2rgb_y_offset) == 40292,
+              "yuv2rgb_y_offset must be updated in x86 asm");
+#endif
+
 SwsFunc ff_yuv2rgb_get_func_ptr(SwsInternal *c);
 int ff_yuv2rgb_c_init_tables(SwsInternal *c, const int inv_table[4],
                              int fullRange, int brightness,
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 04ac546de3..8b9589f7f5 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -1227,7 +1227,8 @@  SwsContext *sws_alloc_context(void)
 {
     SwsInternal *c = av_mallocz(sizeof(SwsInternal));
 
-    av_assert0(offsetof(SwsInternal, redDither) + DITHER32_INT == offsetof(SwsInternal, dither32));
+    static_assert(offsetof(SwsInternal, redDither) + DITHER32_INT == offsetof(SwsInternal, dither32),
+                  "dither32 must be at the same offset as redDither + DITHER32_INT");
 
     if (c) {
         c->av_class = &ff_sws_context_class;
diff --git a/libswscale/x86/swscale.c b/libswscale/x86/swscale.c
index 16182124c0..48f0aea3f2 100644
--- a/libswscale/x86/swscale.c
+++ b/libswscale/x86/swscale.c
@@ -792,10 +792,6 @@  switch(c->dstBpc){ \
 
     if(c->flags & SWS_FULL_CHR_H_INT) {
 
-        /* yuv2gbrp uses the SwsInternal for yuv coefficients
-           if struct offsets change the asm needs to be updated too */
-        av_assert0(offsetof(SwsInternal, yuv2rgb_y_offset) == 40292);
-
 #define YUV2ANYX_FUNC_CASE(fmt, name, opt)              \
         case fmt:                                       \
             c->yuv2anyX = ff_yuv2##name##_full_X_##opt; \