[FFmpeg-devel] [PATCH 1/2] lavc/qsv: Fix MSDK initialization failure in system memory mode

Fu, Linjie linjie.fu at intel.com
Thu Sep 5 07:06:30 EEST 2019


> -----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

    return 0;
}

ret = ff_qsv_set_display_handle(avctx, qs);
if (ret < 0)
    return ret;

- linjie


More information about the ffmpeg-devel mailing list