pthread_frame: do not share priv_data between multiple codec contexts

Specifically, between the user-facing one and the first frame thread
one.

This is fragile and dangerous, allocate separate private data for each
per-thread context.
This commit is contained in:
Anton Khirnov 2017-01-15 14:52:04 +01:00
parent 1f4cf92cfb
commit e40107c1ad
1 changed files with 5 additions and 3 deletions

View File

@ -702,7 +702,7 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
av_packet_unref(&p->avpkt); av_packet_unref(&p->avpkt);
av_freep(&p->released_buffers); av_freep(&p->released_buffers);
if (i && p->avctx) { if (p->avctx) {
if (codec->priv_class) if (codec->priv_class)
av_opt_free(p->avctx->priv_data); av_opt_free(p->avctx->priv_data);
av_freep(&p->avctx->priv_data); av_freep(&p->avctx->priv_data);
@ -812,7 +812,7 @@ int ff_frame_thread_init(AVCodecContext *avctx)
copy->internal->thread_ctx = p; copy->internal->thread_ctx = p;
copy->internal->last_pkt_props = &p->avpkt; copy->internal->last_pkt_props = &p->avpkt;
if (i) { if (codec->priv_data_size) {
copy->priv_data = av_mallocz(codec->priv_data_size); copy->priv_data = av_mallocz(codec->priv_data_size);
if (!copy->priv_data) { if (!copy->priv_data) {
err = AVERROR(ENOMEM); err = AVERROR(ENOMEM);
@ -825,9 +825,11 @@ int ff_frame_thread_init(AVCodecContext *avctx)
if (err < 0) if (err < 0)
goto error; goto error;
} }
copy->internal->is_copy = 1;
} }
if (i)
copy->internal->is_copy = 1;
if (codec->init) if (codec->init)
err = codec->init(copy); err = codec->init(copy);