24 #define _WIN32_WINNT 0x0600 
   25 #define DXVA2API_USE_BITFIELDS 
   46 DEFINE_GUID(IID_IDirectXVideoDecoderService, 0xfc51a551,0xd5e7,0x11d9,0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02);
 
   48 DEFINE_GUID(DXVA2_ModeMPEG2_VLD,      0xee27417f, 0x5e28,0x4e65,0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9);
 
   49 DEFINE_GUID(DXVA2_ModeMPEG2and1_VLD,  0x86695f12, 0x340e,0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60);
 
   50 DEFINE_GUID(DXVA2_ModeH264_E,         0x1b81be68, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   51 DEFINE_GUID(DXVA2_ModeH264_F,         0x1b81be69, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   52 DEFINE_GUID(DXVADDI_Intel_ModeH264_E, 0x604F8E68, 0x4951,0x4C54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6);
 
   53 DEFINE_GUID(DXVA2_ModeVC1_D,          0x1b81beA3, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   54 DEFINE_GUID(DXVA2_ModeVC1_D2010,      0x1b81beA4, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   55 DEFINE_GUID(DXVA2_ModeHEVC_VLD_Main,  0x5b11d51b, 0x2f4c,0x4452,0xbc,0xc3,0x09,0xf2,0xa1,0x16,0x0c,0xc0);
 
   56 DEFINE_GUID(DXVA2_NoEncrypt,          0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 
   57 DEFINE_GUID(GUID_NULL,                0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
 
  133                 IDirect3DSurface9_Release(ctx->
surfaces[i]);
 
  142         IDirectXVideoDecoder_Release(ctx->
decoder);
 
  166         IDirect3DDeviceManager9_Release(ctx->
d3d9devmgr);
 
  172         IDirect3D9_Release(ctx->
d3d9);
 
  198     IDirect3DSurface9_Release(w->
surface);
 
  199     IDirectXVideoDecoder_Release(w->
decoder);
 
  207     int i, old_unused = -1;
 
  208     LPDIRECT3DSURFACE9 surface;
 
  218     if (old_unused == -1) {
 
  233     if (!frame->
buf[0]) {
 
  240     IDirect3DSurface9_AddRef(w->
surface);
 
  242     IDirectXVideoDecoder_AddRef(w->
decoder);
 
  254     LPDIRECT3DSURFACE9 surface =  (LPDIRECT3DSURFACE9)frame->
data[3];
 
  257     D3DSURFACE_DESC    surfaceDesc;
 
  258     D3DLOCKED_RECT     LockedRect;
 
  262     IDirect3DSurface9_GetDesc(surface, &surfaceDesc);
 
  264     ctx->tmp_frame->width  = frame->
width;
 
  265     ctx->tmp_frame->height = frame->
height;
 
  272     hr = IDirect3DSurface9_LockRect(surface, &LockedRect, 
NULL, D3DLOCK_READONLY);
 
  283                         (
uint8_t*)LockedRect.pBits + LockedRect.Pitch * surfaceDesc.Height,
 
  284                         LockedRect.Pitch, frame->
width, frame->
height / 2);
 
  286     IDirect3DSurface9_UnlockRect(surface);
 
  309     D3DPRESENT_PARAMETERS d3dpp = {0};
 
  310     D3DDISPLAYMODE        d3ddm;
 
  311     unsigned resetToken = 0;
 
  312     UINT adapter = D3DADAPTER_DEFAULT;
 
  327         av_log(
NULL, loglevel, 
"Failed to load D3D9 library\n");
 
  332         av_log(
NULL, loglevel, 
"Failed to load DXVA2 library\n");
 
  338         av_log(
NULL, loglevel, 
"Failed to locate Direct3DCreate9\n");
 
  342     if (!createDeviceManager) {
 
  343         av_log(
NULL, loglevel, 
"Failed to locate DXVA2CreateDirect3DDeviceManager9\n");
 
  347     ctx->
d3d9 = createD3D(D3D_SDK_VERSION);
 
  349         av_log(
NULL, loglevel, 
"Failed to create IDirect3D object\n");
 
  358     IDirect3D9_GetAdapterDisplayMode(ctx->
d3d9, adapter, &d3ddm);
 
  359     d3dpp.Windowed         = 
TRUE;
 
  360     d3dpp.BackBufferWidth  = 640;
 
  361     d3dpp.BackBufferHeight = 480;
 
  362     d3dpp.BackBufferCount  = 0;
 
  363     d3dpp.BackBufferFormat = d3ddm.Format;
 
  364     d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
 
  365     d3dpp.Flags            = D3DPRESENTFLAG_VIDEO;
 
  367     hr = IDirect3D9_CreateDevice(ctx->
d3d9, adapter, D3DDEVTYPE_HAL, GetShellWindow(),
 
  368                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
 
  371         av_log(
NULL, loglevel, 
"Failed to create Direct3D device\n");
 
  375     hr = createDeviceManager(&resetToken, &ctx->
d3d9devmgr);
 
  377         av_log(
NULL, loglevel, 
"Failed to create Direct3D device manager\n");
 
  383         av_log(
NULL, loglevel, 
"Failed to bind Direct3D device to device manager\n");
 
  389         av_log(
NULL, loglevel, 
"Failed to open device handle\n");
 
  395         av_log(
NULL, loglevel, 
"Failed to create IDirectXVideoDecoderService\n");
 
  414                                            const DXVA2_VideoDesc *desc,
 
  415                                            DXVA2_ConfigPictureDecode *
config)
 
  420     unsigned cfg_count = 0, best_score = 0;
 
  421     DXVA2_ConfigPictureDecode *cfg_list = 
NULL;
 
  422     DXVA2_ConfigPictureDecode best_cfg = {{0}};
 
  426     hr = IDirectXVideoDecoderService_GetDecoderConfigurations(ctx->
decoder_service, device_guid, desc, 
NULL, &cfg_count, &cfg_list);
 
  428         av_log(
NULL, loglevel, 
"Unable to retrieve decoder configurations\n");
 
  432     for (i = 0; i < cfg_count; i++) {
 
  433         DXVA2_ConfigPictureDecode *cfg = &cfg_list[i];
 
  436         if (cfg->ConfigBitstreamRaw == 1)
 
  442         if (IsEqualGUID(&cfg->guidConfigBitstreamEncryption, &DXVA2_NoEncrypt))
 
  444         if (score > best_score) {
 
  449     CoTaskMemFree(cfg_list);
 
  452         av_log(
NULL, loglevel, 
"No valid decoder configuration available\n");
 
  467     unsigned guid_count = 0, i, j;
 
  468     GUID device_guid = GUID_NULL;
 
  469     D3DFORMAT target_format = 0;
 
  470     DXVA2_VideoDesc desc = { 0 };
 
  471     DXVA2_ConfigPictureDecode 
config;
 
  473     int surface_alignment;
 
  476     hr = IDirectXVideoDecoderService_GetDecoderDeviceGuids(ctx->
decoder_service, &guid_count, &guid_list);
 
  478         av_log(
NULL, loglevel, 
"Failed to retrieve decoder device GUIDs\n");
 
  482     for (i = 0; dxva2_modes[i].
guid; i++) {
 
  483         D3DFORMAT *target_list = 
NULL;
 
  484         unsigned target_count = 0;
 
  489         for (j = 0; j < guid_count; j++) {
 
  490             if (IsEqualGUID(mode->
guid, &guid_list[j]))
 
  496         hr = IDirectXVideoDecoderService_GetDecoderRenderTargets(ctx->
decoder_service, mode->
guid, &target_count, &target_list);
 
  500         for (j = 0; j < target_count; j++) {
 
  501             const D3DFORMAT format = target_list[j];
 
  502             if (format == 
MKTAG(
'N',
'V',
'1',
'2')) {
 
  503                 target_format = format;
 
  507         CoTaskMemFree(target_list);
 
  509             device_guid = *mode->
guid;
 
  513     CoTaskMemFree(guid_list);
 
  515     if (IsEqualGUID(&device_guid, &GUID_NULL)) {
 
  516         av_log(
NULL, loglevel, 
"No decoder device for codec found\n");
 
  522     desc.Format       = target_format;
 
  532         surface_alignment = 32;
 
  536         surface_alignment = 128;
 
  538         surface_alignment = 16;
 
  557         av_log(
NULL, loglevel, 
"Unable to allocate surface arrays\n");
 
  565                                                    target_format, D3DPOOL_DEFAULT, 0,
 
  566                                                    DXVA2_VideoDecoderRenderTarget,
 
  573     hr = IDirectXVideoDecoderService_CreateVideoDecoder(ctx->
decoder_service, &device_guid,
 
  577         av_log(
NULL, loglevel, 
"Failed to create DXVA2 video decoder\n");
 
  589     if (IsEqualGUID(&ctx->
decoder_guid, &DXVADDI_Intel_ModeH264_E))
 
  614         av_log(
NULL, loglevel, 
"Unsupported H.264 profile for DXVA2 HWAccel: %d\n", s->
profile);
 
  623         av_log(
NULL, loglevel, 
"Error creating the DXVA2 decoder\n");