[FFmpeg-devel] [PATCH v5 3/9] libavutil/hwcontext_d3d11va: adding the vendor option to d3d11va device creation
artem.galin at gmail.com
artem.galin at gmail.com
Mon May 18 21:55:02 EEST 2020
From: Artem Galin <artem.galin at intel.com>
Example: --init_hw_device d3d11va:,vendor=0x8086
qsv_device option is still works and has higher priority over vendor
option.
Signed-off-by: Artem Galin <artem.galin at intel.com
---
libavutil/hwcontext_d3d11va.c | 39 +++++++++++++++++++++++++++++++++--
1 file changed, 37 insertions(+), 2 deletions(-)
diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
index c8ae58f908..b644a0a4fd 100644
--- a/libavutil/hwcontext_d3d11va.c
+++ b/libavutil/hwcontext_d3d11va.c
@@ -517,9 +517,12 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device,
AVD3D11VADeviceContext *device_hwctx = ctx->hwctx;
HRESULT hr;
+ AVDictionaryEntry *e;
IDXGIAdapter *pAdapter = NULL;
ID3D10Multithread *pMultithread;
UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
+ int adapter = -1;
+ long int vendor_id = -1;
int is_debug = !!av_dict_get(opts, "debug", NULL, 0);
int ret;
@@ -539,13 +542,45 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device,
return AVERROR_UNKNOWN;
}
+ e = av_dict_get(opts, "vendor", NULL, 0);
+ if (e) {
+ vendor_id = strtol(e->value, NULL, 0);
+ }
+
if (device) {
+ adapter = atoi(device);
+ }
+
+ if (adapter >= 0 || vendor_id != -1) {
IDXGIFactory2 *pDXGIFactory;
hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&pDXGIFactory);
if (SUCCEEDED(hr)) {
- int adapter = atoi(device);
- if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter)))
+ if (adapter < 0) {
+ int adapter_cnt = 0;
+ while (IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter_cnt++, &pAdapter) != DXGI_ERROR_NOT_FOUND) {
+ DXGI_ADAPTER_DESC adapter_desc;
+ hr = IDXGIAdapter2_GetDesc(pAdapter, &adapter_desc);
+ if (FAILED(hr)) {
+ av_log(ctx, AV_LOG_ERROR, "IDXGIAdapter2_GetDesc returned error with adapter id %d\n", adapter_cnt);
+ continue;
+ }
+
+ if (adapter_desc.VendorId == vendor_id) {
+ break;
+ }
+
+ if (adapter)
+ IDXGIAdapter_Release(pAdapter);
+ }
+ if (adapter_cnt < 0) {
+ av_log(ctx, AV_LOG_ERROR, "Failed to find d3d11va adapter by vendor id %ld\n", vendor_id);
+ IDXGIFactory2_Release(pDXGIFactory);
+ return AVERROR_UNKNOWN;
+ }
+ } else {
+ if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter)))
pAdapter = NULL;
+ }
IDXGIFactory2_Release(pDXGIFactory);
}
}
--
2.26.2
More information about the ffmpeg-devel
mailing list