From: "Xiang, Haihao" <haihao.xiang-at-intel.com@ffmpeg.org> To: "ffmpeg-devel@ffmpeg.org" <ffmpeg-devel@ffmpeg.org> Subject: Re: [FFmpeg-devel] [PATCH] hwcontext_vaapi: Add support for vaGetDisplayWin32 initialization Date: Tue, 21 Mar 2023 04:00:00 +0000 Message-ID: <b86365431d4a9a8b0e4fcbb64a5ea056798ece1f.camel@intel.com> (raw) In-Reply-To: <20230216131213.2326-1-sivileri@microsoft.com> On Do, 2023-02-16 at 08:12 -0500, Sil Vilerino wrote: > These changes add support for VAAPI on Windows in hwcontext_vaapi > using vaGetDisplayWin32, also allowing for DirectX adapter index > selection via the "-device" command line argument. > > Libva 2.17+ adds a new libva-win32 node and Mesa 22.3 adds > a VAAPI driver based on Direct3D 12 for Windows, both available at: > https://www.nuget.org/packages/Microsoft.Direct3D.VideoAccelerationCompatibilityPack > > Initial review at https://github.com/intel-media-ci/ffmpeg/pull/619/ > > Additional changes were made to the changelog and minor version bump > as well as to QSV to not break with this new change: > > - qsv_internal.h: Remove unnecessary include va_drm.h > - qsv_internal.h: Enable AVCODEC_QSV_LINUX_SESSION_HANDLE on Linux/VA only > - hwcontext_qsv.c: Do not allow child_device_type VAAPI for Windows > until support is added, keep D3D11/DXVA2 as more prioritary defaults. > > Signed-off-by: Sil Vilerino <sivileri@microsoft.com> > Reviewed-by: Dmitry Rogozhkin <dmitry.v.rogozhkin@intel.com> > Reviewed-by: Wu, Tong1 <tong1.wu@intel.com> > --- > Changelog | 2 +- > configure | 27 ++++++++++++- > fftools/ffmpeg_opt.c | 2 +- > libavcodec/qsv_internal.h | 5 +-- > libavutil/hwcontext_qsv.c | 14 ++++++- > libavutil/hwcontext_vaapi.c | 75 ++++++++++++++++++++++++++++++++++++- > libavutil/tests/hwdevice.c | 2 +- > libavutil/version.h | 2 +- > 8 files changed, 117 insertions(+), 12 deletions(-) > > diff --git a/Changelog b/Changelog > index 0644f39d59..9248a07043 100644 > --- a/Changelog > +++ b/Changelog > @@ -44,7 +44,7 @@ version <next>: > - RKA decoder and demuxer > - filtergraph syntax in ffmpeg CLI now supports passing file contents > as option values, by prefixing option name with '/' > -- hstack_qsv, vstack_qsv and xstack_qsv filters > +- Extend VAAPI support for libva-win32 on Windows > You should not remove the last line. BTW please document your change in version <next> now. > > version 5.1: > diff --git a/configure b/configure > index bf8ae1c789..01fe0378f3 100755 > --- a/configure > +++ b/configure > @@ -2314,6 +2314,7 @@ SYSTEM_LIBRARIES=" > bcrypt > vaapi_drm > vaapi_x11 > + vaapi_win32 > vdpau_x11 > " > > @@ -3828,7 +3829,7 @@ swscale_suggest="libm stdatomic" > > avcodec_extralibs="pthreads_extralibs iconv_extralibs dxva2_extralibs > lcms2_extralibs" > avfilter_extralibs="pthreads_extralibs" > -avutil_extralibs="d3d11va_extralibs nanosleep_extralibs pthreads_extralibs > vaapi_drm_extralibs vaapi_x11_extralibs vdpau_x11_extralibs" > +avutil_extralibs="d3d11va_extralibs nanosleep_extralibs pthreads_extralibs > vaapi_drm_extralibs vaapi_x11_extralibs vaapi_win32_extralibs > vdpau_x11_extralibs" > > # programs > ffmpeg_deps="avcodec avfilter avformat threads" > @@ -6945,6 +6946,21 @@ test_cpp <<EOF && enable uwp && d3d11va_extralibs="- > ldxgi -ld3d11" > #endif > EOF > > +# vaapi_win32 requires linking directly to dxgi if not building for > +# the desktop api partition > +test_cpp <<EOF && enable uwp && vaapi_win32_extralibs="-ldxgi" > +#ifdef WINAPI_FAMILY > +#include <winapifamily.h> > +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) > +#error desktop, not uwp > +#else > +// WINAPI_FAMILY_APP, WINAPI_FAMILY_PHONE_APP => UWP > +#endif > +#else > +#error no family set > +#endif > +EOF > + > # mediafoundation requires linking directly to mfplat if building for uwp > target > enabled uwp && mediafoundation_extralibs="-lmfplat -lmfuuid -lole32 - > lstrmiids" || mediafoundation_extralibs="-lmfuuid -lole32 -lstrmiids" > > @@ -6955,7 +6971,14 @@ enabled vaapi && > check_pkg_config vaapi "libva >= 0.35.0" "va/va.h" vaInitialize > > if enabled vaapi; then > - check_pkg_config vaapi_drm "libva-drm" "va/va_drm.h" vaGetDisplayDRM > + case $target_os in > + mingw32*|mingw64*|win32|win64) > + check_pkg_config vaapi_win32 "libva-win32" "va/va_win32.h" > vaGetDisplayWin32 > + ;; > + *) > + check_pkg_config vaapi_drm "libva-drm" "va/va_drm.h" > vaGetDisplayDRM > + ;; > + esac > > if enabled xlib_x11; then > check_pkg_config vaapi_x11 "libva-x11" "va/va_x11.h" vaGetDisplay > diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c > index 055275d813..043cf539a5 100644 > --- a/fftools/ffmpeg_opt.c > +++ b/fftools/ffmpeg_opt.c > @@ -1758,7 +1758,7 @@ const OptionDef options[] = { > > #if CONFIG_VAAPI > { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device }, > - "set VAAPI hardware device (DRM path or X11 display name)", "device" > }, > + "set VAAPI hardware device (DirectX adapter index, DRM path or X11 > display name)", "device" }, > #endif Please update the description about device under vaapi section in doc/ffmpeg.texi. > > #if CONFIG_QSV > diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h > index 5119ef4dff..df5e1e05ca 100644 > --- a/libavcodec/qsv_internal.h > +++ b/libavcodec/qsv_internal.h > @@ -23,9 +23,9 @@ > > #include "config.h" > > -#if CONFIG_VAAPI > +#if CONFIG_VAAPI && !_WIN32 // Do not enable for libva-win32 on Windows > #define AVCODEC_QSV_LINUX_SESSION_HANDLE > -#endif //CONFIG_VAAPI > +#endif //CONFIG_VAAPI && !_WIN32 > > #ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE > #include <stdio.h> > @@ -35,7 +35,6 @@ > #endif > #include <fcntl.h> > #include <va/va.h> > -#include <va/va_drm.h> > #include "libavutil/hwcontext_vaapi.h" > #endif > > diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c > index 42851d4fd5..14fa8eec87 100644 > --- a/libavutil/hwcontext_qsv.c > +++ b/libavutil/hwcontext_qsv.c > @@ -2126,8 +2126,6 @@ static int qsv_device_create(AVHWDeviceContext *ctx, > const char *device, > "\"%s\".\n", e->value); > return AVERROR(EINVAL); > } > - } else if (CONFIG_VAAPI) { > - child_device_type = AV_HWDEVICE_TYPE_VAAPI; > #if QSV_ONEVPL > } else if (CONFIG_D3D11VA) { // Use D3D11 by default if d3d11va is > enabled > av_log(ctx, AV_LOG_VERBOSE, > @@ -2147,11 +2145,23 @@ static int qsv_device_create(AVHWDeviceContext *ctx, > const char *device, > } else if (CONFIG_D3D11VA) { > child_device_type = AV_HWDEVICE_TYPE_D3D11VA; > #endif > + } else if (CONFIG_VAAPI) { > + child_device_type = AV_HWDEVICE_TYPE_VAAPI; > } else { > av_log(ctx, AV_LOG_ERROR, "No supported child device type is > enabled\n"); > return AVERROR(ENOSYS); > } > > +#if CONFIG_VAAPI && _WIN32 > + /* AV_HWDEVICE_TYPE_VAAPI on Windows/Libva-win32 not supported */ > + /* Reject user specified child_device_type or CONFIG_VAAPI on Windows */ > + if (child_device_type == AV_HWDEVICE_TYPE_VAAPI) { > + av_log(ctx, AV_LOG_ERROR, "VAAPI child device type not supported for > oneVPL on Windows" > + "\"%s\".\n", e->value); > + return AVERROR(EINVAL); > + } > +#endif > + > child_device_opts = NULL; > switch (child_device_type) { > #if CONFIG_VAAPI > diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c > index 938bd5447d..8da2f3196c 100644 > --- a/libavutil/hwcontext_vaapi.c > +++ b/libavutil/hwcontext_vaapi.c > @@ -18,6 +18,15 @@ > > #include "config.h" > > +#if HAVE_VAAPI_WIN32 > +# include <windows.h> > +#define COBJMACROS > +# include <initguid.h> > +# include <dxgi1_2.h> > +# include "compat/w32dlfcn.h" > +# include <va/va_win32.h> > +typedef HRESULT (WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void > **ppFactory); > +#endif > #if HAVE_VAAPI_X11 > # include <va/va_x11.h> > #endif > @@ -1654,7 +1663,7 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, > const char *device, > VAAPIDevicePriv *priv; > VADisplay display = NULL; > const AVDictionaryEntry *ent; > - int try_drm, try_x11, try_all; > + int try_drm, try_x11, try_win32, try_all; > > priv = av_mallocz(sizeof(*priv)); > if (!priv) > @@ -1672,6 +1681,8 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, > const char *device, > try_drm = 1; > } else if (!strcmp(ent->value, "x11")) { > try_x11 = 1; > + } else if (!strcmp(ent->value, "win32")) { > + try_win32 = 1; > } else { > av_log(ctx, AV_LOG_ERROR, "Invalid connection type %s.\n", > ent->value); > @@ -1681,6 +1692,7 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, > const char *device, > try_all = 1; > try_drm = HAVE_VAAPI_DRM; > try_x11 = HAVE_VAAPI_X11; > + try_win32 = HAVE_VAAPI_WIN32; > } > > #if HAVE_VAAPI_DRM > @@ -1788,6 +1800,67 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, > const char *device, > } > #endif > > +#if HAVE_VAAPI_WIN32 > + if (!display && try_win32) { > + // Try to create a display from the specified device, if any. > + if (!device) { > + display = vaGetDisplayWin32(NULL); > + } else { > + IDXGIFactory2 *pDXGIFactory = NULL; > + IDXGIAdapter *pAdapter = NULL; > +#if !HAVE_UWP > + HANDLE dxgi = dlopen("dxgi.dll", 0); > + if (!dxgi) { > + av_log(ctx, AV_LOG_ERROR, "Failed to load dxgi.dll\n"); > + return AVERROR_UNKNOWN; > + } > + PFN_CREATE_DXGI_FACTORY pfnCreateDXGIFactory = > + (PFN_CREATE_DXGI_FACTORY)dlsym(dxgi, "CreateDXGIFactory"); > + if (!pfnCreateDXGIFactory) { > + av_log(ctx, AV_LOG_ERROR, "CreateDXGIFactory load failed\n"); > + return AVERROR_UNKNOWN; dxgi is not closed in the error path. Thanks Haihao > + } > +#else > + // In UWP (which lacks LoadLibrary), CreateDXGIFactory isn't > + // available, only CreateDXGIFactory1 > + PFN_CREATE_DXGI_FACTORY pfnCreateDXGIFactory = > + (PFN_CREATE_DXGI_FACTORY)CreateDXGIFactory1; > +#endif > + if (SUCCEEDED(pfnCreateDXGIFactory(&IID_IDXGIFactory2, > + (void **)&pDXGIFactory))) { > + int adapter = atoi(device); > + if (SUCCEEDED(IDXGIFactory2_EnumAdapters(pDXGIFactory, > + adapter, > + &pAdapter))) { > + DXGI_ADAPTER_DESC desc; > + if (SUCCEEDED(IDXGIAdapter2_GetDesc(pAdapter, &desc))) { > + av_log(ctx, AV_LOG_INFO, > + "Using device %04x:%04x (%ls) - LUID %lu > %ld.\n", > + desc.VendorId, desc.DeviceId, desc.Description, > + desc.AdapterLuid.LowPart, > + desc.AdapterLuid.HighPart); > + display = vaGetDisplayWin32(&desc.AdapterLuid); > + } > + IDXGIAdapter_Release(pAdapter); > + } > + IDXGIFactory2_Release(pDXGIFactory); > + } > +#if !HAVE_UWP > + dlclose(dxgi); > +#endif > + } > + > + if (!display) { > + av_log(ctx, AV_LOG_ERROR, "Cannot open a VA display " > + "from Win32 display.\n"); > + return AVERROR_UNKNOWN; > + } > + > + av_log(ctx, AV_LOG_VERBOSE, "Opened VA display via " > + "Win32 display.\n"); > + } > +#endif > + > if (!display) { > if (device) > av_log(ctx, AV_LOG_ERROR, "No VA display found for " > diff --git a/libavutil/tests/hwdevice.c b/libavutil/tests/hwdevice.c > index 7eb355c988..c57586613a 100644 > --- a/libavutil/tests/hwdevice.c > +++ b/libavutil/tests/hwdevice.c > @@ -140,7 +140,7 @@ static const struct { > { AV_HWDEVICE_TYPE_OPENCL, > { "0.0", "0.1", "1.0", "1.1" } }, > { AV_HWDEVICE_TYPE_VAAPI, > - { "/dev/dri/renderD128", "/dev/dri/renderD129", ":0" } }, > + { "/dev/dri/renderD128", "/dev/dri/renderD129", ":0", "0", "1" } }, > }; > > static int test_device_type(enum AVHWDeviceType type) > diff --git a/libavutil/version.h b/libavutil/version.h > index 11b4387f64..e8ec604349 100644 > --- a/libavutil/version.h > +++ b/libavutil/version.h > @@ -79,7 +79,7 @@ > */ > > #define LIBAVUTIL_VERSION_MAJOR 58 > -#define LIBAVUTIL_VERSION_MINOR 1 > +#define LIBAVUTIL_VERSION_MINOR 2 > #define LIBAVUTIL_VERSION_MICRO 100 > > #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ _______________________________________________ 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".
prev parent reply other threads:[~2023-03-21 4:00 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-02-16 13:12 Sil Vilerino 2023-03-21 4:00 ` Xiang, Haihao [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=b86365431d4a9a8b0e4fcbb64a5ea056798ece1f.camel@intel.com \ --to=haihao.xiang-at-intel.com@ffmpeg.org \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git