diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-11-17 10:09:34 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-11-24 11:35:03 +0100 |
commit | e9d06fef62d811828cf49c4d0c383ddacc22884d (patch) | |
tree | ca52d8ac4cbe8895b9b43db0cec47870b0e7618c | |
parent | 1463f9edcbdff88fd44dfe3bc17386c6b0488036 (diff) | |
download | ffmpeg-e9d06fef62d811828cf49c4d0c383ddacc22884d.tar.gz |
avcodec/rv10: Make initializing static RV10 VLCs thread-safe
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r-- | libavcodec/rv10.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index e594160fea..3a487a6b3e 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -28,6 +28,7 @@ #include <inttypes.h> #include "libavutil/imgutils.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "error_resilience.h" @@ -463,11 +464,22 @@ static int rv20_decode_picture_header(RVDecContext *rv) return s->mb_width * s->mb_height - mb_pos; } +static av_cold void rv10_init_static(void) +{ + INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256, + rv_lum_bits, 1, 1, + rv_lum_code, 2, 2, 16384); + INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256, + rv_chrom_bits, 1, 1, + rv_chrom_code, 2, 2, 16388); + ff_h263_decode_init_vlc(); +} + static av_cold int rv10_decode_init(AVCodecContext *avctx) { + static AVOnce init_static_once = AV_ONCE_INIT; RVDecContext *rv = avctx->priv_data; MpegEncContext *s = &rv->m; - static int done = 0; int major_ver, minor_ver, micro_ver, ret; if (avctx->extradata_size < 8) { @@ -525,18 +537,9 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) return ret; ff_h263dsp_init(&s->h263dsp); - ff_h263_decode_init_vlc(); - /* init rv vlc */ - if (!done) { - INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256, - rv_lum_bits, 1, 1, - rv_lum_code, 2, 2, 16384); - INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256, - rv_chrom_bits, 1, 1, - rv_chrom_code, 2, 2, 16388); - done = 1; - } + /* init static VLCs */ + ff_thread_once(&init_static_once, rv10_init_static); return 0; } |