diff options
author | James Almer <jamrial@gmail.com> | 2018-04-13 20:34:23 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2018-04-13 20:34:23 -0300 |
commit | f790410b6baa4ee53e8a5796e986de0cae78b073 (patch) | |
tree | dc092d2c1bf35c8eb9888f7b3f77c4720bacf423 | |
parent | ae7e66fb4b1a256fb79a016b9c585de84ac77339 (diff) | |
parent | cca5e4f040971db6de0bfe6968f00c021d8a9c42 (diff) | |
download | ffmpeg-f790410b6baa4ee53e8a5796e986de0cae78b073.tar.gz |
Merge commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42'
* commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42':
qsv: adding Multi Frame Encode support
Merged-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavcodec/qsv.c | 10 | ||||
-rw-r--r-- | libavcodec/qsv_internal.h | 4 | ||||
-rw-r--r-- | libavcodec/qsvenc.c | 14 | ||||
-rw-r--r-- | libavcodec/qsvenc.h | 13 | ||||
-rw-r--r-- | libavcodec/qsvenc_h264.c | 4 | ||||
-rw-r--r-- | libavfilter/qsvvpp.c | 9 | ||||
-rw-r--r-- | libavfilter/qsvvpp.h | 8 | ||||
-rw-r--r-- | libavfilter/vf_deinterlace_qsv.c | 7 | ||||
-rw-r--r-- | libavfilter/vf_scale_qsv.c | 7 | ||||
-rw-r--r-- | libavutil/hwcontext_qsv.c | 5 |
10 files changed, 72 insertions, 9 deletions
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index 6d1fbde452..45e1c25c68 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 5c33f187f4..394c558883 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 afb953eb11..3ce5ffecd5 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 080f6f08d3..d48272224c 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 0fe29c2730..718bf9cb21 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 }, }; diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index f32b46dcc0..732cf56a6a 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -515,9 +515,12 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) if (ret != MFX_ERR_NONE) return AVERROR_UNKNOWN; } - ret = MFXJoinSession(device_hwctx->session, s->session); - if (ret != MFX_ERR_NONE) - return AVERROR_UNKNOWN; + + if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { + ret = MFXJoinSession(device_hwctx->session, s->session); + if (ret != MFX_ERR_NONE) + return AVERROR_UNKNOWN; + } if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) { s->opaque_alloc.In.Surfaces = s->surface_ptrs_in; diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h index d720c9ba42..ff02b64c41 100644 --- a/libavfilter/qsvvpp.h +++ b/libavfilter/qsvvpp.h @@ -31,6 +31,14 @@ #define FF_INLINK_IDX(link) ((int)((link)->dstpad - (link)->dst->input_pads)) #define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads)) +#define QSV_VERSION_ATLEAST(MAJOR, MINOR) \ + (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 QSVVPPContext QSVVPPContext; typedef struct QSVVPPCrop { diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c index 897e6bd622..c9e76c6056 100644 --- a/libavfilter/vf_deinterlace_qsv.c +++ b/libavfilter/vf_deinterlace_qsv.c @@ -35,6 +35,7 @@ #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/time.h" +#include "libavfilter/qsvvpp.h" #include "avfilter.h" #include "formats.h" @@ -215,6 +216,12 @@ static int init_out_session(AVFilterContext *ctx) return AVERROR_UNKNOWN; } + if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { + err = MFXJoinSession(device_hwctx->session, s->session); + if (err != MFX_ERR_NONE) + return AVERROR_UNKNOWN; + } + memset(&par, 0, sizeof(par)); s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index c6f683e6fa..d1189942d1 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -36,6 +36,7 @@ #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/time.h" +#include "libavfilter/qsvvpp.h" #include "avfilter.h" #include "formats.h" @@ -315,6 +316,12 @@ static int init_out_session(AVFilterContext *ctx) return AVERROR_UNKNOWN; } + if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { + err = MFXJoinSession(device_hwctx->session, s->session); + if (err != MFX_ERR_NONE) + return AVERROR_UNKNOWN; + } + memset(&par, 0, sizeof(par)); if (opaque) { diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index d58461b226..250091c4e8 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -1058,6 +1058,11 @@ static int qsv_device_derive_from_child(AVHWDeviceContext *ctx, goto fail; } + ret = MFXQueryVersion(hwctx->session,&ver); + if (ret == MFX_ERR_NONE) { + av_log(ctx, AV_LOG_VERBOSE, "MFX compile/runtime API: %d.%d/%d.%d\n", + MFX_VERSION_MAJOR, MFX_VERSION_MINOR, ver.Major, ver.Minor); + } return 0; fail: |