summaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2018-04-13 20:34:23 -0300
committerJames Almer <jamrial@gmail.com>2018-04-13 20:34:23 -0300
commitf790410b6baa4ee53e8a5796e986de0cae78b073 (patch)
treedc092d2c1bf35c8eb9888f7b3f77c4720bacf423 /libavcodec
parentae7e66fb4b1a256fb79a016b9c585de84ac77339 (diff)
parentcca5e4f040971db6de0bfe6968f00c021d8a9c42 (diff)
downloadffmpeg-streaming-f790410b6baa4ee53e8a5796e986de0cae78b073.zip
ffmpeg-streaming-f790410b6baa4ee53e8a5796e986de0cae78b073.tar.gz
Merge commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42'
* commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42': qsv: adding Multi Frame Encode support Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/qsv.c10
-rw-r--r--libavcodec/qsv_internal.h4
-rw-r--r--libavcodec/qsvenc.c14
-rw-r--r--libavcodec/qsvenc.h13
-rw-r--r--libavcodec/qsvenc_h264.c4
5 files changed, 39 insertions, 6 deletions
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 6d1fbde..45e1c25 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -617,10 +617,12 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
"Error setting a HW handle");
}
- err = MFXJoinSession(parent_session, session);
- if (err != MFX_ERR_NONE)
- return ff_qsv_print_error(avctx, err,
- "Error joining session");
+ if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
+ err = MFXJoinSession(parent_session, session);
+ if (err != MFX_ERR_NONE)
+ return ff_qsv_print_error(avctx, err,
+ "Error joining session");
+ }
ret = qsv_load_plugins(session, load_plugins, avctx);
if (ret < 0) {
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index 5c33f18..394c558 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -38,6 +38,10 @@
(MFX_VERSION_MAJOR > (MAJOR) || \
MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
+#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
+ (MFX_VERSION.Major > (MAJOR)) || \
+ (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))
+
typedef struct QSVMid {
AVBufferRef *hw_frames_ref;
mfxHDL handle;
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index afb953e..3ce5ffe 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -652,6 +652,20 @@ FF_ENABLE_DEPRECATION_WARNINGS
q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2;
}
#endif
+#if QSV_HAVE_MF
+ if (avctx->codec_id == AV_CODEC_ID_H264) {
+ mfxVersion ver;
+ ret = MFXQueryVersion(q->session,&ver);
+ if (ret >= MFX_ERR_NONE && QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
+ q->extmfp.Header.BufferId = MFX_EXTBUFF_MULTI_FRAME_PARAM;
+ q->extmfp.Header.BufferSz = sizeof(q->extmfp);
+
+ q->extmfp.MFMode = q->mfmode;
+ av_log(avctx,AV_LOG_VERBOSE,"MFMode:%d\n", q->extmfp.MFMode);
+ q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extmfp;
+ }
+ }
+#endif
}
if (!check_enc_param(avctx,q)) {
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index 080f6f0..d482722 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -50,11 +50,13 @@
#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8)
#define QSV_HAVE_VCM QSV_VERSION_ATLEAST(1, 8)
#define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 11)
+#define QSV_HAVE_MF 0
#else
#define QSV_HAVE_AVBR 0
#define QSV_HAVE_ICQ 0
#define QSV_HAVE_VCM 0
#define QSV_HAVE_QVBR 0
+#define QSV_HAVE_MF QSV_VERSION_ATLEAST(1, 25)
#endif
#if !QSV_HAVE_LA_DS
@@ -108,12 +110,15 @@ typedef struct QSVEncContext {
#if QSV_HAVE_CO2
mfxExtCodingOption2 extco2;
#endif
-
+#if QSV_HAVE_MF
+ mfxExtMultiFrameParam extmfp;
+ mfxExtMultiFrameControl extmfc;
+#endif
mfxExtOpaqueSurfaceAlloc opaque_alloc;
mfxFrameSurface1 **opaque_surfaces;
AVBufferRef *opaque_alloc_buf;
- mfxExtBuffer *extparam_internal[2 + QSV_HAVE_CO2];
+ mfxExtBuffer *extparam_internal[2 + QSV_HAVE_CO2 + (QSV_HAVE_MF * 2)];
int nb_extparam_internal;
mfxExtBuffer **extparam;
@@ -158,6 +163,10 @@ typedef struct QSVEncContext {
int recovery_point_sei;
int a53_cc;
+
+#if QSV_HAVE_MF
+ int mfmode;
+#endif
char *load_plugins;
SetEncodeCtrlCB *set_encode_ctrl_cb;
} QSVEncContext;
diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c
index 0fe29c2..718bf9c 100644
--- a/libavcodec/qsvenc_h264.c
+++ b/libavcodec/qsvenc_h264.c
@@ -145,6 +145,10 @@ static const AVOption options[] = {
{ "aud", "Insert the Access Unit Delimiter NAL", OFFSET(qsv.aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
+#if QSV_HAVE_MF
+ { "mfmode", "Multi-Frame Mode", OFFSET(qsv.mfmode), AV_OPT_TYPE_INT, { .i64 = MFX_MF_AUTO }, 0, INT_MAX, VE },
+#endif
+
{ NULL },
};
OpenPOWER on IntegriCloud