[FFmpeg-trac] #7108(avutil:new): d3d11va_device_create() crashes when the graphics device is disabled.

FFmpeg trac at avcodec.org
Mon Mar 26 06:16:11 EEST 2018

#7108: d3d11va_device_create() crashes when the graphics device is disabled.
             Reporter:  haviet       |                     Type:  defect
               Status:  new          |                 Priority:  important
            Component:  avutil       |                  Version:  3.4
             Keywords:  d3d11va      |               Blocked By:
  crash                              |  Reproduced by developer:  1
             Blocking:               |
Analyzed by developer:  0            |
 Summary of the bug:
 1) Environment:
 Purpose: Decoding video via HW Acceleration
         Before the crash: It decodes video well via both CUDA, DXVA2 and
         Crash condition: Disables the graphics device.
         Graphics device: NVIDIA
         OS: Windows 10 x64 Pro
         ffmpeg version N-90264-g80798e3857 Copyright (c) 2000-2018 the
 FFmpeg developers
   built with Microsoft (R) C/C++ Optimizing Compiler Version 19.13.26128
 for x64
   configuration: --toolchain=msvc --arch=x86_64 --target-os=win64
         libavutil      56.  8.100 / 56.  8.100
         libavcodec     58. 14.100 / 58. 14.100
         libavformat    58. 10.100 / 58. 10.100
         libavdevice    58.  2.100 / 58.  2.100

 2) How to reproduce:
         In Windows 10 OS, go to the menu as below and disable the graphics
         Computer Manager -> Device Manager -> Display adapters -> Graphics

 Then make a call to the function
         av_hwdevice_ctx_create(&pHwDeviceCtx, AV_HWDEVICE_TYPE_D3D11VA,
 "hw", nullptr, 0);

         This shall trigger the crash in d3d11va_device_create() function.
         The order of calls leading to the crash is:
         -> av_hwdevice_ctx_create
         -> d3d11va_device_create
         -> ID3D11Device_QueryInterface

         Note that I had tried other device types as below, though the
 function return an error but it did not cause crash.

     AV_HWDEVICE_TYPE_QSV,       <-- OK
     AV_HWDEVICE_TYPE_D3D11VA,   <-- crashed


 //      function is crashed
 static int d3d11va_device_create(AVHWDeviceContext *ctx, const char
                                  AVDictionary *opts, int flags)
     AVD3D11VADeviceContext *device_hwctx = ctx->hwctx;

     //  other lines ...

     hr = mD3D11CreateDevice(pAdapter, pAdapter ? D3D_DRIVER_TYPE_UNKNOWN :
                    D3D11_SDK_VERSION, &device_hwctx->device, NULL, NULL);

 //      Right here the hr status is:
         hr = 0x887a0004 : The specified device interface or feature level
 is not supported on this system.

         // The block "if (FAILED(hr))" should be placed here.

     if (pAdapter) {
         DXGI_ADAPTER_DESC2 desc;
         hr = IDXGIAdapter2_GetDesc(pAdapter, &desc);
         if (!FAILED(hr)) {
             av_log(ctx, AV_LOG_INFO, "Using device %04x:%04x (%ls).\n",
                    desc.VendorId, desc.DeviceId, desc.Description);
     if (FAILED(hr)) {
         av_log(ctx, AV_LOG_ERROR, "Failed to create Direct3D device
 (%lx)\n", (long)hr);
         return AVERROR_UNKNOWN;

         //      Crashed here due to device_hwctx->device is NULL
     hr = ID3D11Device_QueryInterface(device_hwctx->device,
 &IID_ID3D10Multithread, (void **)&pMultithread);
     if (SUCCEEDED(hr)) {
         ID3D10Multithread_SetMultithreadProtected(pMultithread, TRUE);


 I realized that the call to mD3D11CreateDevice() returns
 hr = 0x887a0004 : "The specified device interface or feature level is not
 supported on this system."
 But hr value is not checked before moving to the next statement.
 That is the cause.

Ticket URL: <https://trac.ffmpeg.org/ticket/7108>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list