summaryrefslogtreecommitdiff
path: root/libavcodec/h261enc.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-12-09 13:13:33 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2021-01-25 14:52:51 +0100
commit18e89b964cd226785ca647e521ab09e16026fd26 (patch)
tree95f849e65650c3d0aa5c56741653333770ac6d79 /libavcodec/h261enc.c
parent41826f84bb2f2cb4a92de97c0d1c9cb57737c2cb (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.c16
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,