@@ -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);
}
}