[FFmpeg-devel] [PATCH 3/5] avcodec/qsvdec: use hwcontext_qsv instead of ff_qsv_init_internal_session

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


Signed-off-by: nablet developer <sdk at nablet.com>
---
 libavcodec/qsvdec.c | 29 ++++++++++++++++++++++-------
 libavcodec/qsvdec.h |  4 +---
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 5253a57..e21ed20 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -31,6 +31,8 @@
 #include "libavutil/log.h"
 #include "libavutil/pixfmt.h"
 #include "libavutil/time.h"
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_qsv.h"
 
 #include "avcodec.h"
 #include "internal.h"
@@ -75,14 +77,27 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt
         q->nb_ext_buffers = qsv->nb_ext_buffers;
     }
     if (!q->session) {
-        if (!q->internal_qs.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;
     }
 
     if (avpkt->size) {
@@ -596,7 +611,7 @@ int ff_qsv_decode_close(QSVContext *q)
 
     q->session = NULL;
 
-    ff_qsv_close_internal_session(&q->internal_qs);
+    av_buffer_unref(&q->hwdevice);
 
     av_fifo_free(q->async_fifo);
     q->async_fifo = NULL;
diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h
index 97a3315..eba1d05 100644
--- a/libavcodec/qsvdec.h
+++ b/libavcodec/qsvdec.h
@@ -39,9 +39,7 @@ typedef struct QSVContext {
     // the session used for decoding
     mfxSession session;
 
-    // the session we allocated internally, in case the caller did not provide
-    // one
-    QSVSession internal_qs;
+    AVBufferRef *hwdevice;
 
     /**
      * a linked list of frames currently being used by QSV
-- 
1.8.3.1



More information about the ffmpeg-devel mailing list