diff mbox series

[FFmpeg-devel,33/39] avcodec/msmpeg4: Factor out common RLTable initialization code

Message ID 20201210111657.2276739-34-andreas.rheinhardt@gmail.com
State Accepted
Commit 1d5d666601b6dc9319f8a539c40d016e3aef932e
Headers show
Series Make mpegvideo encoders init-threadsafe
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished

Commit Message

Andreas Rheinhardt Dec. 10, 2020, 11:16 a.m. UTC
Up until now, both the msmpeg4 decoders and encoders initialized several
RLTables common to them (the decoders also initialized the VLCs of these
RLTables). This is an obstacle to making these codecs init-threadsafe.
So move this initialization to ff_msmpeg4_common_init() that already
contains this initialization code. This allows to reuse the AVOnce used
for initializing ff_v2_dc_lum/chroma_table which automatically makes
initializing these RLTables thread-safe.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavcodec/msmpeg4.c     | 12 +++++++++++-
 libavcodec/msmpeg4data.c |  1 -
 libavcodec/msmpeg4data.h |  1 -
 libavcodec/msmpeg4dec.c  |  5 +----
 libavcodec/msmpeg4enc.c  |  3 ---
 5 files changed, 12 insertions(+), 10 deletions(-)

Comments

Anton Khirnov April 17, 2021, 2:31 p.m. UTC | #1
Quoting Andreas Rheinhardt (2020-12-10 12:16:51)
> Up until now, both the msmpeg4 decoders and encoders initialized several
> RLTables common to them (the decoders also initialized the VLCs of these
> RLTables). This is an obstacle to making these codecs init-threadsafe.
> So move this initialization to ff_msmpeg4_common_init() that already
> contains this initialization code. This allows to reuse the AVOnce used
> for initializing ff_v2_dc_lum/chroma_table which automatically makes
> initializing these RLTables thread-safe.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavcodec/msmpeg4.c     | 12 +++++++++++-
>  libavcodec/msmpeg4data.c |  1 -
>  libavcodec/msmpeg4data.h |  1 -
>  libavcodec/msmpeg4dec.c  |  5 +----
>  libavcodec/msmpeg4enc.c  |  3 ---
>  5 files changed, 12 insertions(+), 10 deletions(-)

LGTM
diff mbox series

Patch

diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c
index 93b6e4bbbb..91581dcfe2 100644
--- a/libavcodec/msmpeg4.c
+++ b/libavcodec/msmpeg4.c
@@ -104,6 +104,16 @@  static av_cold void init_h263_dc_for_msmpeg4(void)
     }
 }
 
+static av_cold void msmpeg4_common_init_static(void)
+{
+    static uint8_t rl_table_store[NB_RL_TABLES][2][2 * MAX_RUN + MAX_LEVEL + 3];
+
+    for (int i = 0; i < NB_RL_TABLES; i++)
+        ff_rl_init(&ff_rl_table[i], rl_table_store[i]);
+
+    init_h263_dc_for_msmpeg4();
+}
+
 av_cold void ff_msmpeg4_common_init(MpegEncContext *s)
 {
     static AVOnce init_static_once = AV_ONCE_INIT;
@@ -146,7 +156,7 @@  av_cold void ff_msmpeg4_common_init(MpegEncContext *s)
     }
     //Note the default tables are set in common_init in mpegvideo.c
 
-    ff_thread_once(&init_static_once, init_h263_dc_for_msmpeg4);
+    ff_thread_once(&init_static_once, msmpeg4_common_init_static);
 }
 
 /* predict coded block */
diff --git a/libavcodec/msmpeg4data.c b/libavcodec/msmpeg4data.c
index b9c1d8ec0b..adfccb7977 100644
--- a/libavcodec/msmpeg4data.c
+++ b/libavcodec/msmpeg4data.c
@@ -33,7 +33,6 @@ 
 
 uint32_t ff_v2_dc_lum_table[512][2];
 uint32_t ff_v2_dc_chroma_table[512][2];
-uint8_t  ff_static_rl_table_store[NB_RL_TABLES][2][2 * MAX_RUN + MAX_LEVEL + 3];
 
 VLC ff_msmp4_mb_i_vlc;
 VLC ff_msmp4_dc_luma_vlc[2];
diff --git a/libavcodec/msmpeg4data.h b/libavcodec/msmpeg4data.h
index 02199d0123..95d009aaa7 100644
--- a/libavcodec/msmpeg4data.h
+++ b/libavcodec/msmpeg4data.h
@@ -60,7 +60,6 @@  extern const uint8_t ff_wmv1_scantable[WMV1_SCANTABLE_COUNT][64];
 #define NB_RL_TABLES  6
 
 extern RLTable ff_rl_table[NB_RL_TABLES];
-extern uint8_t ff_static_rl_table_store[NB_RL_TABLES][2][2 * MAX_RUN + MAX_LEVEL + 3];
 
 extern uint32_t ff_v2_dc_lum_table[512][2];
 extern uint32_t ff_v2_dc_chroma_table[512][2];
diff --git a/libavcodec/msmpeg4dec.c b/libavcodec/msmpeg4dec.c
index d059e8eecc..f2779b8fdd 100644
--- a/libavcodec/msmpeg4dec.c
+++ b/libavcodec/msmpeg4dec.c
@@ -300,7 +300,7 @@  av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
 {
     MpegEncContext *s = avctx->priv_data;
     static volatile int done = 0;
-    int i, ret;
+    int ret;
     MVTable *mv;
 
     if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
@@ -312,9 +312,6 @@  av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
     ff_msmpeg4_common_init(s);
 
     if (!done) {
-        for(i=0;i<NB_RL_TABLES;i++) {
-            ff_rl_init(&ff_rl_table[i], ff_static_rl_table_store[i]);
-        }
         INIT_FIRST_VLC_RL(ff_rl_table[0], 642);
         INIT_FIRST_VLC_RL(ff_rl_table[1], 1104);
         INIT_FIRST_VLC_RL(ff_rl_table[2], 554);
diff --git a/libavcodec/msmpeg4enc.c b/libavcodec/msmpeg4enc.c
index 7a3858b966..6d9911c2fb 100644
--- a/libavcodec/msmpeg4enc.c
+++ b/libavcodec/msmpeg4enc.c
@@ -131,9 +131,6 @@  av_cold void ff_msmpeg4_encode_init(MpegEncContext *s)
         init_mv_table(&ff_mv_tables[0], mv_index_tables[0]);
         init_mv_table(&ff_mv_tables[1], mv_index_tables[1]);
 
-        for(i=0;i<NB_RL_TABLES;i++)
-            ff_rl_init(&ff_rl_table[i], ff_static_rl_table_store[i]);
-
         for(i=0; i<NB_RL_TABLES; i++){
             int level;
             for (level = 1; level <= MAX_LEVEL; level++) {