[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 08:02:12 EEST 2019


> From: Fu, Linjie
> Sent: Thursday, September 5, 2019 12:07 PM
> To: Li, Zhong <zhong.li at intel.com>; FFmpeg development discussions and patches
> <ffmpeg-devel at ffmpeg.org>
> Subject: RE: [FFmpeg-devel] [PATCH 1/2] lavc/qsv: Fix MSDK initialization failure
> in system memory mode
> 
> > -----Original Message-----
> > From: Li, Zhong
> > Sent: Thursday, September 5, 2019 11:14
> > To: Fu, Linjie <linjie.fu at intel.com>; FFmpeg development discussions
> > and patches <ffmpeg-devel at ffmpeg.org>
> > Subject: RE: [FFmpeg-devel] [PATCH 1/2] lavc/qsv: Fix MSDK
> > initialization failure in system memory mode
> >
> > > 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.
> >
> 
> Not really, how about check inside the function:
> 
> Static int  ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession *qs)
> { #ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE ...
> #endif

This is not efficient for Windows, ff_qsv_set_display_handle will be called but do nothing, thus why I use current way. 


More information about the ffmpeg-devel mailing list