37 DEFINE_GUID(ff_DXVA2_ModeMPEG2_VLD,      0xee27417f, 0x5e28,0x4e65,0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9);
 
   38 DEFINE_GUID(ff_DXVA2_ModeMPEG2and1_VLD,  0x86695f12, 0x340e,0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60);
 
   39 DEFINE_GUID(ff_DXVA2_ModeH264_E,         0x1b81be68, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   40 DEFINE_GUID(ff_DXVA2_ModeH264_F,         0x1b81be69, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   41 DEFINE_GUID(ff_DXVADDI_Intel_ModeH264_E, 0x604F8E68, 0x4951,0x4C54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6);
 
   42 DEFINE_GUID(ff_DXVA2_ModeVC1_D,          0x1b81beA3, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   43 DEFINE_GUID(ff_DXVA2_ModeVC1_D2010,      0x1b81beA4, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   44 DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main,  0x5b11d51b, 0x2f4c,0x4452,0xbc,0xc3,0x09,0xf2,0xa1,0x16,0x0c,0xc0);
 
   45 DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main10,0x107af0e0, 0xef1a,0x4d19,0xab,0xa8,0x67,0xa1,0x63,0x07,0x3d,0x13);
 
   46 DEFINE_GUID(ff_DXVA2_ModeVP9_VLD_Profile0,0x463707f8,0xa1d0,0x4585,0x87,0x6d,0x83,0xaa,0x6d,0x60,0xb8,0x9e);
 
   47 DEFINE_GUID(ff_DXVA2_ModeVP9_VLD_10bit_Profile2,0xa4c749ef,0x6ecf,0x48aa,0x84,0x48,0x50,0xa7,0xa1,0x16,0x5f,0xf7);
 
   48 DEFINE_GUID(ff_DXVA2_ModeAV1_VLD_Profile0,0xb8be4ccb,0xcf53,0x46ba,0x8d,0x59,0xd6,0xb8,0xa6,0xda,0x5d,0x2a);
 
   49 DEFINE_GUID(ff_DXVA2_NoEncrypt,          0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   50 DEFINE_GUID(ff_GUID_NULL,                0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
 
   51 DEFINE_GUID(ff_IID_IDirectXVideoDecoderService, 0xfc51a551,0xd5e7,0x11d9,0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02);
 
  111                                           const void *cfg_list,
 
  115     unsigned i, best_score = 0;
 
  118     for (
i = 0; 
i < cfg_count; 
i++) {
 
  120         UINT ConfigBitstreamRaw;
 
  121         GUID guidConfigBitstreamEncryption;
 
  125             D3D11_VIDEO_DECODER_CONFIG *cfg = &((D3D11_VIDEO_DECODER_CONFIG *)cfg_list)[
i];
 
  126             ConfigBitstreamRaw = cfg->ConfigBitstreamRaw;
 
  127             guidConfigBitstreamEncryption = cfg->guidConfigBitstreamEncryption;
 
  132             DXVA2_ConfigPictureDecode *cfg = &((DXVA2_ConfigPictureDecode *)cfg_list)[
i];
 
  133             ConfigBitstreamRaw = cfg->ConfigBitstreamRaw;
 
  134             guidConfigBitstreamEncryption = cfg->guidConfigBitstreamEncryption;
 
  138         if (ConfigBitstreamRaw == 1)
 
  144         if (IsEqualGUID(&guidConfigBitstreamEncryption, &ff_DXVA2_NoEncrypt))
 
  146         if (score > best_score) {
 
  161 static int d3d11va_validate_output(
void *service, GUID guid, 
const void *surface_format)
 
  165     hr = ID3D11VideoDevice_CheckVideoDecoderFormat((ID3D11VideoDevice *)service,
 
  167                                                    *(DXGI_FORMAT *)surface_format,
 
  174 static int dxva2_validate_output(
void *decoder_service, GUID guid, 
const void *surface_format)
 
  178     unsigned j, target_count;
 
  179     D3DFORMAT *target_list;
 
  180     hr = IDirectXVideoDecoderService_GetDecoderRenderTargets((IDirectXVideoDecoderService *)decoder_service, &guid, &target_count, &target_list);
 
  182         for (j = 0; j < target_count; j++) {
 
  183             const D3DFORMAT 
format = target_list[j];
 
  184             if (
format == *(D3DFORMAT *)surface_format) {
 
  189         CoTaskMemFree(target_list);
 
  216                                  unsigned guid_count, 
const GUID *guid_list)
 
  223     for (
i = 0; 
i < guid_count; 
i++) {
 
  224         const GUID *guid = &guid_list[
i];
 
  227              "{%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x}",
 
  228              (
unsigned) guid->Data1, guid->Data2, guid->Data3,
 
  229              guid->Data4[0], guid->Data4[1],
 
  230              guid->Data4[2], guid->Data4[3],
 
  231              guid->Data4[4], guid->Data4[5],
 
  232              guid->Data4[6], guid->Data4[7]);
 
  240                 if (d3d11va_validate_output(service, *guid, &
format))
 
  248                                          MKTAG(
'P', 
'0', 
'1', 
'0')};
 
  251                 if (dxva2_validate_output(service, *guid, &
formats[
i]))
 
  261                                  unsigned guid_count, 
const GUID *guid_list, GUID *decoder_guid)
 
  268     *decoder_guid = ff_GUID_NULL;
 
  275         for (j = 0; j < guid_count; j++) {
 
  276             if (IsEqualGUID(
mode->guid, &guid_list[j]))
 
  284             validate = d3d11va_validate_output(service, *
mode->guid, surface_format);
 
  288             validate = dxva2_validate_output(service, *
mode->guid, surface_format);
 
  291             *decoder_guid = *
mode->guid;
 
  296     if (IsEqualGUID(decoder_guid, &ff_GUID_NULL)) {
 
  301     if (IsEqualGUID(decoder_guid, &ff_DXVADDI_Intel_ModeH264_E))
 
  309     IUnknown_Release((IUnknown *)opaque);
 
  319 static int dxva2_get_decoder_configuration(
AVCodecContext *avctx, 
const GUID *device_guid,
 
  320                                            const DXVA2_VideoDesc *
desc,
 
  321                                            DXVA2_ConfigPictureDecode *
config)
 
  325     DXVA2_ConfigPictureDecode *cfg_list;
 
  329     hr = IDirectXVideoDecoderService_GetDecoderConfigurations(sctx->dxva2_service, device_guid, 
desc, 
NULL, &cfg_count, &cfg_list);
 
  338     CoTaskMemFree(cfg_list);
 
  349                                MKTAG(
'P', 
'0', 
'1', 
'0') : 
MKTAG(
'N', 
'V', 
'1', 
'2');
 
  350     DXVA2_VideoDesc 
desc = { 0 };
 
  351     DXVA2_ConfigPictureDecode 
config;
 
  354     HANDLE device_handle;
 
  359     hr = IDirect3DDeviceManager9_OpenDeviceHandle(device_hwctx->devmgr,
 
  366     hr = IDirect3DDeviceManager9_GetVideoService(device_hwctx->devmgr, device_handle,
 
  367                                                  &ff_IID_IDirectXVideoDecoderService,
 
  368                                                  (
void **)&sctx->dxva2_service);
 
  369     IDirect3DDeviceManager9_CloseDeviceHandle(device_hwctx->devmgr, device_handle);
 
  375     hr = IDirectXVideoDecoderService_GetDecoderDeviceGuids(sctx->dxva2_service, &guid_count, &guid_list);
 
  382                                 guid_count, guid_list, &device_guid);
 
  383     CoTaskMemFree(guid_list);
 
  390     desc.Format       = surface_format;
 
  392     ret = dxva2_get_decoder_configuration(avctx, &device_guid, &
desc, &
config);
 
  397     hr = IDirectXVideoDecoderService_CreateVideoDecoder(sctx->dxva2_service, &device_guid,
 
  399                                                         frames_hwctx->nb_surfaces, &sctx->dxva2_decoder);
 
  405     sctx->dxva2_config = 
config;
 
  420 static int d3d11va_get_decoder_configuration(
AVCodecContext *avctx,
 
  421                                              ID3D11VideoDevice *video_device,
 
  422                                              const D3D11_VIDEO_DECODER_DESC *
desc,
 
  423                                              D3D11_VIDEO_DECODER_CONFIG *
config)
 
  425     unsigned cfg_count = 0;
 
  426     D3D11_VIDEO_DECODER_CONFIG *cfg_list = 
NULL;
 
  430     hr = ID3D11VideoDevice_GetVideoDecoderConfigCount(video_device, 
desc, &cfg_count);
 
  436     cfg_list = 
av_malloc_array(cfg_count, 
sizeof(D3D11_VIDEO_DECODER_CONFIG));
 
  437     if (cfg_list == 
NULL)
 
  439     for (
i = 0; 
i < cfg_count; 
i++) {
 
  440         hr = ID3D11VideoDevice_GetVideoDecoderConfig(video_device, 
desc, 
i, &cfg_list[
i]);
 
  442             av_log(avctx, 
AV_LOG_ERROR, 
"Unable to retrieve decoder configurations. (hr=0x%lX)\n", hr);
 
  461     default:                    
return DXGI_FORMAT_UNKNOWN;
 
  469     unsigned guid_count, 
i;
 
  471     D3D11_VIDEO_DECODER_DESC 
desc = { 0 };
 
  472     D3D11_VIDEO_DECODER_CONFIG 
config;
 
  476     DXGI_FORMAT surface_format = d3d11va_map_sw_to_hw_format(frames_ctx->
sw_format);
 
  477     D3D11_TEXTURE2D_DESC texdesc;
 
  481     if (!frames_hwctx->texture) {
 
  485     ID3D11Texture2D_GetDesc(frames_hwctx->texture, &texdesc);
 
  487     guid_count = ID3D11VideoDevice_GetVideoDecoderProfileCount(device_hwctx->video_device);
 
  489     if (guid_list == 
NULL || guid_count == 0) {
 
  494     for (
i = 0; 
i < guid_count; 
i++) {
 
  495         hr = ID3D11VideoDevice_GetVideoDecoderProfile(device_hwctx->video_device, 
i, &guid_list[
i]);
 
  504                                 guid_count, guid_list, &decoder_guid);
 
  511     desc.OutputFormat = surface_format;
 
  512     desc.Guid         = decoder_guid;
 
  514     ret = d3d11va_get_decoder_configuration(avctx, device_hwctx->video_device, &
desc, &
config);
 
  518     sctx->d3d11_views = 
av_calloc(texdesc.ArraySize, 
sizeof(sctx->d3d11_views[0]));
 
  519     if (!sctx->d3d11_views)
 
  521     sctx->nb_d3d11_views = texdesc.ArraySize;
 
  523     for (
i = 0; 
i < sctx->nb_d3d11_views; 
i++) {
 
  524         D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc = {
 
  525             .DecodeProfile = decoder_guid,
 
  526             .ViewDimension = D3D11_VDOV_DIMENSION_TEXTURE2D,
 
  531         hr = ID3D11VideoDevice_CreateVideoDecoderOutputView(device_hwctx->video_device,
 
  532                                                             (ID3D11Resource*) frames_hwctx->texture,
 
  534                                                             (ID3D11VideoDecoderOutputView**) &sctx->d3d11_views[
i]);
 
  541     hr = ID3D11VideoDevice_CreateVideoDecoder(device_hwctx->video_device, &
desc,
 
  542                                               &
config, &sctx->d3d11_decoder);
 
  548     sctx->d3d11_config = 
config;
 
  549     sctx->d3d11_texture = frames_hwctx->texture;
 
  597     int surface_alignment, num_surfaces;
 
  610         surface_alignment = 32;
 
  614         surface_alignment = 128;
 
  616         surface_alignment = 16;
 
  640         frames_hwctx->
surface_type = DXVA2_VideoDecoderRenderTarget;
 
  648         frames_hwctx->
BindFlags |= D3D11_BIND_DECODER;
 
  689         ret = d3d11va_create_decoder(avctx);
 
  694         d3d11_ctx->
decoder       = sctx->d3d11_decoder;
 
  696         d3d11_ctx->
cfg           = &sctx->d3d11_config;
 
  698         d3d11_ctx->
surface       = sctx->d3d11_views;
 
  710         ret = dxva2_create_decoder(avctx);
 
  715         dxva_ctx->
decoder       = sctx->dxva2_decoder;
 
  716         dxva_ctx->
cfg           = &sctx->dxva2_config;
 
  738     for (
i = 0; 
i < sctx->nb_d3d11_views; 
i++) {
 
  739         if (sctx->d3d11_views[
i])
 
  740             ID3D11VideoDecoderOutputView_Release(sctx->d3d11_views[
i]);
 
  746     if (sctx->dxva2_service)
 
  747         IDirectXVideoDecoderService_Release(sctx->dxva2_service);
 
  759         if (index < 0 || index >= sctx->nb_d3d11_views ||
 
  760             sctx->d3d11_texture != (ID3D11Texture2D *)
frame->
data[0]) {
 
  764         return sctx->d3d11_views[
index];
 
  786         D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
 
  787         ID3D11VideoDecoderOutputView_GetDesc((ID3D11VideoDecoderOutputView*) 
surface, &viewDesc);
 
  788         return viewDesc.Texture2D.ArraySlice;
 
  818                                                  &dxva_size, &dxva_data);
 
  823                                             &dxva_data, &dxva_size);
 
  830     if (
size <= dxva_size) {
 
  835             D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = dsc;
 
  836             memset(dsc11, 0, 
sizeof(*dsc11));
 
  837             dsc11->BufferType           = 
type;
 
  838             dsc11->DataSize             = 
size;
 
  839             dsc11->NumMBsInBuffer       = mb_count;
 
  844             DXVA2_DecodeBufferDesc *dsc2 = dsc;
 
  845             memset(dsc2, 0, 
sizeof(*dsc2));
 
  846             dsc2->CompressedBufferType = 
type;
 
  847             dsc2->DataSize             = 
size;
 
  848             dsc2->NumMBsInBuffer       = mb_count;
 
  868                "Failed to release buffer type %u: 0x%x\n",
 
  892                               const void *pp, 
unsigned pp_size,
 
  893                               const void *qm, 
unsigned qm_size,
 
  899     unsigned               buffer_count = 0;
 
  901     D3D11_VIDEO_DECODER_BUFFER_DESC buffer11[4];
 
  904     DXVA2_DecodeBufferDesc          buffer2[4];
 
  932         if (hr != E_PENDING || ++runs > 50)
 
  946         buffer = &buffer11[buffer_count];
 
  947         type = D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS;
 
  952         buffer = &buffer2[buffer_count];
 
  953         type = DXVA2_PictureParametersBufferType;
 
  961                "Failed to add picture parameter buffer\n");
 
  969             buffer = &buffer11[buffer_count];
 
  970             type = D3D11_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX;
 
  975             buffer = &buffer2[buffer_count];
 
  976             type = DXVA2_InverseQuantizationMatrixBufferType;
 
  984                    "Failed to add inverse quantization matrix buffer\n");
 
  992         buffer       = &buffer11[buffer_count + 0];
 
  993         buffer_slice = &buffer11[buffer_count + 1];
 
  998         buffer       = &buffer2[buffer_count + 0];
 
  999         buffer_slice = &buffer2[buffer_count + 1];
 
 1003     result = commit_bs_si(avctx,
 
 1008                "Failed to add bitstream or slice control buffer\n");
 
 1015     av_assert0(buffer_count == 1 + (qm_size > 0) + 2);
 
 1021                                                      buffer_count, buffer11);
 
 1025         DXVA2_DecodeExecuteParams exec = {
 
 1026             .NumCompBuffers     = buffer_count,
 
 1027             .pCompressedBuffers = buffer2,
 
 1028             .pExtensionData     = 
NULL,