mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/motionpixels: Make decoder init-threadsafe
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
cc18bcdd52
commit
af7acbb4b8
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue