avcodec/motionpixels: Make decoder init-threadsafe

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-11-17 10:50:01 +01:00
parent cc18bcdd52
commit af7acbb4b8
2 changed files with 11 additions and 4 deletions

View File

@ -19,6 +19,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "libavutil/thread.h"
#include "config.h"
#include "avcodec.h" #include "avcodec.h"
#include "get_bits.h" #include "get_bits.h"
#include "bswapdsp.h" #include "bswapdsp.h"
@ -65,6 +69,7 @@ static av_cold int mp_decode_end(AVCodecContext *avctx)
static av_cold int mp_decode_init(AVCodecContext *avctx) static av_cold int mp_decode_init(AVCodecContext *avctx)
{ {
av_unused static AVOnce init_static_once = AV_ONCE_INIT;
MotionPixelsContext *mp = avctx->priv_data; MotionPixelsContext *mp = avctx->priv_data;
int w4 = (avctx->width + 3) & ~3; int w4 = (avctx->width + 3) & ~3;
int h4 = (avctx->height + 3) & ~3; int h4 = (avctx->height + 3) & ~3;
@ -74,7 +79,6 @@ static av_cold int mp_decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
motionpixels_tableinit();
mp->avctx = avctx; mp->avctx = avctx;
ff_bswapdsp_init(&mp->bdsp); ff_bswapdsp_init(&mp->bdsp);
mp->changes_map = av_mallocz_array(avctx->width, h4); mp->changes_map = av_mallocz_array(avctx->width, h4);
@ -89,6 +93,10 @@ static av_cold int mp_decode_init(AVCodecContext *avctx)
if (!mp->frame) if (!mp->frame)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
#if !CONFIG_HARDCODED_TABLES
ff_thread_once(&init_static_once, motionpixels_tableinit);
#endif
return 0; return 0;
} }
@ -348,5 +356,5 @@ AVCodec ff_motionpixels_decoder = {
.close = mp_decode_end, .close = mp_decode_end,
.decode = mp_decode_frame, .decode = mp_decode_frame,
.capabilities = AV_CODEC_CAP_DR1, .capabilities = AV_CODEC_CAP_DR1,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_INIT_THREADSAFE,
}; };

View File

@ -84,8 +84,7 @@ static av_cold void mp_build_rgb_yuv_table(YuvPixel *p)
static av_cold void motionpixels_tableinit(void) static av_cold void motionpixels_tableinit(void)
{ {
if (!mp_rgb_yuv_table[0].u) mp_build_rgb_yuv_table(mp_rgb_yuv_table);
mp_build_rgb_yuv_table(mp_rgb_yuv_table);
} }
#endif /* CONFIG_HARDCODED_TABLES */ #endif /* CONFIG_HARDCODED_TABLES */