>From f740857a4bd917d141d1b77a1a2f91438f71fae1 Mon Sep 17 00:00:00 2001
From: Sven Dueking <sven@nablet.com>
Date: Thu, 10 Dec 2015 13:06:43 +0000
Subject: [PATCH] make some internal QSV routines public

---
 libavcodec/qsv.c          | 217 ----------------------------------------
 libavcodec/qsv.h          |  22 +++++
 libavcodec/qsv_api.c      | 247 ++++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/qsv_internal.h |  15 +--
 libavcodec/qsvdec.c       |  13 ++-
 libavcodec/qsvdec.h       |   3 +-
 libavcodec/qsvenc.c       |  16 +--
 libavcodec/qsvenc.h       |   2 +-
 8 files changed, 287 insertions(+), 248 deletions(-)

diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 4c8e6b0..610c02f 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -50,220 +50,3 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
 
     return AVERROR(ENOSYS);
 }
-
-int ff_qsv_error(int mfx_err)
-{
-    switch (mfx_err) {
-    case MFX_ERR_NONE:
-        return 0;
-    case MFX_ERR_MEMORY_ALLOC:
-    case MFX_ERR_NOT_ENOUGH_BUFFER:
-        return AVERROR(ENOMEM);
-    case MFX_ERR_INVALID_HANDLE:
-        return AVERROR(EINVAL);
-    case MFX_ERR_DEVICE_FAILED:
-    case MFX_ERR_DEVICE_LOST:
-    case MFX_ERR_LOCK_MEMORY:
-        return AVERROR(EIO);
-    case MFX_ERR_NULL_PTR:
-    case MFX_ERR_UNDEFINED_BEHAVIOR:
-    case MFX_ERR_NOT_INITIALIZED:
-        return AVERROR_BUG;
-    case MFX_ERR_UNSUPPORTED:
-    case MFX_ERR_NOT_FOUND:
-        return AVERROR(ENOSYS);
-    case MFX_ERR_MORE_DATA:
-    case MFX_ERR_MORE_SURFACE:
-    case MFX_ERR_MORE_BITSTREAM:
-        return AVERROR(EAGAIN);
-    case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM:
-    case MFX_ERR_INVALID_VIDEO_PARAM:
-        return AVERROR(EINVAL);
-    case MFX_ERR_ABORTED:
-    case MFX_ERR_UNKNOWN:
-    default:
-        return AVERROR_UNKNOWN;
-    }
-}
-static int ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession *qs)
-{
-    // 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
-    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) {
-                av_log(avctx, AV_LOG_ERROR,
-                "Error %d during set display handle\n", ret);
-                return ff_qsv_error(ret);
-            }
-            break;
-        }
-    }
-#endif //AVCODEC_QSV_LINUX_SESSION_HANDLE
-    return 0;
-}
-/**
- * @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, QSVSession *qs,
-                                 const char *load_plugins)
-{
-    mfxIMPL impl   = MFX_IMPL_AUTO_ANY;
-    mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
-
-    const char *desc;
-    int ret;
-
-    ret = MFXInit(impl, &ver, &qs->session);
-    if (ret < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Error initializing an internal MFX session\n");
-        return ff_qsv_error(ret);
-    }
-
-    ret = ff_qsv_set_display_handle(avctx, qs);
-    if (ret < 0)
-        return ret;
-
-    MFXQueryIMPL(qs->session, &impl);
-
-    switch (MFX_IMPL_BASETYPE(impl)) {
-    case MFX_IMPL_SOFTWARE:
-        desc = "software";
-        break;
-    case MFX_IMPL_HARDWARE:
-    case MFX_IMPL_HARDWARE2:
-    case MFX_IMPL_HARDWARE3:
-    case MFX_IMPL_HARDWARE4:
-        desc = "hardware accelerated";
-        break;
-    default:
-        desc = "unknown";
-    }
-
-    if (load_plugins && *load_plugins) {
-        while (*load_plugins) {
-            mfxPluginUID uid;
-            int i, err = 0;
-
-            char *plugin = av_get_token(&load_plugins, ":");
-            if (!plugin)
-                return AVERROR(ENOMEM);
-            if (strlen(plugin) != 2 * sizeof(uid.Data)) {
-                av_log(avctx, AV_LOG_ERROR, "Invalid plugin UID length\n");
-                err = AVERROR(EINVAL);
-                goto load_plugin_fail;
-            }
-
-            for (i = 0; i < sizeof(uid.Data); i++) {
-                err = sscanf(plugin + 2 * i, "%2hhx", uid.Data + i);
-                if (err != 1) {
-                    av_log(avctx, AV_LOG_ERROR, "Invalid plugin UID\n");
-                    err = AVERROR(EINVAL);
-                    goto load_plugin_fail;
-                }
-
-            }
-
-            ret = MFXVideoUSER_Load(qs->session, &uid, 1);
-            if (ret < 0) {
-                av_log(avctx, AV_LOG_ERROR, "Could not load the requested plugin: %s\n",
-                       plugin);
-                err = ff_qsv_error(ret);
-                goto load_plugin_fail;
-            }
-
-load_plugin_fail:
-            av_freep(&plugin);
-            if (err < 0)
-                return err;
-        }
-    }
-
-    av_log(avctx, AV_LOG_VERBOSE,
-           "Initialized an internal MFX session using %s implementation\n",
-           desc);
-
-    return 0;
-}
-
-int ff_qsv_close_internal_session(QSVSession *qs)
-{
-    if (qs->session) {
-        MFXClose(qs->session);
-        qs->session = NULL;
-    }
-#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
-    if (qs->va_display) {
-        vaTerminate(qs->va_display);
-        qs->va_display = NULL;
-    }
-    if (qs->fd_display > 0) {
-        close(qs->fd_display);
-        qs->fd_display = -1;
-    }
-#endif
-    return 0;
-}
diff --git a/libavcodec/qsv.h b/libavcodec/qsv.h
index b77158e..39f349d 100644
--- a/libavcodec/qsv.h
+++ b/libavcodec/qsv.h
@@ -98,10 +98,32 @@ typedef struct AVQSVContext {
 } AVQSVContext;
 
 /**
+ * This struct is used for handling QSV session parameters
+ */
+typedef struct AVQSVSession {
+    /**
+     * QSV session handle
+     */
+    mfxSession session;
+
+    int    fd_display;
+    void * va_display;
+
+} AVQSVSession;
+
+/**
  * Allocate a new context.
  *
  * It must be freed by the caller with av_free().
  */
 AVQSVContext *av_qsv_alloc_context(void);
 
+int av_qsv_error(int mfx_err);
+
+int av_qsv_init_session(AVClass *avccl, AVQSVSession *qs,
+                                 const char *load_plugins);
+
+int av_qsv_close_session(AVQSVSession *qs);
+
+
 #endif /* AVCODEC_QSV_H */
diff --git a/libavcodec/qsv_api.c b/libavcodec/qsv_api.c
index 327ff7d..0509f62 100644
--- a/libavcodec/qsv_api.c
+++ b/libavcodec/qsv_api.c
@@ -22,21 +22,268 @@
 
 #include <stddef.h>
 
+#include "libavutil/avstring.h"
 #include "libavutil/mem.h"
 
 #if CONFIG_QSV
+
+#include "avcodec.h"
+
 #include "qsv.h"
+#include "qsv_internal.h"
+
+#include <mfx/mfxplugin.h>
 
 AVQSVContext *av_qsv_alloc_context(void)
 {
     return av_mallocz(sizeof(AVQSVContext));
 }
+
+int av_qsv_error(int mfx_err)
+{
+    switch (mfx_err) {
+    case MFX_ERR_NONE:
+        return 0;
+    case MFX_ERR_MEMORY_ALLOC:
+    case MFX_ERR_NOT_ENOUGH_BUFFER:
+        return AVERROR(ENOMEM);
+    case MFX_ERR_INVALID_HANDLE:
+        return AVERROR(EINVAL);
+    case MFX_ERR_DEVICE_FAILED:
+    case MFX_ERR_DEVICE_LOST:
+    case MFX_ERR_LOCK_MEMORY:
+        return AVERROR(EIO);
+    case MFX_ERR_NULL_PTR:
+    case MFX_ERR_UNDEFINED_BEHAVIOR:
+    case MFX_ERR_NOT_INITIALIZED:
+        return AVERROR_BUG;
+    case MFX_ERR_UNSUPPORTED:
+    case MFX_ERR_NOT_FOUND:
+        return AVERROR(ENOSYS);
+    case MFX_ERR_MORE_DATA:
+    case MFX_ERR_MORE_SURFACE:
+    case MFX_ERR_MORE_BITSTREAM:
+        return AVERROR(EAGAIN);
+    case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM:
+    case MFX_ERR_INVALID_VIDEO_PARAM:
+        return AVERROR(EINVAL);
+    case MFX_ERR_ABORTED:
+    case MFX_ERR_UNKNOWN:
+    default:
+        return AVERROR_UNKNOWN;
+    }
+}
+static int ff_qsv_set_display_handle(AVClass *avccl, struct AVQSVSession *qs)
+{
+    // 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
+    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(avccl, AV_LOG_ERROR,
+                "mfx init: %s fd open failed\n", adapterpath);
+            continue;
+        }
+
+        va_dpy = vaGetDisplayDRM(fd);
+        if (!va_dpy) {
+            av_log(avccl, 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(avccl, AV_LOG_ERROR,
+                "mfx init: %s vaInitialize failed\n", adapterpath);
+            close(fd);
+            fd = -1;
+            continue;
+        } else {
+            av_log(avccl, 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) {
+                av_log(avccl, AV_LOG_ERROR,
+                "Error %d during set display handle\n", ret);
+                return av_qsv_error(ret);
+            }
+            break;
+        }
+    }
+#endif //AVCODEC_QSV_LINUX_SESSION_HANDLE
+    return 0;
+}
+/**
+ * @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 av_qsv_init_session(AVClass *avccl, struct AVQSVSession *qs,
+                                 const char *load_plugins)
+{
+    mfxIMPL impl   = MFX_IMPL_AUTO_ANY;
+    mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
+
+    const char *desc;
+    int ret;
+
+    ret = MFXInit(impl, &ver, &qs->session);
+    if (ret < 0) {
+        av_log(avccl, AV_LOG_ERROR, "Error initializing an internal MFX session\n");
+        return av_qsv_error(ret);
+    }
+
+    ret = ff_qsv_set_display_handle(avccl, qs);
+    if (ret < 0)
+        return ret;
+
+    MFXQueryIMPL(qs->session, &impl);
+
+    switch (MFX_IMPL_BASETYPE(impl)) {
+    case MFX_IMPL_SOFTWARE:
+        desc = "software";
+        break;
+    case MFX_IMPL_HARDWARE:
+    case MFX_IMPL_HARDWARE2:
+    case MFX_IMPL_HARDWARE3:
+    case MFX_IMPL_HARDWARE4:
+        desc = "hardware accelerated";
+        break;
+    default:
+        desc = "unknown";
+    }
+
+    if (load_plugins && *load_plugins) {
+        while (*load_plugins) {
+            mfxPluginUID uid;
+            int i, err = 0;
+
+            char *plugin = av_get_token(&load_plugins, ":");
+            if (!plugin)
+                return AVERROR(ENOMEM);
+            if (strlen(plugin) != 2 * sizeof(uid.Data)) {
+                av_log(avccl, AV_LOG_ERROR, "Invalid plugin UID length\n");
+                err = AVERROR(EINVAL);
+                goto load_plugin_fail;
+            }
+
+            for (i = 0; i < sizeof(uid.Data); i++) {
+                err = sscanf(plugin + 2 * i, "%2hhx", uid.Data + i);
+                if (err != 1) {
+                    av_log(avccl, AV_LOG_ERROR, "Invalid plugin UID\n");
+                    err = AVERROR(EINVAL);
+                    goto load_plugin_fail;
+                }
+
+            }
+
+            ret = MFXVideoUSER_Load(qs->session, &uid, 1);
+            if (ret < 0) {
+                av_log(avccl, AV_LOG_ERROR, "Could not load the requested plugin: %s\n",
+                       plugin);
+                err = av_qsv_error(ret);
+                goto load_plugin_fail;
+            }
+
+load_plugin_fail:
+            av_freep(&plugin);
+            if (err < 0)
+                return err;
+        }
+    }
+
+    av_log(avccl, AV_LOG_VERBOSE,
+           "Initialized an internal MFX session using %s implementation\n",
+           desc);
+
+    return 0;
+}
+
+int av_qsv_close_session(struct AVQSVSession *qs)
+{
+    if (qs->session) {
+        MFXClose(qs->session);
+        qs->session = NULL;
+    }
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
+    if (qs->va_display) {
+        vaTerminate(qs->va_display);
+        qs->va_display = NULL;
+    }
+    if (qs->fd_display > 0) {
+        close(qs->fd_display);
+        qs->fd_display = -1;
+    }
+#endif
+    return 0;
+}
+
 #else
 
 struct AVQSVContext *av_qsv_alloc_context(void);
 
+int av_qsv_init_session(AVClass *avccl, struct AVQSVSession *qs,
+                                 const char *load_plugins)
+
+int av_qsv_close_session(struct AVQSVContext *qs);
+
 struct AVQSVContext *av_qsv_alloc_context(void)
 {
     return NULL;
 }
+
+int av_qsv_error(int mfx_err)
+{
+    return NULL;
+}
+
+int av_qsv_init_session(AVClass *avccl, struct AVQSVSession *qs,
+                                 const char *load_plugins)
+{
+    return NULL;
+}
+
+int av_qsv_close_session(struct AVQSVContext *qs)
+{
+    return NULL;
+}
+
 #endif
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index c235e07..941581f 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -51,6 +51,7 @@
     (MFX_VERSION_MAJOR > (MAJOR) ||         \
      MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
 
+
 typedef struct QSVFrame {
     AVFrame *frame;
     mfxFrameSurface1 *surface;
@@ -63,23 +64,9 @@ typedef struct QSVFrame {
     struct QSVFrame *next;
 } QSVFrame;
 
-typedef struct QSVSession {
-    mfxSession session;
-#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
-    int        fd_display;
-    VADisplay  va_display;
-#endif
-} QSVSession;
-
 /**
  * Convert a libmfx error code into a ffmpeg error code.
  */
-int ff_qsv_error(int mfx_err);
-
 int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id);
 
-int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
-                                 const char *load_plugins);
-int ff_qsv_close_internal_session(QSVSession *qs);
-
 #endif /* AVCODEC_QSV_INTERNAL_H */
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index c451fb9..2ebc5d5 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -34,7 +34,6 @@
 
 #include "avcodec.h"
 #include "internal.h"
-#include "qsv.h"
 #include "qsv_internal.h"
 #include "qsvdec.h"
 
@@ -75,8 +74,8 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt
     }
     if (!q->session) {
         if (!q->internal_qs.session) {
-            ret = ff_qsv_init_internal_session(avctx, &q->internal_qs,
-                                               q->load_plugins);
+            ret = av_qsv_init_session((AVClass*)&avctx->av_class, &q->internal_qs,
+                                      q->load_plugins);
             if (ret < 0)
                 return ret;
         }
@@ -108,7 +107,7 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt
         return avpkt->size;
     } else if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Decode header error %d\n", ret);
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
     param.IOPattern   = q->iopattern;
     param.AsyncDepth  = q->async_depth;
@@ -126,7 +125,7 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt
             av_log(avctx, AV_LOG_ERROR,
                    "Error initializing the MFX video decoder %d\n", ret);
         }
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
 
     avctx->profile      = param.mfx.CodecProfile;
@@ -405,7 +404,7 @@ static int do_qsv_decode(AVCodecContext *avctx, QSVContext *q,
 
     if (MFX_ERR_MORE_DATA!=ret && ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error %d during QSV decoding.\n", ret);
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
     n_out_frames = av_fifo_size(q->async_fifo) / (sizeof(out_frame)+sizeof(sync));
 
@@ -571,7 +570,7 @@ int ff_qsv_decode_close(QSVContext *q)
 
     q->session = NULL;
 
-    ff_qsv_close_internal_session(&q->internal_qs);
+    av_qsv_close_session(&q->internal_qs);
 
     av_fifo_free(q->async_fifo);
     q->async_fifo = NULL;
diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h
index 97a3315..51beb87 100644
--- a/libavcodec/qsvdec.h
+++ b/libavcodec/qsvdec.h
@@ -33,6 +33,7 @@
 #include "libavutil/pixfmt.h"
 
 #include "avcodec.h"
+#include "qsv.h"
 #include "qsv_internal.h"
 
 typedef struct QSVContext {
@@ -41,7 +42,7 @@ typedef struct QSVContext {
 
     // the session we allocated internally, in case the caller did not provide
     // one
-    QSVSession internal_qs;
+    AVQSVSession internal_qs;
 
     /**
      * a linked list of frames currently being used by QSV
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index d00fdff..f83f88e 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -589,7 +589,7 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
 
     ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param);
     if (ret < 0)
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
 
     q->packet_size = q->param.mfx.BufferSizeInKB * 1000;
 
@@ -674,8 +674,8 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
     }
 
     if (!q->session) {
-        ret = ff_qsv_init_internal_session(avctx, &q->internal_qs,
-                                           q->load_plugins);
+        ret = av_qsv_init_session((AVClass*)&avctx->av_class, &q->internal_qs,
+                                   q->load_plugins);
         if (ret < 0)
             return ret;
 
@@ -691,13 +691,13 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
         av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n");
     } else if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error %d querying encoder params\n", ret);
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
 
     ret = MFXVideoENCODE_QueryIOSurf(q->session, &q->param, &q->req);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error querying the encoding parameters\n");
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
 
     if (opaque_alloc) {
@@ -740,7 +740,7 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
         av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n");
     } else if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error initializing the encoder\n");
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
 
     ret = qsv_retrieve_enc_params(avctx, q);
@@ -954,7 +954,7 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
         if (ret == MFX_ERR_MORE_DATA)
             return 0;
         av_log(avctx, AV_LOG_ERROR, "EncodeFrameAsync returned %d\n", ret);
-        return ff_qsv_error(ret);
+        return av_qsv_error(ret);
     }
 
     if (ret == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) {
@@ -1034,7 +1034,7 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q)
         MFXVideoENCODE_Close(q->session);
     q->session = NULL;
 
-    ff_qsv_close_internal_session(&q->internal_qs);
+    av_qsv_close_session(&q->internal_qs);
 
     cur = q->work_frames;
     while (cur) {
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index 8627570..bdd6f1e 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -77,7 +77,7 @@ typedef struct QSVEncContext {
     QSVFrame *work_frames;
 
     mfxSession session;
-    QSVSession internal_qs;
+    AVQSVSession internal_qs;
 
     int packet_size;
     int width_align;
-- 
1.8.3.1

