diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-12-09 13:13:33 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2021-01-25 14:52:51 +0100 |
commit | 18e89b964cd226785ca647e521ab09e16026fd26 (patch) | |
tree | 95f849e65650c3d0aa5c56741653333770ac6d79 /libavcodec/h261enc.c | |
parent | 41826f84bb2f2cb4a92de97c0d1c9cb57737c2cb (diff) |
avcodec/h261enc: Make encoder init-threadsafe
This is easy now that the H.261 encoder is the only user that
initializes the non-VLC parts of ff_h261_rl_tcoeff.
Reviewed-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavcodec/h261enc.c')
-rw-r--r-- | libavcodec/h261enc.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c index 8d5d62b786..eec526c500 100644 --- a/libavcodec/h261enc.c +++ b/libavcodec/h261enc.c @@ -27,6 +27,7 @@ #include "libavutil/attributes.h" #include "libavutil/avassert.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "mpegutils.h" #include "mpegvideo.h" @@ -361,9 +362,17 @@ static av_cold void init_uni_h261_rl_tab(const RLTable *rl, uint8_t *len_tab) } } +static av_cold void h261_encode_init_static(void) +{ + static uint8_t h261_rl_table_store[2][2 * MAX_RUN + MAX_LEVEL + 3]; + + ff_rl_init(&ff_h261_rl_tcoeff, h261_rl_table_store); + init_uni_h261_rl_tab(&ff_h261_rl_tcoeff, uni_h261_rl_len); +} + av_cold void ff_h261_encode_init(MpegEncContext *s) { - ff_h261_common_init(); + static AVOnce init_static_once = AV_ONCE_INIT; s->min_qcoeff = -127; s->max_qcoeff = 127; @@ -371,10 +380,9 @@ av_cold void ff_h261_encode_init(MpegEncContext *s) s->c_dc_scale_table = ff_mpeg1_dc_scale_table; s->ac_esc_length = 6+6+8; - init_uni_h261_rl_tab(&ff_h261_rl_tcoeff, uni_h261_rl_len); - s->intra_ac_vlc_length = s->inter_ac_vlc_length = uni_h261_rl_len; s->intra_ac_vlc_last_length = s->inter_ac_vlc_last_length = uni_h261_rl_len + 128*64; + ff_thread_once(&init_static_once, h261_encode_init_static); } static const AVClass h261_class = { @@ -393,7 +401,7 @@ AVCodec ff_h261_encoder = { .init = ff_mpv_encode_init, .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .priv_class = &h261_class, |