[FFmpeg-devel] [PATCH 3/6] qsvdec: Allow creation of the internal session from a device context
Mark Thompson
sw at jkqxz.net
Wed Jan 18 00:30:44 EET 2017
---
libavcodec/qsvdec.c | 25 +++++++++++++++++++++++--
libavcodec/qsvdec.h | 2 ++
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 258042d..5a42fd7 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -42,7 +42,7 @@
#include "qsvdec.h"
static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session,
- AVBufferRef *hw_frames_ref)
+ AVBufferRef *hw_frames_ref, AVBufferRef *hw_device_ref)
{
int ret;
@@ -68,6 +68,25 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses
}
q->session = q->internal_session;
+ } else if (hw_device_ref) {
+ if (q->internal_session) {
+ MFXClose(q->internal_session);
+ q->internal_session = NULL;
+ }
+ av_buffer_unref(&q->hw_device_ctx);
+
+ q->hw_device_ctx = av_buffer_ref(hw_device_ref);
+ if (!q->hw_device_ctx)
+ return AVERROR(ENOMEM);
+
+ ret = ff_qsv_init_session_device(avctx, &q->internal_session,
+ q->hw_device_ctx, q->load_plugins);
+ if (ret < 0) {
+ av_buffer_unref(&q->hw_device_ctx);
+ return ret;
+ }
+
+ q->session = q->internal_session;
} else {
if (!q->internal_session) {
ret = ff_qsv_init_internal_session(avctx, &q->internal_session,
@@ -133,7 +152,7 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
iopattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY;
q->iopattern = iopattern;
- ret = qsv_init_session(avctx, q, session, avctx->hw_frames_ctx);
+ ret = qsv_init_session(avctx, q, session, avctx->hw_frames_ctx, avctx->hw_device_ctx);
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
return ret;
@@ -431,6 +450,8 @@ int ff_qsv_decode_close(QSVContext *q)
av_freep(&q->frames_ctx.mids);
q->frames_ctx.nb_mids = 0;
+ av_buffer_unref(&q->hw_device_ctx);
+
return 0;
}
diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h
index 41fb716..5fb02aa 100644
--- a/libavcodec/qsvdec.h
+++ b/libavcodec/qsvdec.h
@@ -43,6 +43,8 @@ typedef struct QSVContext {
// one
mfxSession internal_session;
+ AVBufferRef *hw_device_ctx;
+
QSVFramesContext frames_ctx;
/**
--
2.7.4
More information about the ffmpeg-devel
mailing list