[FFmpeg-devel] [PATCH 4/5] avcodec/qsvenc: use hwcontext_qsv instead of ff_qsv_init_internal_session

nablet developer sdk at nablet.com
Wed May 25 14:20:50 CEST 2016


Signed-off-by: nablet developer <sdk at nablet.com>
---
 libavcodec/qsvenc.c | 29 +++++++++++++++++++++++------
 libavcodec/qsvenc.h |  3 +--
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 6145121..8eefa06 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -30,6 +30,8 @@
 #include "libavutil/log.h"
 #include "libavutil/time.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_qsv.h"
 #include "libavcodec/bytestream.h"
 
 #include "avcodec.h"
@@ -697,12 +699,27 @@ 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);
-        if (ret < 0)
-            return ret;
+        AVHWDeviceContext *device_ctx;
+        AVQSVDeviceContext *device_hwctx;
+
+        if (!q->hwdevice) {
+            q->hwdevice = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_QSV);
+            if (!q->hwdevice) {
+                return AVERROR(ENOMEM);
+            }
+        }
+        device_ctx = (AVHWDeviceContext*)q->hwdevice->data;
+        device_hwctx = device_ctx->hwctx;
 
-        q->session = q->internal_qs.session;
+        if (!device_hwctx->session) {
+            device_hwctx->load_plugins = q->load_plugins;
+
+            ret = av_hwdevice_ctx_init(q->hwdevice);
+            if (ret < 0) {
+                return ret;
+            }
+        }
+        q->session = device_hwctx->session;
     }
 
     ret = init_video_param(avctx, q);
@@ -1084,7 +1101,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_buffer_unref(&q->hwdevice);
 
     cur = q->work_frames;
     while (cur) {
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index 2d7bd32..7c9c1e2 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -79,8 +79,7 @@ typedef struct QSVEncContext {
     QSVFrame *work_frames;
 
     mfxSession session;
-    QSVSession internal_qs;
-
+    AVBufferRef *hwdevice;
     int packet_size;
     int width_align;
     int height_align;
-- 
1.8.3.1



More information about the ffmpeg-devel mailing list