diff --git a/libavcodec/flvenc.c b/libavcodec/flvenc.c index b85e4667c4..9429862159 100644 --- a/libavcodec/flvenc.c +++ b/libavcodec/flvenc.c @@ -107,7 +107,7 @@ AVCodec ff_flv_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 = &flv_class, diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c index 43260e6984..79c8c9999e 100644 --- a/libavcodec/ituh263enc.c +++ b/libavcodec/ituh263enc.c @@ -30,6 +30,7 @@ #include #include "libavutil/attributes.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "mpegvideo.h" #include "mpegvideodata.h" @@ -671,7 +672,7 @@ void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code) } } -static av_cold void init_mv_penalty_and_fcode(MpegEncContext *s) +static av_cold void init_mv_penalty_and_fcode(void) { int f_code; int mv; @@ -754,22 +755,23 @@ static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab) } } +static av_cold void h263_encode_init_static(void) +{ + static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; + + 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); + + init_mv_penalty_and_fcode(); +} + av_cold void ff_h263_encode_init(MpegEncContext *s) { - static int done = 0; + static AVOnce init_static_once = AV_ONCE_INIT; - if (!done) { - static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; - done = 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); - - init_mv_penalty_and_fcode(s); - } s->me.mv_penalty= mv_penalty; // FIXME exact table for MSMPEG4 & H.263+ s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len; @@ -817,6 +819,8 @@ av_cold void ff_h263_encode_init(MpegEncContext *s) s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } + + ff_thread_once(&init_static_once, h263_encode_init_static); } void ff_h263_encode_mba(MpegEncContext *s) diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 7909a5630a..0d86c0a2cd 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -4738,7 +4738,7 @@ AVCodec ff_h263_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 = &h263_class, }; @@ -4774,7 +4774,7 @@ AVCodec ff_h263p_encoder = { .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, .capabilities = AV_CODEC_CAP_SLICE_THREADS, - .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 = &h263p_class, }; diff --git a/libavcodec/rv10enc.c b/libavcodec/rv10enc.c index 42316836c5..6add8e4dd1 100644 --- a/libavcodec/rv10enc.c +++ b/libavcodec/rv10enc.c @@ -79,7 +79,7 @@ AVCodec ff_rv10_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 = &rv10_class, }; diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c index d9d63d4d9c..95f90389bc 100644 --- a/libavcodec/rv20enc.c +++ b/libavcodec/rv20enc.c @@ -76,7 +76,7 @@ AVCodec ff_rv20_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 = &rv20_class, }; diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c index 2b74f009e0..b2a4d25d70 100644 --- a/libavcodec/svq1enc.c +++ b/libavcodec/svq1enc.c @@ -688,7 +688,7 @@ AVCodec ff_svq1_encoder = { .init = svq1_encode_init, .encode2 = svq1_encode_frame, .close = svq1_encode_end, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV410P, AV_PIX_FMT_NONE }, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, };