[FFmpeg-devel] Patch to enable QSV acceleration under linux platform

Michael Niedermayer michaelni at gmx.at
Tue Jun 30 16:42:56 CEST 2015


On Tue, Jun 30, 2015 at 05:24:54PM +0300, Ivan Uskov wrote:
> Hello All,
> 
> Unlike Windows, under linux a valid display handle should be specified
> to open a QSV/MFX session.
> The attached patch does find appropriate display handle and transfers
> it to Intel's MFX library.
> 
> 
>   
> 
> -- 
> Best regards,
>  Ivan                          mailto:ivan.uskov at nablet.com

>  qsv.c          |   84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  qsv_internal.h |   17 ++++++++++-
>  2 files changed, 100 insertions(+), 1 deletion(-)
> adde891c476ac9bc5cbc06caad70906c8072fd92  0001-Adding-QSV-MFX-session-initialization-for-linux-plat.patch
> From aa319aac75ed30441ed53fac56ddfc347d2d454c Mon Sep 17 00:00:00 2001
> From: Ivan Uskov <ivan.uskov at nablet.com>
> Date: Tue, 30 Jun 2015 16:59:26 +0300
> Subject: [PATCH] Adding QSV/MFX session initialization for linux platform,
>  where a display handle is required. Now ff_qsv_init_internal_session() is
>  able to find appropriate display handle under linux using VAAPI.
> 
> ---
>  libavcodec/qsv.c          | 84 +++++++++++++++++++++++++++++++++++++++++++++++
>  libavcodec/qsv_internal.h | 17 +++++++++-
>  2 files changed, 100 insertions(+), 1 deletion(-)
>  mode change 100644 => 100755 libavcodec/qsv.c
>  mode change 100644 => 100755 libavcodec/qsv_internal.h
> 
> diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c

> old mode 100644
> new mode 100755

this mode change looks unintended



> index 31be9d1..ba81815

> --- a/libavcodec/qsv.c
> +++ b/libavcodec/qsv.c
> @@ -18,6 +18,11 @@
>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>   */
>  
> +/**
> + * @file
> + * Intel QSV H.264 codec general functions.
> + */
> +
>  #include <mfx/mfxvideo.h>
>  
>  #include "libavutil/error.h"
> @@ -25,6 +30,9 @@
>  #include "avcodec.h"
>  #include "qsv_internal.h"
>  
> +/**
> + * @brief translate ffmpeg codec IDs to MSDK
> + */
>  int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
>  {
>      switch (codec_id) {
> @@ -42,6 +50,10 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
>      return AVERROR(ENOSYS);
>  }
>  
> +
> +/**
> + * @brief translate MSDK error codes to ffmpeg error codes
> + */
>  int ff_qsv_error(int mfx_err)
>  {
>      switch (mfx_err) {
> @@ -77,6 +89,22 @@ int ff_qsv_error(int mfx_err)
>      }

The documentation addition should be in a seperate patch


>  }
>  
> +
> +/**
> + * @brief Initialize a MSDK session
> + *
> + * Media SDK is based on sessions, so this is the prerequisite 
> + * initialization for HW acceleration.  For Windows the session is
> + * complete and ready to use, for Linux a display handle is
> + * required.  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.
> + * 
> + * @param avctx    ffmpeg metadata for this codec context
> + * @param session  the MSDK session used
> + */
>  int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session)
>  {
>      mfxIMPL impl   = MFX_IMPL_AUTO_ANY;
> @@ -91,6 +119,62 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session)
>          return ff_qsv_error(ret);
>      }
>  
> +
> +    // this code is only required for Linux.  It searches for a valid
> +    // display handle.  First in /dev/dri/renderD then in /dev/dri/card
> +#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
> +    // VAAPI display handle
> +    VADisplay va_dpy=NULL;
> +    VAStatus va_res = VA_STATUS_SUCCESS;
> +    int major_version = 0, minor_version = 0;
> +    int fd=-1;
> +      
> +    //search for valid graphics device
> +    char adapterpath[256];

> +    for (int adapter_num=0;adapter_num<6;adapter_num++) {

the int should be declared above and outside the for(), some
compilers dont like this syntax



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

this style is inconsistent to the rest of teh file


> +            av_log(avctx, AV_LOG_VERBOSE,
> +            "mfx initialization: %s vaInitialize successful\n",adapterpath);
> +            break;
> +        }
> +    }
> +    MFXVideoCORE_SetHandle((*session), (mfxHandleType)MFX_HANDLE_VA_DISPLAY, (mfxHDL)va_dpy);
> +
> +#endif //AVCODEC_QSV_LINUX_SESSION_HANDLE
> +
>      MFXQueryIMPL(*session, &impl);
>  
>      switch (MFX_IMPL_BASETYPE(impl)) {
> diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
> old mode 100644
> new mode 100755
> index 86fca5f..de8ee47
> --- a/libavcodec/qsv_internal.h
> +++ b/libavcodec/qsv_internal.h
> @@ -21,12 +21,27 @@
>  #ifndef AVCODEC_QSV_INTERNAL_H
>  #define AVCODEC_QSV_INTERNAL_H
>  

> +#ifdef CONFIG_VAAPI

this probably should be #if CONFIG_VAAPI


> +#define AVCODEC_QSV_LINUX_SESSION_HANDLE
> +#endif //CONFIG_VAAPI
> +
> +#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
> +#include <stdio.h>
> +#include <string.h>

> +#include <unistd.h>

needs HAVE_UNISTD_H check if its needed


> +#include <fcntl.h>
> +#include <stdlib.h>

> +#include <assert.h>

not needed


> +#include <va/va.h>
> +#include <va/va_drm.h>
> +#endif
> +
>  #include <mfx/mfxvideo.h>
>  
>  #include "libavutil/frame.h"
>  
>  #define QSV_VERSION_MAJOR 1

> -#define QSV_VERSION_MINOR 1
> +#define QSV_VERSION_MINOR 9 

trailing whitespace cannot be pushed to ffmpeg git

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150630/d61ff43b/attachment.asc>


More information about the ffmpeg-devel mailing list