mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
1f4cf92cfb
commit
e40107c1ad
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue