On Mon, 2022-08-01 at 15:33 +0200, Anton Khirnov wrote: > Quoting Xiang, Haihao (2022-07-25 06:11:49) > > From: Haihao Xiang <haihao.xi...@intel.com> > > > > If qsv hwdevice is available, use the mfxLoader handle in qsv hwdevice > > to create mfx session. Otherwise create mfx session with a new mfxLoader > > handle. > > > > This is in preparation for oneVPL support > > --- > > libavcodec/qsv.c | 226 +++++++++++++++++++++++++++++++++++--- > > libavcodec/qsv_internal.h | 1 + > > libavcodec/qsvdec.c | 11 ++ > > libavcodec/qsvenc.h | 3 + > > libavcodec/qsvenc_h264.c | 1 - > > libavcodec/qsvenc_hevc.c | 1 - > > libavcodec/qsvenc_jpeg.c | 1 - > > libavcodec/qsvenc_mpeg2.c | 1 - > > libavcodec/qsvenc_vp9.c | 1 - > > 9 files changed, 223 insertions(+), 23 deletions(-) > > > > diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c > > index 432675bccf..fe998c9649 100644 > > --- a/libavcodec/qsv.c > > +++ b/libavcodec/qsv.c > > @@ -45,6 +45,12 @@ > > #include <mfxplugin.h> > > #endif > > > > +#if QSV_ONEVPL > > +#include <mfxdispatcher.h> > > +#else > > +#define MFXUnload(a) do { } while(0) > > +#endif > > + > > int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id) > > { > > switch (codec_id) { > > @@ -419,6 +425,193 @@ static int ff_qsv_set_display_handle(AVCodecContext > > *avctx, QSVSession *qs) > > } > > #endif //AVCODEC_QSV_LINUX_SESSION_HANDLE > > > > +#if QSV_ONEVPL > > +static int qsv_new_mfx_loader(AVCodecContext *avctx, > > + mfxIMPL implementation, > > + mfxVersion *pver, > > + void **ploader) > > +{ > > + mfxStatus sts; > > + mfxLoader loader = NULL; > > + mfxConfig cfg; > > + mfxVariant impl_value; > > + > > + loader = MFXLoad(); > > + if (!loader) { > > + av_log(avctx, AV_LOG_ERROR, "Error creating a MFX loader\n"); > > + goto fail; > > + } > > + > > + /* Create configurations for implementation */ > > + cfg = MFXCreateConfig(loader); > > + if (!cfg) { > > + av_log(avctx, AV_LOG_ERROR, "Error creating a MFX > > configurations\n"); > > + goto fail; > > + } > > + > > + impl_value.Type = MFX_VARIANT_TYPE_U32; > > + impl_value.Data.U32 = (implementation == MFX_IMPL_SOFTWARE) ? > > + MFX_IMPL_TYPE_SOFTWARE : MFX_IMPL_TYPE_HARDWARE; > > + sts = MFXSetConfigFilterProperty(cfg, > > + (const mfxU8 > > *)"mfxImplDescription.Impl", impl_value); > > + if (sts != MFX_ERR_NONE) { > > + av_log(avctx, AV_LOG_ERROR, "Error adding a MFX configuration " > > + "property: %d\n", sts); > > + goto fail; > > + } > > + > > + impl_value.Type = MFX_VARIANT_TYPE_U32; > > + impl_value.Data.U32 = pver->Version; > > + sts = MFXSetConfigFilterProperty(cfg, > > + (const mfxU8 > > *)"mfxImplDescription.ApiVersion.Version", > > + impl_value); > > + if (sts != MFX_ERR_NONE) { > > + av_log(avctx, AV_LOG_ERROR, "Error adding a MFX configuration " > > + "property: %d\n", sts); > > + goto fail; > > + } > > + > > + *ploader = loader; > > + > > + return 0; > > + > > +fail: > > + if (loader) > > + MFXUnload(loader); > > + > > + *ploader = NULL; > > + return AVERROR_UNKNOWN; > > +} > > + > > +static int qsv_create_mfx_session_from_loader(void *ctx, mfxLoader loader, > > mfxSession *psession) > > +{ > > + mfxStatus sts; > > + mfxSession session = NULL; > > + uint32_t impl_idx = 0; > > + > > + while (1) { > > + /* Enumerate all implementations */ > > + mfxImplDescription *impl_desc; > > + > > + sts = MFXEnumImplementations(loader, impl_idx, > > + MFX_IMPLCAPS_IMPLDESCSTRUCTURE, > > + (mfxHDL *)&impl_desc); > > + /* Failed to find an available implementation */ > > + if (sts == MFX_ERR_NOT_FOUND) > > + break; > > + else if (sts != MFX_ERR_NONE) { > > + impl_idx++; > > + continue; > > + } > > + > > + sts = MFXCreateSession(loader, impl_idx, &session); > > + MFXDispReleaseImplDescription(loader, impl_desc); > > + if (sts == MFX_ERR_NONE) > > + break; > > + > > + impl_idx++; > > + } > > + > > + if (sts != MFX_ERR_NONE) { > > + av_log(ctx, AV_LOG_ERROR, "Error creating a MFX session: %d.\n", > > sts); > > + goto fail; > > + } > > + > > + *psession = session; > > + > > + return 0; > > + > > +fail: > > + if (session) > > + MFXClose(session); > > + > > + *psession = NULL; > > + return AVERROR_UNKNOWN; > > +} > > + > > +static int qsv_create_mfx_session(AVCodecContext *avctx, > > + mfxIMPL implementation, > > + mfxVersion *pver, > > + int gpu_copy, > > + mfxSession *psession, > > + void **ploader) > > +{ > > + mfxLoader loader = NULL; > > + > > + /* Don't create a new MFX loader if the input loader is valid */ > > + if (*ploader == NULL) { > > + av_log(avctx, AV_LOG_VERBOSE, > > + "Use Intel(R) oneVPL to create MFX session, the required " > > + "implementation version is %d.%d\n", > > + pver->Major, pver->Minor); > > + > > + if (qsv_new_mfx_loader(avctx, implementation, pver, (void > > **)&loader)) > > + goto fail; > > + > > + av_assert0(loader); > > + } else { > > + av_log(avctx, AV_LOG_VERBOSE, > > + "Use Intel(R) oneVPL to create MFX session with the > > specified MFX loader\n"); > > + > > + loader = *ploader; > > + } > > + > > + if (qsv_create_mfx_session_from_loader(avctx, loader, psession)) > > + goto fail; > > + > > + if (!*ploader) > > + *ploader = loader; > > + > > + return 0; > > + > > +fail: > > + if (!*ploader && loader) > > + MFXUnload(loader); > > + > > + return AVERROR_UNKNOWN; > > +} > > + > > +#else > > + > > +static int qsv_create_mfx_session(AVCodecContext *avctx, > > + mfxIMPL implementation, > > + mfxVersion *pver, > > + int gpu_copy, > > + mfxSession *psession, > > + void **ploader) > > +{ > > + mfxInitParam init_par = { MFX_IMPL_AUTO_ANY }; > > + mfxSession session = NULL; > > + mfxStatus sts; > > + > > + av_log(avctx, AV_LOG_VERBOSE, > > + "Use Intel(R) Media SDK to create MFX session, the required " > > + "implementation version is %d.%d\n", > > + pver->Major, pver->Minor); > > + > > + *psession = NULL; > > + *ploader = NULL; > > + > > + init_par.GPUCopy = gpu_copy; > > + init_par.Implementation = implementation; > > + init_par.Version = *pver; > > + sts = MFXInitEx(init_par, &session); > > + if (sts < 0) > > + return ff_qsv_print_error(avctx, sts, > > + "Error initializing a MFX session"); > > + else if (sts > 0) { > > + ff_qsv_print_warning(avctx, sts, > > + "Warning in MFX initialization"); > > + return AVERROR_UNKNOWN; > > + } > > + > > + *psession = session; > > + > > + return 0; > > +} > > + > > +#endif > > Seems to me this rather nontrivial code is being duplicated in three > places. Would be nice to deduplicate it somehow.
Thanks for the comment. I planed to cleanup qsv code, including duplicated code in the current qsv filters. Does it make sense to enable/merge oneVPL firstly then cleanup qsv in new patches? Thanks Haihao _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".