[FFmpeg-devel] [PATCH 3/6] pthread_frame: call update_context_from_user() after acquiring lock.
wm4
nfxjfg at googlemail.com
Wed Mar 29 17:38:40 EEST 2017
On Wed, 29 Mar 2017 10:12:21 -0400
"Ronald S. Bultje" <rsbultje at gmail.com> wrote:
> Otherwise the thread may still be in the middle of decoding a previous
> frame, which would effectively trigger a race condition on any field
> concurrently read and written.
> ---
> libavcodec/pthread_frame.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
> index 34c36d8..6cc43f6 100644
> --- a/libavcodec/pthread_frame.c
> +++ b/libavcodec/pthread_frame.c
> @@ -379,7 +379,8 @@ static void release_delayed_buffers(PerThreadContext *p)
> }
> }
>
> -static int submit_packet(PerThreadContext *p, AVPacket *avpkt)
> +static int submit_packet(PerThreadContext *p, AVCodecContext *user_avctx,
> + AVPacket *avpkt)
> {
> FrameThreadContext *fctx = p->parent;
> PerThreadContext *prev_thread = fctx->prev_thread;
> @@ -391,6 +392,12 @@ static int submit_packet(PerThreadContext *p, AVPacket *avpkt)
>
> pthread_mutex_lock(&p->mutex);
>
> + ret = update_context_from_user(p->avctx, user_avctx);
> + if (ret) {
> + pthread_mutex_unlock(&p->mutex);
> + return ret;
> + }
> +
> release_delayed_buffers(p);
>
> if (prev_thread) {
> @@ -479,10 +486,7 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
> */
>
> p = &fctx->threads[fctx->next_decoding];
> - err = update_context_from_user(p->avctx, avctx);
> - if (err)
> - goto finish;
> - err = submit_packet(p, avpkt);
> + err = submit_packet(p, avctx, avpkt);
> if (err)
> goto finish;
>
So PerThreadContext.mutex protects the thread's avctx as well? Makes
sense then, I guess.
More information about the ffmpeg-devel
mailing list