]> git.sesse.net Git - vlc/commitdiff
avutil: vector and serialize CPU flags initialization
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 22 Feb 2014 17:03:22 +0000 (19:03 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 22 Feb 2014 17:07:39 +0000 (19:07 +0200)
av_set_cpu_flags_mask() is not thread-safe. So are the first call to
av_get_cpu_flags() after loading libavutil, and the first call to
av_get_cpu_flags() after a call to av_set_cpu_flags_mask(). So call
those under the avcodec lock during initialization.

modules/codec/avcodec/avcodec.c
modules/codec/avcodec/avcommon.h
modules/codec/avcodec/encoder.c

index 9ce9221fc50cf6da317f98e12610f3f83aeeeada..956c72b5c6789f29d9e96ba60753c834be865f2b 100644 (file)
@@ -302,9 +302,7 @@ static int OpenDecoder( vlc_object_t *p_this )
     p_context->opaque = (void *)p_this;
 
     /* set CPU capabilities */
-#if LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
-    av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
-#else
+#if !LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
     p_context->dsp_mask = GetVlcDspMask();
 #endif
 
index 3d64f5329162373673f5855d1aa0fcc1c4b380cd..c147cba84ffa501d539d896e143f1b9d83fe3d3e 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "avcommon_compat.h"
 
+unsigned GetVlcDspMask(void);
 
 #ifdef HAVE_LIBAVUTIL_AVUTIL_H
 # include <libavutil/avutil.h>
@@ -81,24 +82,23 @@ static inline void vlc_init_avutil(vlc_object_t *obj)
     }
 
     av_log_set_level(level);
+
+#if LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
+    av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
+#endif
+    av_get_cpu_flags();
 }
 #endif
 
-unsigned GetVlcDspMask( void );
-
 #ifdef HAVE_LIBAVFORMAT_AVFORMAT_H
 # include <libavformat/avformat.h>
 static inline void vlc_init_avformat(vlc_object_t *obj)
 {
     vlc_avcodec_lock();
 
-    avformat_network_init();
-
     vlc_init_avutil(obj);
 
-#if LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
-    av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
-#endif
+    avformat_network_init();
 
     av_register_all();
 
index 31bcd280fb823cb2c30acf59003b8621b65fb6b3..aa2435a3918750fba38fdea9e69f912ee40f937c 100644 (file)
@@ -317,9 +317,7 @@ int OpenEncoder( vlc_object_t *p_this )
     p_context->opaque = (void *)p_this;
 
     /* set CPU capabilities */
-#if LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
-    av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
-#else
+#if !LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
     p_context->dsp_mask = GetVlcDspMask();
 #endif