mirror of https://git.ffmpeg.org/ffmpeg.git
fftools/ffmpeg: use a mutex for enc_stats_write()
It may be called concurrently from different threads to write into the same file.
This commit is contained in:
parent
244d2fcc49
commit
2ad0b8e0ea
|
@ -480,6 +480,9 @@ typedef struct EncStats {
|
|||
int nb_components;
|
||||
|
||||
AVIOContext *io;
|
||||
|
||||
pthread_mutex_t lock;
|
||||
int lock_initialized;
|
||||
} EncStats;
|
||||
|
||||
extern const char *const forced_keyframes_const_names[];
|
||||
|
|
|
@ -491,6 +491,8 @@ void enc_stats_write(OutputStream *ost, EncStats *es,
|
|||
ptsi = fd->dec.pts;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&es->lock);
|
||||
|
||||
for (size_t i = 0; i < es->nb_components; i++) {
|
||||
const EncStatsComponent *c = &es->components[i];
|
||||
|
||||
|
@ -538,6 +540,8 @@ void enc_stats_write(OutputStream *ost, EncStats *es,
|
|||
}
|
||||
avio_w8(io, '\n');
|
||||
avio_flush(io);
|
||||
|
||||
pthread_mutex_unlock(&es->lock);
|
||||
}
|
||||
|
||||
static inline double psnr(double d)
|
||||
|
|
|
@ -778,6 +778,10 @@ static void enc_stats_uninit(EncStats *es)
|
|||
for (int i = 0; i < es->nb_components; i++)
|
||||
av_freep(&es->components[i].str);
|
||||
av_freep(&es->components);
|
||||
|
||||
if (es->lock_initialized)
|
||||
pthread_mutex_destroy(&es->lock);
|
||||
es->lock_initialized = 0;
|
||||
}
|
||||
|
||||
static void ost_free(OutputStream **post)
|
||||
|
|
|
@ -402,6 +402,11 @@ fail:
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = pthread_mutex_init(&es->lock, NULL);
|
||||
if (ret)
|
||||
return AVERROR(ret);
|
||||
es->lock_initialized = 1;
|
||||
|
||||
ret = enc_stats_get_file(&es->io, path);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue