]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/mpegaudiodsp: Make ff_mpadsp_init() thread-safe
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Sun, 15 Nov 2020 15:01:49 +0000 (16:01 +0100)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Tue, 24 Nov 2020 10:35:03 +0000 (11:35 +0100)
The only thing missing for this is to make ff_mpadsp_init_x86()
thread-safe; it currently isn't because a static table is initialized
every time ff_mpadsp_init() is called (when ARCH_X86 is true). Solve
this by initializing this table only once, namely together with the
ordinary not-arch specific tables. This also allows to reuse their AVOnce.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavcodec/mpegaudiodsp.c
libavcodec/mpegaudiodsp.h
libavcodec/x86/mpegaudiodsp.c

index 0a14ff549ec208f4a729edc4d5a2a960198db3e3..f03e24464467937a214011f34fc604b5b205488a 100644 (file)
@@ -73,6 +73,9 @@ static av_cold void mpadsp_init_tabs(void)
             ff_mdct_win_fixed[j + 4][i + 1] = -ff_mdct_win_fixed[j][i + 1];
         }
     }
+
+    if (ARCH_X86)
+        ff_mpadsp_init_x86_tabs();
 }
 
 av_cold void ff_mpadsp_init(MPADSPContext *s)
index 28dcec576ce06997c86cb90dfb75d27f278be73c..4c9b05ebacbbfdbcc09cdcd9d7517f0b0c95e558 100644 (file)
@@ -63,6 +63,7 @@ void ff_mpadsp_init_aarch64(MPADSPContext *s);
 void ff_mpadsp_init_arm(MPADSPContext *s);
 void ff_mpadsp_init_ppc(MPADSPContext *s);
 void ff_mpadsp_init_x86(MPADSPContext *s);
+void ff_mpadsp_init_x86_tabs(void);
 void ff_mpadsp_init_mipsfpu(MPADSPContext *s);
 void ff_mpadsp_init_mipsdsp(MPADSPContext *s);
 
index f46a5c4f3d3980ea1f2e74a8e85e215fc8d5acff..d646c6dbcbf40b4e570726b7176e79fe393f78ca 100644 (file)
@@ -239,10 +239,8 @@ DECL_IMDCT_BLOCKS(avx,avx)
 #endif
 #endif /* HAVE_X86ASM */
 
-av_cold void ff_mpadsp_init_x86(MPADSPContext *s)
+av_cold void ff_mpadsp_init_x86_tabs(void)
 {
-    av_unused int cpu_flags = av_get_cpu_flags();
-
     int i, j;
     for (j = 0; j < 4; j++) {
         for (i = 0; i < 40; i ++) {
@@ -256,6 +254,11 @@ av_cold void ff_mpadsp_init_x86(MPADSPContext *s)
             mdct_win_sse[1][j][4*i + 3] = ff_mdct_win_float[j + 4][i];
         }
     }
+}
+
+av_cold void ff_mpadsp_init_x86(MPADSPContext *s)
+{
+    av_unused int cpu_flags = av_get_cpu_flags();
 
 #if HAVE_6REGS && HAVE_SSE_INLINE
     if (INLINE_SSE(cpu_flags)) {