diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-12-02 03:26:41 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2021-01-25 14:52:58 +0100 |
commit | 61fe481586425a41d45e371de1e875b49882477d (patch) | |
tree | 04dbbd211420e71fea74a9b87807fd9d17ed8566 /libavcodec | |
parent | 12d0bb382b7f8f67981ec61aad1ce4f6840ab2dc (diff) | |
download | ffmpeg-61fe481586425a41d45e371de1e875b49882477d.tar.gz |
avcodec/h263data, ituh263*: Make initializing RL inter table thread-safe
Up until now, ff_h263_rl_inter was initialized by both ituh263dec and
ituh263enc; this is an obstacle in making the codecs that use this code
init-threadsafe.
This obstacle is eliminated by only initializing this RLTable from
a single place that is guarded by a dedicated AVOnce.
Reviewed-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/h263data.c | 16 | ||||
-rw-r--r-- | libavcodec/h263data.h | 2 | ||||
-rw-r--r-- | libavcodec/ituh263dec.c | 2 | ||||
-rw-r--r-- | libavcodec/ituh263enc.c | 5 |
4 files changed, 19 insertions, 6 deletions
diff --git a/libavcodec/h263data.c b/libavcodec/h263data.c index f649d58f4e..604a0425e1 100644 --- a/libavcodec/h263data.c +++ b/libavcodec/h263data.c @@ -25,11 +25,11 @@ #include <stdint.h> +#include "libavutil/thread.h" + #include "h263data.h" #include "mpegvideo.h" -uint8_t ff_h263_static_rl_table_store[2][2][2 * MAX_RUN + MAX_LEVEL + 3]; - /* intra MCBPC, mb_type = (intra), then (intraq) */ const uint8_t ff_h263_intra_MCBPC_code[9] = { 1, 1, 2, 3, 1, 1, 2, 3, 1 }; const uint8_t ff_h263_intra_MCBPC_bits[9] = { 1, 3, 3, 3, 4, 6, 6, 6, 9 }; @@ -290,3 +290,15 @@ const AVRational ff_h263_pixel_aspect[16] = { { 0, 1 }, { 0, 1 }, }; + +static av_cold void h263_init_rl_inter(void) +{ + static uint8_t h263_rl_inter_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; + ff_rl_init(&ff_h263_rl_inter, h263_rl_inter_table); +} + +av_cold void ff_h263_init_rl_inter(void) +{ + static AVOnce init_static_once = AV_ONCE_INIT; + ff_thread_once(&init_static_once, h263_init_rl_inter); +} diff --git a/libavcodec/h263data.h b/libavcodec/h263data.h index 3da0e3771f..144704d12b 100644 --- a/libavcodec/h263data.h +++ b/libavcodec/h263data.h @@ -61,7 +61,7 @@ extern const int8_t ff_inter_run[102]; extern RLTable ff_h263_rl_inter; extern RLTable ff_rl_intra_aic; -extern uint8_t ff_h263_static_rl_table_store[2][2][2 * MAX_RUN + MAX_LEVEL + 3]; +void ff_h263_init_rl_inter(void); extern const uint16_t ff_h263_format[8][2]; diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c index ce044af9b3..565a6a1ac8 100644 --- a/libavcodec/ituh263dec.c +++ b/libavcodec/ituh263dec.c @@ -122,7 +122,7 @@ av_cold void ff_h263_decode_init_vlc(void) INIT_VLC_STATIC(&ff_h263_mv_vlc, H263_MV_VLC_BITS, 33, &ff_mvtab[0][1], 2, 1, &ff_mvtab[0][0], 2, 1, 538); - ff_rl_init(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]); + ff_h263_init_rl_inter(); INIT_VLC_RL(ff_h263_rl_inter, 554); INIT_FIRST_VLC_RL(ff_rl_intra_aic, 554); INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c index e1debcf63b..43260e6984 100644 --- a/libavcodec/ituh263enc.c +++ b/libavcodec/ituh263enc.c @@ -759,10 +759,11 @@ av_cold void ff_h263_encode_init(MpegEncContext *s) static int done = 0; if (!done) { + static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; done = 1; - ff_rl_init(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]); - ff_rl_init(&ff_rl_intra_aic, ff_h263_static_rl_table_store[1]); + ff_rl_init(&ff_rl_intra_aic, rl_intra_table); + ff_h263_init_rl_inter(); init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len); init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len); |