]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mpeg12.c
avcodec/zmbvenc: Simplify setting keyframe flag
[ffmpeg] / libavcodec / mpeg12.c
index ab6c19c6151590026dd625f90cd608f4d97b679d..1aacd07e41501c8b4cddf5f2711dcdd9974368a2 100644 (file)
@@ -30,6 +30,7 @@
 #include "libavutil/attributes.h"
 #include "libavutil/avassert.h"
 #include "libavutil/timecode.h"
+#include "libavutil/thread.h"
 
 #include "internal.h"
 #include "avcodec.h"
@@ -41,8 +42,6 @@
 #include "bytestream.h"
 #include "thread.h"
 
-uint8_t ff_mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
-
 static const uint8_t table_mb_ptype[7][2] = {
     { 3, 5 }, // 0x01 MB_INTRA
     { 1, 2 }, // 0x02 MB_PAT
@@ -134,41 +133,39 @@ VLC ff_mb_ptype_vlc;
 VLC ff_mb_btype_vlc;
 VLC ff_mb_pat_vlc;
 
+static av_cold void mpeg12_init_vlcs(void)
+{
+    INIT_VLC_STATIC(&ff_dc_lum_vlc, DC_VLC_BITS, 12,
+                    ff_mpeg12_vlc_dc_lum_bits, 1, 1,
+                    ff_mpeg12_vlc_dc_lum_code, 2, 2, 512);
+    INIT_VLC_STATIC(&ff_dc_chroma_vlc,  DC_VLC_BITS, 12,
+                    ff_mpeg12_vlc_dc_chroma_bits, 1, 1,
+                    ff_mpeg12_vlc_dc_chroma_code, 2, 2, 514);
+    INIT_VLC_STATIC(&ff_mv_vlc, MV_VLC_BITS, 17,
+                    &ff_mpeg12_mbMotionVectorTable[0][1], 2, 1,
+                    &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 266);
+    INIT_VLC_STATIC(&ff_mbincr_vlc, MBINCR_VLC_BITS, 36,
+                    &ff_mpeg12_mbAddrIncrTable[0][1], 2, 1,
+                    &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 538);
+    INIT_VLC_STATIC(&ff_mb_pat_vlc, MB_PAT_VLC_BITS, 64,
+                    &ff_mpeg12_mbPatTable[0][1], 2, 1,
+                    &ff_mpeg12_mbPatTable[0][0], 2, 1, 512);
+
+    INIT_VLC_STATIC(&ff_mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7,
+                    &table_mb_ptype[0][1], 2, 1,
+                    &table_mb_ptype[0][0], 2, 1, 64);
+    INIT_VLC_STATIC(&ff_mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
+                    &table_mb_btype[0][1], 2, 1,
+                    &table_mb_btype[0][0], 2, 1, 64);
+
+    INIT_2D_VLC_RL(ff_rl_mpeg1, 680, 0);
+    INIT_2D_VLC_RL(ff_rl_mpeg2, 674, 0);
+}
+
 av_cold void ff_mpeg12_init_vlcs(void)
 {
-    static int done = 0;
-
-    if (!done) {
-        done = 1;
-
-        INIT_VLC_STATIC(&ff_dc_lum_vlc, DC_VLC_BITS, 12,
-                        ff_mpeg12_vlc_dc_lum_bits, 1, 1,
-                        ff_mpeg12_vlc_dc_lum_code, 2, 2, 512);
-        INIT_VLC_STATIC(&ff_dc_chroma_vlc,  DC_VLC_BITS, 12,
-                        ff_mpeg12_vlc_dc_chroma_bits, 1, 1,
-                        ff_mpeg12_vlc_dc_chroma_code, 2, 2, 514);
-        INIT_VLC_STATIC(&ff_mv_vlc, MV_VLC_BITS, 17,
-                        &ff_mpeg12_mbMotionVectorTable[0][1], 2, 1,
-                        &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 518);
-        INIT_VLC_STATIC(&ff_mbincr_vlc, MBINCR_VLC_BITS, 36,
-                        &ff_mpeg12_mbAddrIncrTable[0][1], 2, 1,
-                        &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 538);
-        INIT_VLC_STATIC(&ff_mb_pat_vlc, MB_PAT_VLC_BITS, 64,
-                        &ff_mpeg12_mbPatTable[0][1], 2, 1,
-                        &ff_mpeg12_mbPatTable[0][0], 2, 1, 512);
-
-        INIT_VLC_STATIC(&ff_mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7,
-                        &table_mb_ptype[0][1], 2, 1,
-                        &table_mb_ptype[0][0], 2, 1, 64);
-        INIT_VLC_STATIC(&ff_mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
-                        &table_mb_btype[0][1], 2, 1,
-                        &table_mb_btype[0][0], 2, 1, 64);
-        ff_rl_init(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]);
-        ff_rl_init(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]);
-
-        INIT_2D_VLC_RL(ff_rl_mpeg1, 680, 0);
-        INIT_2D_VLC_RL(ff_rl_mpeg2, 674, 0);
-    }
+    static AVOnce init_static_once = AV_ONCE_INIT;
+    ff_thread_once(&init_static_once, mpeg12_init_vlcs);
 }
 
 /**