From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id C46C343817 for ; Mon, 1 Aug 2022 13:33:41 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A4B7368BABD; Mon, 1 Aug 2022 16:33:39 +0300 (EEST) Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EE6CA68BA9F for ; Mon, 1 Aug 2022 16:33:32 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 9B186240179; Mon, 1 Aug 2022 15:33:32 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id HefuCYfpQv4I; Mon, 1 Aug 2022 15:33:32 +0200 (CEST) Received: from lain.khirnov.net (lain.khirnov.net [IPv6:2001:67c:1138:4306::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "lain.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 0411D2400F5; Mon, 1 Aug 2022 15:33:32 +0200 (CEST) Received: by lain.khirnov.net (Postfix, from userid 1000) id 10EE11601B2; Mon, 1 Aug 2022 15:33:32 +0200 (CEST) From: Anton Khirnov To: FFmpeg development discussions and patches In-Reply-To: <20220725041151.7710-12-haihao.xiang@intel.com> References: <20220725041151.7710-1-haihao.xiang@intel.com> <20220725041151.7710-12-haihao.xiang@intel.com> Mail-Followup-To: FFmpeg development discussions and patches , Haihao Xiang Date: Mon, 01 Aug 2022 15:33:32 +0200 Message-ID: <165936081203.15471.11528505401456706222@lain.khirnov.net> User-Agent: alot/0.8.1 MIME-Version: 1.0 Subject: Re: [FFmpeg-devel] [PATCH v12 11/13] lavc/qsv: create mfx session using oneVPL for decoding/encoding X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Haihao Xiang Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Quoting Xiang, Haihao (2022-07-25 06:11:49) > From: Haihao Xiang > > 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 > #endif > > +#if QSV_ONEVPL > +#include > +#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-request@ffmpeg.org with subject "unsubscribe".