mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-05-29 21:47:48 +02:00
avcodec/snow: Use ff_thread_once() in ff_snow_common_init()
ff_snow_common_init() currently initializes static data every time it is invoked; given that both the Snow encoder and decoder have the FF_CODEC_CAP_INIT_THREADSAFE flag set, this can lead to data races (and therefore undefined behaviour) even though all threads write the same values. This commit fixes this by using ff_thread_once() for the initializations. Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
bdfe51b44f
commit
6a94afbd5b
@ -21,6 +21,7 @@
|
|||||||
#include "libavutil/intmath.h"
|
#include "libavutil/intmath.h"
|
||||||
#include "libavutil/log.h"
|
#include "libavutil/log.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
|
#include "libavutil/thread.h"
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "me_cmp.h"
|
#include "me_cmp.h"
|
||||||
#include "snow_dwt.h"
|
#include "snow_dwt.h"
|
||||||
@ -427,10 +428,19 @@ mca( 8, 0,8)
|
|||||||
mca( 0, 8,8)
|
mca( 0, 8,8)
|
||||||
mca( 8, 8,8)
|
mca( 8, 8,8)
|
||||||
|
|
||||||
|
static av_cold void snow_static_init(void)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_REF_FRAMES; i++)
|
||||||
|
for (int j = 0; j < MAX_REF_FRAMES; j++)
|
||||||
|
ff_scale_mv_ref[i][j] = 256 * (i + 1) / (j + 1);
|
||||||
|
init_qexp();
|
||||||
|
}
|
||||||
|
|
||||||
av_cold int ff_snow_common_init(AVCodecContext *avctx){
|
av_cold int ff_snow_common_init(AVCodecContext *avctx){
|
||||||
|
static AVOnce init_static_once = AV_ONCE_INIT;
|
||||||
SnowContext *s = avctx->priv_data;
|
SnowContext *s = avctx->priv_data;
|
||||||
int width, height;
|
int width, height;
|
||||||
int i, j;
|
int i;
|
||||||
|
|
||||||
s->avctx= avctx;
|
s->avctx= avctx;
|
||||||
s->max_ref_frames=1; //just make sure it's not an invalid value in case of no initial keyframe
|
s->max_ref_frames=1; //just make sure it's not an invalid value in case of no initial keyframe
|
||||||
@ -480,8 +490,6 @@ av_cold int ff_snow_common_init(AVCodecContext *avctx){
|
|||||||
mcfh(0, 8)
|
mcfh(0, 8)
|
||||||
mcfh(8, 8)
|
mcfh(8, 8)
|
||||||
|
|
||||||
init_qexp();
|
|
||||||
|
|
||||||
// dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
|
// dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
|
||||||
|
|
||||||
width= s->avctx->width;
|
width= s->avctx->width;
|
||||||
@ -495,8 +503,6 @@ av_cold int ff_snow_common_init(AVCodecContext *avctx){
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
for(i=0; i<MAX_REF_FRAMES; i++) {
|
for(i=0; i<MAX_REF_FRAMES; i++) {
|
||||||
for(j=0; j<MAX_REF_FRAMES; j++)
|
|
||||||
ff_scale_mv_ref[i][j] = 256*(i+1)/(j+1);
|
|
||||||
s->last_picture[i] = av_frame_alloc();
|
s->last_picture[i] = av_frame_alloc();
|
||||||
if (!s->last_picture[i])
|
if (!s->last_picture[i])
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
@ -507,6 +513,8 @@ av_cold int ff_snow_common_init(AVCodecContext *avctx){
|
|||||||
if (!s->mconly_picture || !s->current_picture)
|
if (!s->mconly_picture || !s->current_picture)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
ff_thread_once(&init_static_once, snow_static_init);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user