[FFmpeg-devel] [PATCH 1/2] lavc/qsv: Fix MSDK initialization failure in system memory mode
Li, Zhong
zhong.li at intel.com
Thu Sep 5 06:13:43 EEST 2019
> From: Fu, Linjie
> Sent: Thursday, September 5, 2019 10:54 AM
> To: FFmpeg development discussions and patches <ffmpeg-devel at ffmpeg.org>
> Cc: Li, Zhong <zhong.li at intel.com>
> Subject: RE: [FFmpeg-devel] [PATCH 1/2] lavc/qsv: Fix MSDK initialization failure
> in system memory mode
>
> > -----Original Message-----
> > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> > Of Zhong Li
> > Sent: Wednesday, September 4, 2019 23:41
> > To: ffmpeg-devel at ffmpeg.org
> > Cc: Li, Zhong <zhong.li at intel.com>
> > Subject: [FFmpeg-devel] [PATCH 1/2] lavc/qsv: Fix MSDK initialization
> > failure in system memory mode
> >
> > MSDK does not create internal acceleration device on Linux, So
> > MFXVideoCORE_SetHandle() is necessary.
> > It has been added for ff_qsv_init_session_device().
> > But missed for ff_qsv_init_internal_session() due to commit
> > 1f26a23 overwrited commit db89f45
> >
> > Fix #7030
> >
> > Signed-off-by: Zhong Li <zhong.li at intel.com>
> > ---
> > libavcodec/qsv.c | 105
> > ++++++++++++++++++++++++++++++++++++++++++++--
> > libavcodec/qsv_internal.h | 27 +++++++++++-
> > libavcodec/qsvdec.c | 29 +++++++------
> > libavcodec/qsvdec.h | 2 +-
> > libavcodec/qsvenc.c | 17 ++++----
> > libavcodec/qsvenc.h | 2 +-
> > 6 files changed, 151 insertions(+), 31 deletions(-)
> >
> > diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index
> > 65ad070..126182b 100644
> > --- a/libavcodec/qsv.c
> > +++ b/libavcodec/qsv.c
> > @@ -348,7 +348,79 @@ load_plugin_fail:
> >
> > }
> >
> > -int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession
> > *session,
> > +//This code is only required for Linux since a display handle is required.
> > +//For Windows the session is complete and ready to use.
> > +//For releases of Media Server Studio >= 2015 R4 the //render nodes
> > +interface is preferred (/dev/dri/renderD).
> > +//Using Media Server Studio 2015 R4 or newer is recommended //but the
> > +older /dev/dri/card interface is also searched for broader
> > compatibility.
> > +
> > +#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE static int
> > +ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession
> > *qs)
> > +{
> > + // VAAPI display handle
> > + int ret = 0;
> > + VADisplay va_dpy = NULL;
> > + VAStatus va_res = VA_STATUS_SUCCESS;
> > + int major_version = 0, minor_version = 0;
> > + int fd = -1;
> > + char adapterpath[256];
> > + int adapter_num;
> > +
> > + qs->fd_display = -1;
> > + qs->va_display = NULL;
> > +
> > + //search for valid graphics device
> > + for (adapter_num = 0;adapter_num < 6;adapter_num++) {
> > +
> > + if (adapter_num<3) {
> > + snprintf(adapterpath,sizeof(adapterpath),
> > + "/dev/dri/renderD%d", adapter_num+128);
> > + } else {
> > + snprintf(adapterpath,sizeof(adapterpath),
> > + "/dev/dri/card%d", adapter_num-3);
> > + }
> > +
> > + fd = open(adapterpath, O_RDWR);
> > + if (fd < 0) {
> > + av_log(avctx, AV_LOG_ERROR,
> > + "mfx init: %s fd open failed\n", adapterpath);
> > + continue;
> > + }
> > +
> > + va_dpy = vaGetDisplayDRM(fd);
> > + if (!va_dpy) {
> > + av_log(avctx, AV_LOG_ERROR,
> > + "mfx init: %s vaGetDisplayDRM failed\n", adapterpath);
> > + close(fd);
> > + continue;
> > + }
> > +
> > + va_res = vaInitialize(va_dpy, &major_version, &minor_version);
> > + if (VA_STATUS_SUCCESS != va_res) {
> > + av_log(avctx, AV_LOG_ERROR,
> > + "mfx init: %s vaInitialize failed\n", adapterpath);
> > + close(fd);
> > + fd = -1;
> > + continue;
> > + } else {
> > + av_log(avctx, AV_LOG_VERBOSE,
> > + "mfx initialization: %s vaInitialize successful\n",adapterpath);
> > + qs->fd_display = fd;
> > + qs->va_display = va_dpy;
> > + ret = MFXVideoCORE_SetHandle(qs->session,
> > + (mfxHandleType)MFX_HANDLE_VA_DISPLAY, (mfxHDL)va_dpy);
> > + if (ret < 0) {
> > + return ff_qsv_print_error(avctx, ret, "Error %d
> > + during set display
> > handle\n");
> > + }
> > + break;
> > + }
> > + }
> > + return 0;
> > +}
> > +#endif //AVCODEC_QSV_LINUX_SESSION_HANDLE
> > +
> > +int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession
> > +*qs,
> > const char *load_plugins) {
> > mfxIMPL impl = MFX_IMPL_AUTO_ANY;
> > @@ -357,18 +429,24 @@ int ff_qsv_init_internal_session(AVCodecContext
> > *avctx, mfxSession *session,
> > const char *desc;
> > int ret;
> >
> > - ret = MFXInit(impl, &ver, session);
> > + ret = MFXInit(impl, &ver, &qs->session);
> > if (ret < 0)
> > return ff_qsv_print_error(avctx, ret,
> > "Error initializing an internal MFX
> > session");
> >
> > - ret = qsv_load_plugins(*session, load_plugins, avctx);
>
> > +#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
> > + ret = ff_qsv_set_display_handle(avctx, qs);
> > + if (ret < 0)
> > + return ret;
> > +#endif
>
> I think one "#ifdef" check may be good enough for ff_qsv_set_display_handle, but
> current version is also ok.
If I understand your point, you mean that:
#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE static int
ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession
*qs)
...
#endif
ret = ff_qsv_set_display_handle(avctx, qs);
if (ret < 0)
return ret;
Right?
If so, it will definitely cause compile error on Windows since ff_qsv_set_display_handle is not defined.
> Patch LGTM referring to commit 1f26a23.
> And also verified it works on both Linux and Windows.
Great! Thanks
>
> - linjie
More information about the ffmpeg-devel
mailing list