* commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42': qsv: adding Multi Frame Encode support Merged-by: James Almer <jamrial@gmail.com>tags/n4.0
@@ -617,10 +617,12 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, | |||||
"Error setting a HW handle"); | "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); | ret = qsv_load_plugins(session, load_plugins, avctx); | ||||
if (ret < 0) { | if (ret < 0) { | ||||
@@ -38,6 +38,10 @@ | |||||
(MFX_VERSION_MAJOR > (MAJOR) || \ | (MFX_VERSION_MAJOR > (MAJOR) || \ | ||||
MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR)) | 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 { | typedef struct QSVMid { | ||||
AVBufferRef *hw_frames_ref; | AVBufferRef *hw_frames_ref; | ||||
mfxHDL handle; | mfxHDL handle; | ||||
@@ -651,6 +651,20 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||
q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2; | 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 | #endif | ||||
} | } | ||||
@@ -50,11 +50,13 @@ | |||||
#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8) | #define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8) | ||||
#define QSV_HAVE_VCM 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_QVBR QSV_VERSION_ATLEAST(1, 11) | ||||
#define QSV_HAVE_MF 0 | |||||
#else | #else | ||||
#define QSV_HAVE_AVBR 0 | #define QSV_HAVE_AVBR 0 | ||||
#define QSV_HAVE_ICQ 0 | #define QSV_HAVE_ICQ 0 | ||||
#define QSV_HAVE_VCM 0 | #define QSV_HAVE_VCM 0 | ||||
#define QSV_HAVE_QVBR 0 | #define QSV_HAVE_QVBR 0 | ||||
#define QSV_HAVE_MF QSV_VERSION_ATLEAST(1, 25) | |||||
#endif | #endif | ||||
#if !QSV_HAVE_LA_DS | #if !QSV_HAVE_LA_DS | ||||
@@ -108,12 +110,15 @@ typedef struct QSVEncContext { | |||||
#if QSV_HAVE_CO2 | #if QSV_HAVE_CO2 | ||||
mfxExtCodingOption2 extco2; | mfxExtCodingOption2 extco2; | ||||
#endif | #endif | ||||
#if QSV_HAVE_MF | |||||
mfxExtMultiFrameParam extmfp; | |||||
mfxExtMultiFrameControl extmfc; | |||||
#endif | |||||
mfxExtOpaqueSurfaceAlloc opaque_alloc; | mfxExtOpaqueSurfaceAlloc opaque_alloc; | ||||
mfxFrameSurface1 **opaque_surfaces; | mfxFrameSurface1 **opaque_surfaces; | ||||
AVBufferRef *opaque_alloc_buf; | 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; | int nb_extparam_internal; | ||||
mfxExtBuffer **extparam; | mfxExtBuffer **extparam; | ||||
@@ -158,6 +163,10 @@ typedef struct QSVEncContext { | |||||
int recovery_point_sei; | int recovery_point_sei; | ||||
int a53_cc; | int a53_cc; | ||||
#if QSV_HAVE_MF | |||||
int mfmode; | |||||
#endif | |||||
char *load_plugins; | char *load_plugins; | ||||
SetEncodeCtrlCB *set_encode_ctrl_cb; | SetEncodeCtrlCB *set_encode_ctrl_cb; | ||||
} QSVEncContext; | } QSVEncContext; | ||||
@@ -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}, | { "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 }, | { NULL }, | ||||
}; | }; | ||||
@@ -515,9 +515,12 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) | |||||
if (ret != MFX_ERR_NONE) | if (ret != MFX_ERR_NONE) | ||||
return AVERROR_UNKNOWN; | 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)) { | if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) { | ||||
s->opaque_alloc.In.Surfaces = s->surface_ptrs_in; | s->opaque_alloc.In.Surfaces = s->surface_ptrs_in; | ||||
@@ -31,6 +31,14 @@ | |||||
#define FF_INLINK_IDX(link) ((int)((link)->dstpad - (link)->dst->input_pads)) | #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 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 QSVVPPContext QSVVPPContext; | ||||
typedef struct QSVVPPCrop { | typedef struct QSVVPPCrop { | ||||
@@ -35,6 +35,7 @@ | |||||
#include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
#include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
#include "libavutil/time.h" | #include "libavutil/time.h" | ||||
#include "libavfilter/qsvvpp.h" | |||||
#include "avfilter.h" | #include "avfilter.h" | ||||
#include "formats.h" | #include "formats.h" | ||||
@@ -215,6 +216,12 @@ static int init_out_session(AVFilterContext *ctx) | |||||
return AVERROR_UNKNOWN; | 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)); | memset(&par, 0, sizeof(par)); | ||||
s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; | s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; | ||||
@@ -36,6 +36,7 @@ | |||||
#include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
#include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
#include "libavutil/time.h" | #include "libavutil/time.h" | ||||
#include "libavfilter/qsvvpp.h" | |||||
#include "avfilter.h" | #include "avfilter.h" | ||||
#include "formats.h" | #include "formats.h" | ||||
@@ -315,6 +316,12 @@ static int init_out_session(AVFilterContext *ctx) | |||||
return AVERROR_UNKNOWN; | 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)); | memset(&par, 0, sizeof(par)); | ||||
if (opaque) { | if (opaque) { | ||||
@@ -1058,6 +1058,11 @@ static int qsv_device_derive_from_child(AVHWDeviceContext *ctx, | |||||
goto fail; | 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; | return 0; | ||||
fail: | fail: | ||||