vlc_va_t *vlc_va_NewDxva2(vlc_object_t *log, int codec_id) { vlc_va_dxva2_t *va = calloc(1, sizeof(*va)); if (!va) return NULL; /* */ va->log = log; va->codec_id = codec_id; /* Load dll*/ va->hd3d9_dll = LoadLibrary(TEXT("D3D9.DLL")); if (!va->hd3d9_dll) { msg_Warn(va->log, "cannot load d3d9.dll"); goto error; } va->hdxva2_dll = LoadLibrary(TEXT("DXVA2.DLL")); if (!va->hdxva2_dll) { msg_Warn(va->log, "cannot load dxva2.dll"); goto error; } msg_Dbg(va->log, "DLLs loaded"); /* */ if (D3dCreateDevice(va)) { msg_Err(va->log, "Failed to create Direct3D device"); goto error; } msg_Dbg(va->log, "D3dCreateDevice succeed"); if (D3dCreateDeviceManager(va)) { msg_Err(va->log, "D3dCreateDeviceManager failed"); goto error; } if (DxCreateVideoService(va)) { msg_Err(va->log, "DxCreateVideoService failed"); goto error; } /* */ if (DxFindVideoServiceConversion(va, &va->input, &va->render)) { msg_Err(va->log, "DxFindVideoServiceConversion failed"); goto error; } /* TODO print the hardware name/vendor for debugging purposes */ va->va.description = DxDescribe(va); va->va.setup = Setup; va->va.get = Get; va->va.release = Release; va->va.extract = Extract; va->va.close = Close; return &va->va; error: Close(&va->va); return NULL; }
bool VideoDecoderDXVAPrivate::D3dCreateDevice() { typedef IDirect3D9* (WINAPI *Create9Func)(UINT SDKVersion); Create9Func Create9 = (Create9Func)GetProcAddress(hd3d9_dll, "Direct3DCreate9"); if (!Create9) { qWarning("Cannot locate reference to Direct3DCreate9 ABI in DLL"); return false; } d3dobj = Create9(D3D_SDK_VERSION); if (!d3dobj) { qWarning("Direct3DCreate9 failed"); return false; } if (FAILED(d3dobj->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &d3dai))) { qWarning("IDirect3D9_GetAdapterIdentifier failed"); ZeroMemory(&d3dai, sizeof(d3dai)); } else { description = DxDescribe(&d3dai); qDebug("DXVA2 description: %s", description.toUtf8().constData()); } ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Flags = D3DPRESENTFLAG_VIDEO; d3dpp.Windowed = TRUE; d3dpp.hDeviceWindow = NULL; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp.BackBufferCount = 0; /* FIXME what to put here */ d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; /* FIXME what to put here */ d3dpp.BackBufferWidth = 0; d3dpp.BackBufferHeight = 0; d3dpp.EnableAutoDepthStencil = FALSE; /* Direct3D needs a HWND to create a device, even without using ::Present this HWND is used to alert Direct3D when there's a change of focus window. For now, use GetDesktopWindow, as it looks harmless */ if (FAILED(d3dobj->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), //GetShellWindow()? D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3ddev))) { qWarning("IDirect3D9_CreateDevice failed"); return false; } return true; }
static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, const es_format_t *fmt, picture_sys_t *p_sys) { int err = VLC_EGENERIC; directx_sys_t *dx_sys; if (pix_fmt != AV_PIX_FMT_DXVA2_VLD) return VLC_EGENERIC; vlc_va_sys_t *sys = calloc(1, sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; /* Load dll*/ sys->hd3d9_dll = LoadLibrary(TEXT("D3D9.DLL")); if (!sys->hd3d9_dll) { msg_Warn(va, "cannot load d3d9.dll"); goto error; } dx_sys = &sys->dx_sys; dx_sys->pf_check_device = CheckDevice; dx_sys->pf_create_device = D3dCreateDevice; dx_sys->pf_destroy_device = D3dDestroyDevice; dx_sys->pf_create_device_manager = D3dCreateDeviceManager; dx_sys->pf_destroy_device_manager = D3dDestroyDeviceManager; dx_sys->pf_create_video_service = DxCreateVideoService; dx_sys->pf_destroy_video_service = DxDestroyVideoService; dx_sys->pf_create_decoder_surfaces = DxCreateVideoDecoder; dx_sys->pf_destroy_surfaces = DxDestroyVideoDecoder; dx_sys->pf_setup_avcodec_ctx = SetupAVCodecContext; dx_sys->pf_get_input_list = DxGetInputList; dx_sys->pf_setup_output = DxSetupOutput; dx_sys->pf_alloc_surface_pic = DxAllocPicture; dx_sys->psz_decoder_dll = TEXT("DXVA2.DLL"); va->sys = sys; dx_sys->d3ddev = NULL; if (p_sys!=NULL) IDirect3DSurface9_GetDevice(p_sys->surface, (IDirect3DDevice9**) &dx_sys->d3ddev ); err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, true); if (err!=VLC_SUCCESS) goto error; if (p_sys == NULL) { sys->filter = CreateFilter( VLC_OBJECT(va), fmt, VLC_CODEC_YV12); if (sys->filter == NULL) goto error; } err = directx_va_Setup(va, &sys->dx_sys, ctx); if (err != VLC_SUCCESS) goto error; ctx->hwaccel_context = &sys->hw; /* TODO print the hardware name/vendor for debugging purposes */ va->description = DxDescribe(sys); va->setup = Setup; va->get = Get; va->release = directx_va_Release; va->extract = Extract; return VLC_SUCCESS; error: Close(va, ctx); return VLC_EGENERIC; }
static int Open(vlc_va_t *external, int codec_id, const es_format_t *fmt) { vlc_va_dxva2_t *va = calloc(1, sizeof(*va)); if (!va) return VLC_EGENERIC; external->sys = va; /* */ va->log = VLC_OBJECT(external); va->codec_id = codec_id; (void) fmt; /* Load dll*/ va->hd3d9_dll = LoadLibrary(TEXT("D3D9.DLL")); if (!va->hd3d9_dll) { msg_Warn(va->log, "cannot load d3d9.dll"); goto error; } va->hdxva2_dll = LoadLibrary(TEXT("DXVA2.DLL")); if (!va->hdxva2_dll) { msg_Warn(va->log, "cannot load dxva2.dll"); goto error; } msg_Dbg(va->log, "DLLs loaded"); /* */ if (D3dCreateDevice(va)) { msg_Err(va->log, "Failed to create Direct3D device"); goto error; } msg_Dbg(va->log, "D3dCreateDevice succeed"); if (D3dCreateDeviceManager(va)) { msg_Err(va->log, "D3dCreateDeviceManager failed"); goto error; } if (DxCreateVideoService(va)) { msg_Err(va->log, "DxCreateVideoService failed"); goto error; } /* */ if (DxFindVideoServiceConversion(va, &va->input, &va->render)) { msg_Err(va->log, "DxFindVideoServiceConversion failed"); goto error; } /* TODO print the hardware name/vendor for debugging purposes */ external->description = DxDescribe(va); external->pix_fmt = PIX_FMT_DXVA2_VLD; external->setup = Setup; external->get = Get; external->release = Release; external->extract = Extract; return VLC_SUCCESS; error: Close(external); return VLC_EGENERIC; }
static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, const es_format_t *fmt, picture_sys_t *p_sys) { int err = VLC_EGENERIC; directx_sys_t *dx_sys; if (pix_fmt != AV_PIX_FMT_D3D11VA_VLD) return VLC_EGENERIC; vlc_va_sys_t *sys = calloc(1, sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; #if !defined(NDEBUG) && defined(HAVE_DXGIDEBUG_H) sys->dxgidebug_dll = LoadLibrary(TEXT("DXGIDEBUG.DLL")); #endif dx_sys = &sys->dx_sys; dx_sys->pf_check_device = CheckDevice; dx_sys->pf_create_device = D3dCreateDevice; dx_sys->pf_destroy_device = D3dDestroyDevice; dx_sys->pf_create_device_manager = D3dCreateDeviceManager; dx_sys->pf_destroy_device_manager = D3dDestroyDeviceManager; dx_sys->pf_create_video_service = DxCreateVideoService; dx_sys->pf_destroy_video_service = DxDestroyVideoService; dx_sys->pf_create_decoder_surfaces = DxCreateDecoderSurfaces; dx_sys->pf_destroy_surfaces = DxDestroySurfaces; dx_sys->pf_setup_avcodec_ctx = SetupAVCodecContext; dx_sys->pf_get_input_list = DxGetInputList; dx_sys->pf_setup_output = DxSetupOutput; dx_sys->pf_alloc_surface_pic = DxAllocPicture; dx_sys->psz_decoder_dll = TEXT("D3D11.DLL"); va->sys = sys; dx_sys->d3ddev = NULL; va->sys->render = DXGI_FORMAT_UNKNOWN; if ( p_sys != NULL && p_sys->context != NULL ) { ID3D11VideoContext *d3dvidctx = NULL; HRESULT hr = ID3D11DeviceContext_QueryInterface(p_sys->context, &IID_ID3D11VideoContext, (void **)&d3dvidctx); if (FAILED(hr)) { msg_Err(va, "Could not Query ID3D11VideoDevice Interface from the picture. (hr=0x%lX)", hr); } else { ID3D11DeviceContext_GetDevice( p_sys->context, (ID3D11Device**) &dx_sys->d3ddev ); sys->d3dctx = p_sys->context; sys->d3dvidctx = d3dvidctx; assert(p_sys->texture != NULL); D3D11_TEXTURE2D_DESC dstDesc; ID3D11Texture2D_GetDesc( (ID3D11Texture2D*) p_sys->texture, &dstDesc); sys->render = dstDesc.Format; } } err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, dx_sys->d3ddev==NULL || va->sys->d3dctx==NULL); if (err!=VLC_SUCCESS) goto error; if (p_sys == NULL) { sys->filter = CreateFilter( VLC_OBJECT(va), fmt, VLC_CODEC_YV12); if (sys->filter == NULL) goto error; } err = directx_va_Setup(va, &sys->dx_sys, ctx); if (err != VLC_SUCCESS) goto error; ctx->hwaccel_context = &sys->hw; /* TODO print the hardware name/vendor for debugging purposes */ va->description = DxDescribe(dx_sys); va->setup = Setup; va->get = Get; va->release = directx_va_Release; va->extract = Extract; return VLC_SUCCESS; error: Close(va, ctx); return err; }
static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt) { vlc_va_sys_t *sys = calloc(1, sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; va->sys = sys; sys->codec_id = ctx->codec_id; (void) fmt; /* Load dll*/ sys->hd3d9_dll = LoadLibrary(TEXT("D3D9.DLL")); if (!sys->hd3d9_dll) { msg_Warn(va, "cannot load d3d9.dll"); goto error; } sys->hdxva2_dll = LoadLibrary(TEXT("DXVA2.DLL")); if (!sys->hdxva2_dll) { msg_Warn(va, "cannot load dxva2.dll"); goto error; } msg_Dbg(va, "DLLs loaded"); /* */ if (D3dCreateDevice(va)) { msg_Err(va, "Failed to create Direct3D device"); goto error; } msg_Dbg(va, "D3dCreateDevice succeed"); if (D3dCreateDeviceManager(va)) { msg_Err(va, "D3dCreateDeviceManager failed"); goto error; } if (DxCreateVideoService(va)) { msg_Err(va, "DxCreateVideoService failed"); goto error; } /* */ if (DxFindVideoServiceConversion(va, &sys->input, &sys->render)) { msg_Err(va, "DxFindVideoServiceConversion failed"); goto error; } sys->thread_count = ctx->thread_count; /* TODO print the hardware name/vendor for debugging purposes */ va->description = DxDescribe(sys); va->pix_fmt = PIX_FMT_DXVA2_VLD; va->setup = Setup; va->get = Get; va->release = Release; va->extract = Extract; return VLC_SUCCESS; error: Close(va); return VLC_EGENERIC; }
static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, const es_format_t *fmt, picture_sys_t *p_sys) { int err = VLC_EGENERIC; directx_sys_t *dx_sys; if (pix_fmt != AV_PIX_FMT_DXVA2_VLD) return VLC_EGENERIC; ctx->hwaccel_context = NULL; vlc_va_sys_t *sys = calloc(1, sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; /* Load dll*/ sys->hd3d9_dll = LoadLibrary(TEXT("D3D9.DLL")); if (!sys->hd3d9_dll) { msg_Warn(va, "cannot load d3d9.dll"); goto error; } dx_sys = &sys->dx_sys; dx_sys->va_pool.pf_create_device = D3dCreateDevice; dx_sys->va_pool.pf_destroy_device = D3dDestroyDevice; dx_sys->va_pool.pf_create_device_manager = D3dCreateDeviceManager; dx_sys->va_pool.pf_destroy_device_manager = D3dDestroyDeviceManager; dx_sys->va_pool.pf_create_video_service = DxCreateVideoService; dx_sys->va_pool.pf_destroy_video_service = DxDestroyVideoService; dx_sys->va_pool.pf_create_decoder_surfaces = DxCreateVideoDecoder; dx_sys->va_pool.pf_destroy_surfaces = DxDestroyVideoDecoder; dx_sys->va_pool.pf_setup_avcodec_ctx = SetupAVCodecContext; dx_sys->va_pool.pf_new_surface_context = NewSurfacePicContext; dx_sys->pf_get_input_list = DxGetInputList; dx_sys->pf_setup_output = DxSetupOutput; dx_sys->psz_decoder_dll = TEXT("DXVA2.DLL"); va->sys = sys; dx_sys->d3ddev = NULL; if (p_sys!=NULL) { D3DSURFACE_DESC src; if (SUCCEEDED(IDirect3DSurface9_GetDesc(p_sys->surface, &src))) sys->render = src.Format; IDirect3DSurface9_GetDevice(p_sys->surface, &dx_sys->d3ddev ); } err = directx_va_Open(va, &sys->dx_sys, true); if (err!=VLC_SUCCESS) goto error; err = directx_va_Setup(va, &sys->dx_sys, ctx, fmt); if (err != VLC_SUCCESS) goto error; ctx->hwaccel_context = &sys->hw; /* TODO print the hardware name/vendor for debugging purposes */ va->description = DxDescribe(sys); va->get = Get; return VLC_SUCCESS; error: Close(va, NULL); return VLC_EGENERIC; }