Message ID | AM6PR02MB402208E5C01F0D0AEC33DFE9ED0DA@AM6PR02MB4022.eurprd02.prod.outlook.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] Fix failure to initialize ddagrab if adapter ID is specified | expand |
Context | Check | Description |
---|---|---|
yinshiyou/commit_msg_loongarch64 | warning | The first line of the commit message must start with a context terminated by a colon and a space, for example "lavu/opt: " or "doc: ". |
andriy/commit_msg_x86 | warning | The first line of the commit message must start with a context terminated by a colon and a space, for example "lavu/opt: " or "doc: ". |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On 8/8/2023 2:52 PM, Jøger Hansegård wrote: > Fix failure to initialize ddagrab if adapter ID is specified. > > If an adapter ID is specified when initializing hw device for d3d11va, > ddagrab does not work on Windows 11. This prevents capturing screens > connected to a secondary adapter. > > Failing command: > ffmpeg -init_hw_device d3d11va:0 -filter_complex ddagrab=0,hwdownload,format=bgra -c:v h264_mf output.mkv > > The reason is that d3d11va_device_create uses CreateDXGIFactory to > create a DXGIFactory 1.0. This causes init_dxgi_dda's call to > IDXGIOutput5_DuplicateOutput1 to fail because it is only supported on > DXGI 1.1 and higher. > > The fix is to always crate DXGI factory using CreateDXGIFactory1 as > proposed in this patch. > > Fixes: #10385 > --- > libavutil/hwcontext_d3d11va.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c > index aa50538d64..fa8d5410f2 100644 > --- a/libavutil/hwcontext_d3d11va.c > +++ b/libavutil/hwcontext_d3d11va.c > @@ -62,7 +62,7 @@ static av_cold void load_functions(void) > return; > > mD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE) GetProcAddress(d3dlib, "D3D11CreateDevice"); > - mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory"); > + mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory1"); > #else > // In UWP (which lacks LoadLibrary), CreateDXGIFactory isn't available, > // only CreateDXGIFactory1 > -- > 2.40.1.windows.1 LGTM, but i wonder why are we using IDXGIFactory2 and its functions in hwcontext_d3d11va if we use DXGI 1.1? Maybe we could do the following: > diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c > index aa50538d64..fb6f240c56 100644 > --- a/libavutil/hwcontext_d3d11va.c > +++ b/libavutil/hwcontext_d3d11va.c > @@ -24,7 +24,7 @@ > > #include <initguid.h> > #include <d3d11.h> > -#include <dxgi1_2.h> > +#include <dxgi.h> > > #if HAVE_DXGIDEBUG_H > #include <dxgidebug.h> > @@ -62,7 +62,7 @@ static av_cold void load_functions(void) > return; > > mD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE) GetProcAddress(d3dlib, "D3D11CreateDevice"); > - mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory"); > + mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory1"); > #else > // In UWP (which lacks LoadLibrary), CreateDXGIFactory isn't available, > // only CreateDXGIFactory1 > @@ -581,19 +581,19 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, > } > > if (device) { > - IDXGIFactory2 *pDXGIFactory; > - hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&pDXGIFactory); > + IDXGIFactory1 *pDXGIFactory; > + hr = mCreateDXGIFactory(&IID_IDXGIFactory1, (void **)&pDXGIFactory); > if (SUCCEEDED(hr)) { > int adapter = atoi(device); > - if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter))) > + if (FAILED(IDXGIFactory1_EnumAdapters(pDXGIFactory, adapter, &pAdapter))) > pAdapter = NULL; > - IDXGIFactory2_Release(pDXGIFactory); > + IDXGIFactory1_Release(pDXGIFactory); > } > } > > if (pAdapter) { > DXGI_ADAPTER_DESC desc; > - hr = IDXGIAdapter2_GetDesc(pAdapter, &desc); > + hr = IDXGIAdapter1_GetDesc(pAdapter, &desc); > if (!FAILED(hr)) { > av_log(ctx, AV_LOG_INFO, "Using device %04x:%04x (%ls).\n", > desc.VendorId, desc.DeviceId, desc.Description); Not sure what Martin thinks.
diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c index aa50538d64..fa8d5410f2 100644 --- a/libavutil/hwcontext_d3d11va.c +++ b/libavutil/hwcontext_d3d11va.c @@ -62,7 +62,7 @@ static av_cold void load_functions(void) return; mD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE) GetProcAddress(d3dlib, "D3D11CreateDevice"); - mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory"); + mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory1"); #else // In UWP (which lacks LoadLibrary), CreateDXGIFactory isn't available, // only CreateDXGIFactory1