vlc | branch: master | Steve Lhomme <[email protected]> | Mon Jul 22 09:17:15 2019 +0200| [9e5570a7e09a3b0ac3775f919bf05651955cc7fb] | committer: Steve Lhomme
directx_va: don't use the va when we only need the sys > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9e5570a7e09a3b0ac3775f919bf05651955cc7fb --- modules/codec/avcodec/d3d11va.c | 42 +++++++++++++++-------------- modules/codec/avcodec/dxva2.c | 30 ++++++++++----------- modules/codec/avcodec/va_surface.c | 14 +++++----- modules/codec/avcodec/va_surface_internal.h | 6 ++--- 4 files changed, 47 insertions(+), 45 deletions(-) diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index f82121e517..2c669ed9dc 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -127,7 +127,7 @@ struct vlc_va_sys_t /* */ static int D3dCreateDevice(vlc_va_t *); -static void D3dDestroyDevice(vlc_va_t *); +static void D3dDestroyDevice(vlc_va_sys_t *); static int DxCreateVideoService(vlc_va_t *); static void DxDestroyVideoService(vlc_va_t *); @@ -136,11 +136,10 @@ static int DxSetupOutput(vlc_va_t *, const GUID *, const video_format_t *); static int DxCreateDecoderSurfaces(vlc_va_t *, int codec_id, const video_format_t *fmt, unsigned surface_count); -static void DxDestroySurfaces(vlc_va_t *); +static void DxDestroySurfaces(vlc_va_sys_t *); -static void SetupAVCodecContext(vlc_va_t *va) +static void SetupAVCodecContext(vlc_va_sys_t *sys) { - vlc_va_sys_t *sys = va->sys; directx_sys_t *dx_sys = &sys->dx_sys; sys->hw.video_context = sys->d3dvidctx; @@ -248,9 +247,10 @@ static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_ind static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) { + vlc_va_sys_t *sys = va->sys; picture_sys_d3d11_t *p_sys = pic->p_sys; #if D3D11_DIRECT_DECODE - if (va->sys->dx_sys.can_extern_pool) + if (sys->dx_sys.can_extern_pool) { /* copy the original picture_sys_d3d11_t in the va_pic_context */ if (!pic->context) @@ -261,11 +261,11 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) HRESULT hr; D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc; ZeroMemory(&viewDesc, sizeof(viewDesc)); - viewDesc.DecodeProfile = va->sys->dx_sys.input; + viewDesc.DecodeProfile = sys->dx_sys.input; viewDesc.ViewDimension = D3D11_VDOV_DIMENSION_TEXTURE2D; viewDesc.Texture2D.ArraySlice = p_sys->slice_index; - hr = ID3D11VideoDevice_CreateVideoDecoderOutputView( va->sys->dx_sys.d3ddec, + hr = ID3D11VideoDevice_CreateVideoDecoderOutputView( sys->dx_sys.d3ddec, p_sys->resource[KNOWN_DXGI_INDEX], &viewDesc, &p_sys->decoder ); @@ -276,7 +276,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) pic->context = (picture_context_t*)CreatePicContext( p_sys->decoder, p_sys->resource[KNOWN_DXGI_INDEX], - va->sys->d3d_dev.d3dcontext, + sys->d3d_dev.d3dcontext, p_sys->slice_index, p_sys->renderSrc ); if (pic->context == NULL) @@ -286,7 +286,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) else #endif { - picture_context_t *pic_ctx = va_pool_Get(&va->sys->dx_sys.va_pool); + picture_context_t *pic_ctx = va_pool_Get(&sys->dx_sys.va_pool); if (unlikely(pic_ctx == NULL)) return VLC_ENOITEM; pic->context = pic_ctx; @@ -469,9 +469,8 @@ static int D3dCreateDevice(vlc_va_t *va) /** * It releases a Direct3D device and its resources. */ -static void D3dDestroyDevice(vlc_va_t *va) +static void D3dDestroyDevice(vlc_va_sys_t *sys) { - vlc_va_sys_t *sys = va->sys; if (sys->d3dvidctx) ID3D11VideoContext_Release(sys->d3dvidctx); D3D11_ReleaseDevice( &sys->d3d_dev ); @@ -482,10 +481,11 @@ static void D3dDestroyDevice(vlc_va_t *va) */ static int DxCreateVideoService(vlc_va_t *va) { - directx_sys_t *dx_sys = &va->sys->dx_sys; + vlc_va_sys_t *sys = va->sys; + directx_sys_t *dx_sys = &sys->dx_sys; void *d3dviddev = NULL; - HRESULT hr = ID3D11Device_QueryInterface(va->sys->d3d_dev.d3ddevice, &IID_ID3D11VideoDevice, &d3dviddev); + HRESULT hr = ID3D11Device_QueryInterface(sys->d3d_dev.d3ddevice, &IID_ID3D11VideoDevice, &d3dviddev); if (FAILED(hr)) { msg_Err(va, "Could not Query ID3D11VideoDevice Interface. (hr=0x%lX)", hr); return VLC_EGENERIC; @@ -500,7 +500,8 @@ static int DxCreateVideoService(vlc_va_t *va) */ static void DxDestroyVideoService(vlc_va_t *va) { - directx_sys_t *dx_sys = &va->sys->dx_sys; + vlc_va_sys_t *sys = va->sys; + directx_sys_t *dx_sys = &sys->dx_sys; if (dx_sys->d3ddec) ID3D11VideoDevice_Release(dx_sys->d3ddec); } @@ -512,7 +513,8 @@ static void ReleaseInputList(input_list_t *p_list) static int DxGetInputList(vlc_va_t *va, input_list_t *p_list) { - directx_sys_t *dx_sys = &va->sys->dx_sys; + vlc_va_sys_t *sys = va->sys; + directx_sys_t *dx_sys = &sys->dx_sys; HRESULT hr; UINT input_count = ID3D11VideoDevice_GetVideoDecoderProfileCount(dx_sys->d3ddec); @@ -680,7 +682,7 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, const video_format_t *fmt, unsigned surface_count) { vlc_va_sys_t *sys = va->sys; - directx_sys_t *dx_sys = &va->sys->dx_sys; + directx_sys_t *dx_sys = &sys->dx_sys; HRESULT hr; ID3D10Multithread *pMultithread; @@ -939,9 +941,9 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, return VLC_SUCCESS; } -static void DxDestroySurfaces(vlc_va_t *va) +static void DxDestroySurfaces(vlc_va_sys_t *sys) { - directx_sys_t *dx_sys = &va->sys->dx_sys; + directx_sys_t *dx_sys = &sys->dx_sys; if (dx_sys->va_pool.surface_count && !dx_sys->can_extern_pool) { ID3D11Resource *p_texture; ID3D11VideoDecoderOutputView_GetResource( dx_sys->hw_surface[0], &p_texture ); @@ -953,8 +955,8 @@ static void DxDestroySurfaces(vlc_va_t *va) ID3D11VideoDecoderOutputView_Release( dx_sys->hw_surface[i] ); for (int j = 0; j < D3D11_MAX_SHADER_VIEW; j++) { - if (va->sys->renderSrc[i*D3D11_MAX_SHADER_VIEW + j]) - ID3D11ShaderResourceView_Release(va->sys->renderSrc[i*D3D11_MAX_SHADER_VIEW + j]); + if (sys->renderSrc[i*D3D11_MAX_SHADER_VIEW + j]) + ID3D11ShaderResourceView_Release(sys->renderSrc[i*D3D11_MAX_SHADER_VIEW + j]); } } if (dx_sys->decoder) diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 596538d0f3..274568bcfb 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -136,7 +136,7 @@ struct vlc_va_sys_t /* */ static int D3dCreateDevice(vlc_va_t *); -static void D3dDestroyDevice(vlc_va_t *); +static void D3dDestroyDevice(vlc_va_sys_t *); static int D3dCreateDeviceManager(vlc_va_t *); static void D3dDestroyDeviceManager(vlc_va_t *); @@ -148,11 +148,10 @@ static int DxSetupOutput(vlc_va_t *, const GUID *, const video_format_t *); static int DxCreateVideoDecoder(vlc_va_t *, int codec_id, const video_format_t *, unsigned surface_count); -static void DxDestroyVideoDecoder(vlc_va_t *); +static void DxDestroyVideoDecoder(vlc_va_sys_t *); -static void SetupAVCodecContext(vlc_va_t *va) +static void SetupAVCodecContext(vlc_va_sys_t *sys) { - vlc_va_sys_t *sys = va->sys; directx_sys_t *dx_sys = &sys->dx_sys; sys->hw.decoder = dx_sys->decoder; @@ -373,9 +372,8 @@ static int D3dCreateDevice(vlc_va_t *va) /** * It releases a Direct3D device and its resources. */ -static void D3dDestroyDevice(vlc_va_t *va) +static void D3dDestroyDevice(vlc_va_sys_t *sys) { - vlc_va_sys_t *sys = va->sys; D3D9_ReleaseDevice(&sys->d3d_dev); D3D9_Destroy( &sys->hd3d ); } @@ -430,7 +428,7 @@ static void D3dDestroyDeviceManager(vlc_va_t *va) static int DxCreateVideoService(vlc_va_t *va) { vlc_va_sys_t *sys = va->sys; - directx_sys_t *dx_sys = &va->sys->dx_sys; + directx_sys_t *dx_sys = &sys->dx_sys; HRESULT hr; HANDLE device; @@ -458,12 +456,13 @@ static int DxCreateVideoService(vlc_va_t *va) */ static void DxDestroyVideoService(vlc_va_t *va) { - directx_sys_t *dx_sys = &va->sys->dx_sys; - if (va->sys->device) + vlc_va_sys_t *sys = va->sys; + directx_sys_t *dx_sys = &sys->dx_sys; + if (sys->device) { - HRESULT hr = IDirect3DDeviceManager9_CloseDeviceHandle(va->sys->devmng, va->sys->device); + HRESULT hr = IDirect3DDeviceManager9_CloseDeviceHandle(sys->devmng, sys->device); if (FAILED(hr)) - msg_Warn(va, "Failed to release device handle 0x%p. (hr=0x%lX)", va->sys->device, hr); + msg_Warn(va, "Failed to release device handle 0x%p. (hr=0x%lX)", sys->device, hr); } if (dx_sys->d3ddec) IDirectXVideoDecoderService_Release(dx_sys->d3ddec); @@ -476,7 +475,8 @@ static void ReleaseInputList(input_list_t *p_list) static int DxGetInputList(vlc_va_t *va, input_list_t *p_list) { - directx_sys_t *dx_sys = &va->sys->dx_sys; + vlc_va_sys_t *sys = va->sys; + directx_sys_t *dx_sys = &sys->dx_sys; UINT input_count = 0; GUID *input_list = NULL; if (FAILED(IDirectXVideoDecoderService_GetDecoderDeviceGuids(dx_sys->d3ddec, @@ -572,7 +572,7 @@ static int DxCreateVideoDecoder(vlc_va_t *va, int codec_id, const video_format_t *fmt, unsigned surface_count) { vlc_va_sys_t *p_sys = va->sys; - directx_sys_t *sys = &va->sys->dx_sys; + directx_sys_t *sys = &p_sys->dx_sys; HRESULT hr; hr = IDirectXVideoDecoderService_CreateSurface(sys->d3ddec, @@ -705,9 +705,9 @@ error: return VLC_EGENERIC; } -static void DxDestroyVideoDecoder(vlc_va_t *va) +static void DxDestroyVideoDecoder(vlc_va_sys_t *sys) { - directx_sys_t *dx_sys = &va->sys->dx_sys; + directx_sys_t *dx_sys = &sys->dx_sys; if (dx_sys->decoder) { /* releases a reference on each decoder surface */ diff --git a/modules/codec/avcodec/va_surface.c b/modules/codec/avcodec/va_surface.c index 2506296d93..a91878f1a6 100644 --- a/modules/codec/avcodec/va_surface.c +++ b/modules/codec/avcodec/va_surface.c @@ -44,11 +44,11 @@ struct vlc_va_surface_t { atomic_uintptr_t refcount; }; -static void DestroyVideoDecoder(vlc_va_t *va, va_pool_t *va_pool) +static void DestroyVideoDecoder(vlc_va_sys_t *sys, va_pool_t *va_pool) { for (unsigned i = 0; i < va_pool->surface_count; i++) va_surface_Release(va_pool->surface[i]->va_surface); - va_pool->pf_destroy_surfaces(va); + va_pool->pf_destroy_surfaces(sys); va_pool->surface_count = 0; } @@ -81,7 +81,7 @@ int va_pool_SetupDecoder(vlc_va_t *va, va_pool_t *va_pool, const AVCodecContext } /* */ - DestroyVideoDecoder(va, va_pool); + DestroyVideoDecoder(va->sys, va_pool); /* */ msg_Dbg(va, "va_pool_SetupDecoder id %d %dx%d count: %d", avctx->codec_id, avctx->coded_width, avctx->coded_height, count); @@ -107,7 +107,7 @@ int va_pool_SetupDecoder(vlc_va_t *va, va_pool_t *va_pool, const AVCodecContext done: va_pool->surface_count = i; if (err == VLC_SUCCESS) - va_pool->pf_setup_avcodec_ctx(va); + va_pool->pf_setup_avcodec_ctx(va->sys); return err; } @@ -135,7 +135,7 @@ int va_pool_SetupSurfaces(vlc_va_t *va, va_pool_t *va_pool, unsigned count) done: va_pool->surface_count = i; if (err == VLC_SUCCESS) - va_pool->pf_setup_avcodec_ctx(va); + va_pool->pf_setup_avcodec_ctx(va->sys); return err; } @@ -190,11 +190,11 @@ void va_surface_Release(vlc_va_surface_t *surface) void va_pool_Close(vlc_va_t *va, va_pool_t *va_pool) { - DestroyVideoDecoder(va, va_pool); + DestroyVideoDecoder(va->sys, va_pool); va_pool->pf_destroy_video_service(va); if (va_pool->pf_destroy_device_manager) va_pool->pf_destroy_device_manager(va); - va_pool->pf_destroy_device(va); + va_pool->pf_destroy_device(va->sys); } int va_pool_Open(vlc_va_t *va, va_pool_t *va_pool) diff --git a/modules/codec/avcodec/va_surface_internal.h b/modules/codec/avcodec/va_surface_internal.h index f5e2ab24c0..df55ff5dc6 100644 --- a/modules/codec/avcodec/va_surface_internal.h +++ b/modules/codec/avcodec/va_surface_internal.h @@ -44,7 +44,7 @@ typedef struct struct va_pic_context *surface[MAX_SURFACE_COUNT]; int (*pf_create_device)(vlc_va_t *); - void (*pf_destroy_device)(vlc_va_t *); + void (*pf_destroy_device)(vlc_va_sys_t *); int (*pf_create_device_manager)(vlc_va_t *); void (*pf_destroy_device_manager)(vlc_va_t *); @@ -61,11 +61,11 @@ typedef struct /** * Destroy resources allocated with the surfaces and the associated decoder */ - void (*pf_destroy_surfaces)(vlc_va_t *); + void (*pf_destroy_surfaces)(vlc_va_sys_t *); /** * Set the avcodec hw context after the decoder is created */ - void (*pf_setup_avcodec_ctx)(vlc_va_t *); + void (*pf_setup_avcodec_ctx)(vlc_va_sys_t *); /** * Create a new context for the surface being acquired _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
