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. -- Anton Khirnov _______________________________________________ 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".