[FFmpeg-devel] [PATCH] lavc/pthread_frame: Update user context in ff_frame_thread_free
Fu, Linjie
linjie.fu at intel.com
Mon Jan 6 11:24:14 EET 2020
Hi,
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf Of Fu,
> Linjie
> Sent: Monday, December 30, 2019 09:45
> To: ffmpeg-devel at ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH] lavc/pthread_frame: Update user
> context in ff_frame_thread_free
>
> Hi,
>
> > -----Original Message-----
> > From: Fu, Linjie <linjie.fu at intel.com>
> > Sent: Friday, December 27, 2019 16:48
> > To: ffmpeg-devel at ffmpeg.org
> > Cc: Fu, Linjie <linjie.fu at intel.com>
> > Subject: [PATCH] lavc/pthread_frame: Update user context in
> > ff_frame_thread_free
> >
> > Resolution/format changes lead to re-initialization of hardware
> > accelerations(vaapi/dxva2/..) with new hwaccel_priv_data in
> > the worker-thread. But hwaccel_priv_data in user context won't
> > be updated until the resolution changing frame is output.
> >
> > A termination with "-vframes" just after the reinit will lead to:
> > 1. memory leak in worker-thread.
> > 2. double free in user-thread.
> >
> > Update user context in ff_frame_thread_free with the last thread
> > submit_packet() was called on.
> >
> > To reproduce:
> > ffmpeg -hwaccel vaapi(dxva2) -v verbose -i
> > fate-suite/h264/reinit-large_420_8-to-small_420_8.h264 -pix_fmt nv12
> > -f rawvideo -vsync passthrough -vframes 47 -y out.yuv
> >
> > Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> > ---
> > libavcodec/pthread_frame.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
> > index 36ac0ac..8bdd735 100644
> > --- a/libavcodec/pthread_frame.c
> > +++ b/libavcodec/pthread_frame.c
> > @@ -657,6 +657,13 @@ void ff_frame_thread_free(AVCodecContext
> *avctx,
> > int thread_count)
> >
> > park_frame_worker_threads(fctx, thread_count);
> >
> > + if (fctx->prev_thread && avctx->internal->hwaccel_priv_data !=
> > + fctx->prev_thread->avctx->internal->hwaccel_priv_data) {
> > + if (update_context_from_thread(avctx, fctx->prev_thread->avctx, 1)
> <
> > 0) {
> > + av_log(avctx, AV_LOG_ERROR, "Failed to update user thread.\n");
> > + }
> > + }
> > +
> > if (fctx->prev_thread && fctx->prev_thread != fctx->threads)
> > if (update_context_from_thread(fctx->threads->avctx, fctx-
> > >prev_thread->avctx, 0) < 0) {
> > av_log(avctx, AV_LOG_ERROR, "Final thread update failed\n");
> > --
> > 2.7.4
>
> Ping.
> This patch helps to fix the decoding crashes.
>
Ping.
- linjie
More information about the ffmpeg-devel
mailing list