diff mbox series

[FFmpeg-devel,04/14] pthread_frame: do not share priv_data between multiple codec contexts

Message ID 20200327125747.13460-4-anton@khirnov.net
State Accepted
Headers show
Series [FFmpeg-devel,01/14] mpeg4videodec: do not copy a range of fields at once
Related show

Checks

Context Check Description
andriy/ffmpeg-patchwork pending
andriy/ffmpeg-patchwork success Applied patch
andriy/ffmpeg-patchwork success Configure finished
andriy/ffmpeg-patchwork success Make finished
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Anton Khirnov March 27, 2020, 12:57 p.m. UTC
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.
---
 libavcodec/pthread_frame.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
index 183d0f84f2..19073b1253 100644
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -702,7 +702,7 @@  void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
         av_packet_unref(&p->avpkt);
         av_freep(&p->released_buffers);
 
-        if (i && p->avctx) {
+        if (p->avctx) {
             if (codec->priv_class)
                 av_opt_free(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->last_pkt_props = &p->avpkt;
 
-        if (i) {
+        if (codec->priv_data_size) {
             copy->priv_data = av_mallocz(codec->priv_data_size);
             if (!copy->priv_data) {
                 err = AVERROR(ENOMEM);
@@ -825,9 +825,11 @@  int ff_frame_thread_init(AVCodecContext *avctx)
                 if (err < 0)
                     goto error;
             }
-            copy->internal->is_copy = 1;
         }
 
+        if (i)
+            copy->internal->is_copy = 1;
+
         if (codec->init)
             err = codec->init(copy);