vlc | branch: master | Steve Lhomme <[email protected]> | Tue Oct 1 10:52:20 2019 +0200| [5a435545fd2a14d3ee1fc2dc13d3de651cb7049c] | committer: Steve Lhomme
d3d9_fmt: do not use the custom VA_PICSYS anymore There is a common common picture context for all D3D9 opaque formats. dxva2 adds extra data around the picture context to handle the va_surface refcounting. We don't use any directy casts from va_pic_context anymore. Use common picture_context_t callbacks. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5a435545fd2a14d3ee1fc2dc13d3de651cb7049c --- modules/codec/avcodec/dxva2.c | 49 +++++++++++++++++++--------------- modules/hw/d3d9/d3d9_filters.c | 7 ++--- modules/hw/d3d9/d3d9_instance.c | 5 +--- modules/hw/d3d9/dxa9.c | 34 +++++------------------ modules/hw/d3d9/dxva2_deinterlace.c | 34 +++++------------------ modules/video_chroma/d3d9_fmt.c | 27 +++++++++++++++++-- modules/video_chroma/d3d9_fmt.h | 14 ++++++++++ modules/video_output/win32/direct3d9.c | 17 +++++------- 8 files changed, 89 insertions(+), 98 deletions(-) diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 862f55329a..350e7f08a0 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -37,8 +37,14 @@ #include <libavcodec/dxva2.h> #include "../../video_chroma/d3d9_fmt.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "va_surface.h" +struct dxva2_pic_context +{ + struct d3d9_pic_context ctx; + struct vlc_va_surface_t *va_surface; +}; + +#define DXVA2_PICCONTEXT_FROM_PICCTX(pic_ctx) \ + container_of((pic_ctx), struct dxva2_pic_context, ctx.s) #include "directx_va.h" @@ -153,55 +159,56 @@ static void SetupAVCodecContext(vlc_va_sys_t *sys, unsigned surfaces) sys->hw.workaround = sys->selected_decoder->workaround; } -static void d3d9_pic_context_destroy(struct picture_context_t *opaque) +static void dxva2_pic_context_destroy(picture_context_t *opaque) { - struct va_pic_context *pic_ctx = (struct va_pic_context*)opaque; + struct dxva2_pic_context *pic_ctx = (struct dxva2_pic_context*)opaque; if (pic_ctx->va_surface) { - ReleaseD3D9PictureSys(&pic_ctx->picsys); + ReleaseD3D9PictureSys(&pic_ctx->ctx.picsys); va_surface_Release(pic_ctx->va_surface); free(pic_ctx); } } -static struct va_pic_context *CreatePicContext(IDirect3DSurface9 *, IDirectXVideoDecoder *); +static struct dxva2_pic_context *CreatePicContext(IDirect3DSurface9 *, IDirectXVideoDecoder *); -static struct picture_context_t *d3d9_pic_context_copy(struct picture_context_t *ctx) +static picture_context_t *dxva2_pic_context_copy(picture_context_t *ctx) { - struct va_pic_context *src_ctx = (struct va_pic_context*)ctx; - struct va_pic_context *pic_ctx = CreatePicContext(src_ctx->picsys.surface, src_ctx->picsys.decoder); + struct dxva2_pic_context *src_ctx = (struct dxva2_pic_context*)ctx; + struct dxva2_pic_context *pic_ctx = CreatePicContext(src_ctx->ctx.picsys.surface, src_ctx->ctx.picsys.decoder); if (unlikely(pic_ctx==NULL)) return NULL; pic_ctx->va_surface = src_ctx->va_surface; va_surface_AddRef(pic_ctx->va_surface); - return &pic_ctx->s; + return &pic_ctx->ctx.s; } -static struct va_pic_context *CreatePicContext(IDirect3DSurface9 *surface, IDirectXVideoDecoder *decoder) +static struct dxva2_pic_context *CreatePicContext(IDirect3DSurface9 *surface, IDirectXVideoDecoder *decoder) { - struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); + struct dxva2_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); if (unlikely(pic_ctx==NULL)) return NULL; - pic_ctx->s.destroy = d3d9_pic_context_destroy; - pic_ctx->s.copy = d3d9_pic_context_copy; - pic_ctx->picsys.surface = surface; - pic_ctx->picsys.decoder = decoder; - AcquireD3D9PictureSys(&pic_ctx->picsys); + pic_ctx->ctx.s = (picture_context_t) { + dxva2_pic_context_destroy, dxva2_pic_context_copy, + }; + pic_ctx->ctx.picsys.surface = surface; + pic_ctx->ctx.picsys.decoder = decoder; + AcquireD3D9PictureSys(&pic_ctx->ctx.picsys); return pic_ctx; } static picture_context_t* NewSurfacePicContext(vlc_va_t *va, int surface_index, vlc_va_surface_t *va_surface) { vlc_va_sys_t *sys = va->sys; - struct va_pic_context *pic_ctx = CreatePicContext(sys->hw_surface[surface_index], sys->hw.decoder); + struct dxva2_pic_context *pic_ctx = CreatePicContext(sys->hw_surface[surface_index], sys->hw.decoder); if (unlikely(pic_ctx==NULL)) return NULL; /* all the resources are acquired during surfaces init, and a second time in * CreatePicContext(), undo one of them otherwise we need an extra release * when the pool is emptied */ - ReleaseD3D9PictureSys(&pic_ctx->picsys); + ReleaseD3D9PictureSys(&pic_ctx->ctx.picsys); pic_ctx->va_surface = va_surface; - return &pic_ctx->s; + return &pic_ctx->ctx.s; } static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) @@ -223,7 +230,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) return VLC_ENOITEM; pic->context = pic_ctx; - *data = (uint8_t*)((struct va_pic_context*)pic->context)->picsys.surface; + *data = (uint8_t*)DXVA2_PICCONTEXT_FROM_PICCTX(pic->context)->ctx.picsys.surface; return VLC_SUCCESS; } diff --git a/modules/hw/d3d9/d3d9_filters.c b/modules/hw/d3d9/d3d9_filters.c index f7361b9118..5261eec035 100644 --- a/modules/hw/d3d9/d3d9_filters.c +++ b/modules/hw/d3d9/d3d9_filters.c @@ -40,9 +40,6 @@ #include <dxva2api.h> #include "../../video_chroma/d3d9_fmt.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "../../codec/avcodec/va_surface.h" - #include "d3d9_filters.h" struct filter_level @@ -93,7 +90,7 @@ static void FillSample( DXVA2_VideoSample *p_sample, picture_t *p_pic, const RECT *p_area ) { - picture_sys_d3d9_t *p_sys_src = ActivePictureSys(p_pic); + picture_sys_d3d9_t *p_sys_src = ActiveD3D9PictureSys(p_pic); p_sample->SrcSurface = p_sys_src->surface; p_sample->SampleFormat.SampleFormat = DXVA2_SampleProgressiveFrame; @@ -108,7 +105,7 @@ static picture_t *Filter(filter_t *p_filter, picture_t *p_pic) { filter_sys_t *p_sys = p_filter->p_sys; - picture_sys_d3d9_t *p_src_sys = ActivePictureSys(p_pic); + picture_sys_d3d9_t *p_src_sys = ActiveD3D9PictureSys(p_pic); picture_t *p_outpic = filter_NewPicture( p_filter ); if( !p_outpic ) diff --git a/modules/hw/d3d9/d3d9_instance.c b/modules/hw/d3d9/d3d9_instance.c index 1a83637ffb..c61139641c 100644 --- a/modules/hw/d3d9/d3d9_instance.c +++ b/modules/hw/d3d9/d3d9_instance.c @@ -34,9 +34,6 @@ #include "d3d9_filters.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "../../codec/avcodec/va_surface.h" - static vlc_mutex_t inst_lock = VLC_STATIC_MUTEX; static d3d9_device_t device = { .dev = NULL }; static size_t instances = 0; @@ -49,7 +46,7 @@ void D3D9_FilterHoldInstance(filter_t *filter, d3d9_device_t *out, D3DSURFACE_DE if (!pic) return; - picture_sys_d3d9_t *p_sys = ActivePictureSys(pic); + picture_sys_d3d9_t *p_sys = ActiveD3D9PictureSys(pic); vlc_mutex_lock(&inst_lock); if (p_sys) diff --git a/modules/hw/d3d9/dxa9.c b/modules/hw/d3d9/dxa9.c index d1a34645e2..0f5700b9e8 100644 --- a/modules/hw/d3d9/dxa9.c +++ b/modules/hw/d3d9/dxa9.c @@ -41,9 +41,6 @@ #include <d3d9.h> #include "../../video_chroma/d3d9_fmt.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "../../codec/avcodec/va_surface.h" - typedef struct { /* GPU to CPU */ @@ -74,7 +71,7 @@ static bool GetLock(filter_t *p_filter, IDirect3DSurface9 *d3d, static void DXA9_YV12(filter_t *p_filter, picture_t *src, picture_t *dst) { copy_cache_t *p_copy_cache = (copy_cache_t*) p_filter->p_sys; - picture_sys_d3d9_t *p_sys = &((struct va_pic_context *)src->context)->picsys; + picture_sys_d3d9_t *p_sys = ActiveD3D9PictureSys(src); D3DSURFACE_DESC desc; D3DLOCKED_RECT lock; @@ -144,7 +141,7 @@ static void DXA9_YV12(filter_t *p_filter, picture_t *src, picture_t *dst) static void DXA9_NV12(filter_t *p_filter, picture_t *src, picture_t *dst) { copy_cache_t *p_copy_cache = (copy_cache_t*) p_filter->p_sys; - picture_sys_d3d9_t *p_sys = &((struct va_pic_context *)src->context)->picsys; + picture_sys_d3d9_t *p_sys = ActiveD3D9PictureSys(src); D3DSURFACE_DESC desc; D3DLOCKED_RECT lock; @@ -231,26 +228,6 @@ struct d3d_pic_context picture_context_t s; }; -static void d3d9_pic_context_destroy(struct picture_context_t *ctx) -{ - struct va_pic_context *pic_ctx = (struct va_pic_context*)ctx; - ReleaseD3D9PictureSys(&pic_ctx->picsys); - free(pic_ctx); -} - -static struct picture_context_t *d3d9_pic_context_copy(struct picture_context_t *ctx) -{ - struct va_pic_context *src_ctx = (struct va_pic_context*)ctx; - struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); - if (unlikely(pic_ctx==NULL)) - return NULL; - pic_ctx->s.destroy = d3d9_pic_context_destroy; - pic_ctx->s.copy = d3d9_pic_context_copy; - pic_ctx->picsys = src_ctx->picsys; - AcquireD3D9PictureSys(&pic_ctx->picsys); - return &pic_ctx->s; -} - static void YV12_D3D9(filter_t *p_filter, picture_t *src, picture_t *dst) { filter_sys_t *sys = p_filter->p_sys; @@ -283,11 +260,12 @@ static void YV12_D3D9(filter_t *p_filter, picture_t *src, picture_t *dst) if (dst->context == NULL) { - struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); + struct d3d9_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); if (likely(pic_ctx)) { - pic_ctx->s.destroy = d3d9_pic_context_destroy; - pic_ctx->s.copy = d3d9_pic_context_copy; + pic_ctx->s = (picture_context_t) { + d3d9_pic_context_destroy, d3d9_pic_context_copy, + }; pic_ctx->picsys = *p_sys; AcquireD3D9PictureSys(&pic_ctx->picsys); dst->context = &pic_ctx->s; diff --git a/modules/hw/d3d9/dxva2_deinterlace.c b/modules/hw/d3d9/dxva2_deinterlace.c index ac8e3822d7..7c6bdd0721 100644 --- a/modules/hw/d3d9/dxva2_deinterlace.c +++ b/modules/hw/d3d9/dxva2_deinterlace.c @@ -40,9 +40,6 @@ #include "d3d9_filters.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "../../codec/avcodec/va_surface.h" - typedef struct { HINSTANCE hdecoder_dll; @@ -145,7 +142,7 @@ static void FillSample( DXVA2_VideoSample *p_sample, const RECT *p_area, int i_field ) { - picture_sys_d3d9_t *p_sys_src = ActivePictureSys(p_pic); + picture_sys_d3d9_t *p_sys_src = ActiveD3D9PictureSys(p_pic); p_sample->SrcSurface = p_sys_src->surface; p_sample->SampleFormat.SampleFormat = p_pic->b_top_field_first ? @@ -203,7 +200,7 @@ static int RenderPic( filter_t *filter, picture_t *p_outpic, picture_t *src, picture_t *p_cur = sys->context.pp_history[1]; picture_t *p_next = sys->context.pp_history[2]; - picture_sys_d3d9_t *p_sys_src = ActivePictureSys(src); + picture_sys_d3d9_t *p_sys_src = ActiveD3D9PictureSys(src); hr = IDirect3DSurface9_GetDesc( p_sys_src->surface, &srcDesc ); if (unlikely(FAILED(hr))) @@ -286,26 +283,6 @@ static const struct filter_mode_t *GetFilterMode(const char *mode) return NULL; } -static void d3d9_pic_context_destroy(struct picture_context_t *ctx) -{ - struct va_pic_context *pic_ctx = (struct va_pic_context*)ctx; - ReleaseD3D9PictureSys(&pic_ctx->picsys); - free(pic_ctx); -} - -static struct picture_context_t *d3d9_pic_context_copy(struct picture_context_t *ctx) -{ - struct va_pic_context *src_ctx = (struct va_pic_context*)ctx; - struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); - if (unlikely(pic_ctx==NULL)) - return NULL; - pic_ctx->s.destroy = d3d9_pic_context_destroy; - pic_ctx->s.copy = d3d9_pic_context_copy; - pic_ctx->picsys = src_ctx->picsys; - AcquireD3D9PictureSys(&pic_ctx->picsys); - return &pic_ctx->s; -} - picture_t *AllocPicture( filter_t *p_filter ) { filter_sys_t *p_sys = p_filter->p_sys; @@ -344,11 +321,12 @@ picture_t *AllocPicture( filter_t *p_filter ) b_local_texture = true; } /* the picture might be duplicated for snapshots so it needs a context */ - struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); + struct d3d9_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); if (likely(pic_ctx!=NULL)) { - pic_ctx->s.destroy = d3d9_pic_context_destroy; - pic_ctx->s.copy = d3d9_pic_context_copy; + pic_ctx->s = (picture_context_t) { + d3d9_pic_context_destroy, d3d9_pic_context_copy, + }; pic_ctx->picsys = *pic_sys; AcquireD3D9PictureSys( &pic_ctx->picsys ); pic->context = &pic_ctx->s; diff --git a/modules/video_chroma/d3d9_fmt.c b/modules/video_chroma/d3d9_fmt.c index 566140a971..ca96fa1e5b 100644 --- a/modules/video_chroma/d3d9_fmt.c +++ b/modules/video_chroma/d3d9_fmt.c @@ -28,8 +28,14 @@ #include <initguid.h> #include "d3d9_fmt.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "../codec/avcodec/va_surface.h" +picture_sys_d3d9_t *ActiveD3D9PictureSys(picture_t *pic) +{ + if (unlikely(pic->context == NULL)) + return pic->p_sys; + + struct d3d9_pic_context *pic_ctx = D3D9_PICCONTEXT_FROM_PICCTX(pic->context); + return &pic_ctx->picsys; +} #undef D3D9_CreateDevice HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, int AdapterToUse, @@ -276,3 +282,20 @@ void D3D9_CloneExternal(d3d9_handle_t *hd3d, IDirect3D9 *dev) if (hd3d->use_ex && pv) IDirect3D9Ex_Release((IDirect3D9Ex*) pv); } + +void d3d9_pic_context_destroy(picture_context_t *ctx) +{ + struct d3d9_pic_context *pic_ctx = D3D9_PICCONTEXT_FROM_PICCTX(ctx); + ReleaseD3D9PictureSys(&pic_ctx->picsys); + free(pic_ctx); +} + +picture_context_t *d3d9_pic_context_copy(picture_context_t *ctx) +{ + struct d3d9_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx)); + if (unlikely(pic_ctx==NULL)) + return NULL; + *pic_ctx = *D3D9_PICCONTEXT_FROM_PICCTX(ctx); + AcquireD3D9PictureSys(&pic_ctx->picsys); + return &pic_ctx->s; +} diff --git a/modules/video_chroma/d3d9_fmt.h b/modules/video_chroma/d3d9_fmt.h index eef89fa3c4..f06c47b370 100644 --- a/modules/video_chroma/d3d9_fmt.h +++ b/modules/video_chroma/d3d9_fmt.h @@ -41,6 +41,12 @@ typedef struct HINSTANCE dxva2_dll; } picture_sys_d3d9_t; +struct d3d9_pic_context +{ + picture_context_t s; + picture_sys_d3d9_t picsys; +}; + typedef struct { HINSTANCE hdll; /* handle of the opened d3d9 dll */ @@ -85,6 +91,11 @@ static inline bool is_d3d9_opaque(vlc_fourcc_t chroma) } } +#define D3D9_PICCONTEXT_FROM_PICCTX(pic_ctx) \ + container_of((pic_ctx), struct d3d9_pic_context, s) + +picture_sys_d3d9_t *ActiveD3D9PictureSys(picture_t *); + static inline d3d9_decoder_device_t *GetD3D9OpaqueDevice(vlc_decoder_device *device) { if (device == NULL || device->type != VLC_DECODER_DEVICE_DXVA2) @@ -138,4 +149,7 @@ void D3D9_Destroy(d3d9_handle_t *); int D3D9_FillPresentationParameters(d3d9_handle_t *, const d3d9_device_t *, D3DPRESENT_PARAMETERS *); +void d3d9_pic_context_destroy(picture_context_t *); +picture_context_t *d3d9_pic_context_copy(picture_context_t *); + #endif /* VLC_VIDEOCHROMA_D3D9_FMT_H_ */ diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index 23d2c067bb..76be7ba2a1 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -56,9 +56,6 @@ #endif #include "../../video_chroma/d3d9_fmt.h" -typedef picture_sys_d3d9_t VA_PICSYS; -#include "../../codec/avcodec/va_surface.h" - #include "common.h" #include "builtin_shaders.h" #include "../../video_chroma/copy.h" @@ -1272,7 +1269,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture, * wrapper, we can't */ IDirect3DSurface9 *surface; - picture_sys_d3d9_t *p_sys = picture->p_sys; + picture_sys_d3d9_t *p_sys = ActiveD3D9PictureSys(picture); surface = p_sys->surface; if ( !is_d3d9_opaque(picture->format.i_chroma) ) { @@ -1291,14 +1288,14 @@ static void Prepare(vout_display_t *vd, picture_t *picture, } else if (picture->context) { - const struct va_pic_context *pic_ctx = (struct va_pic_context*)picture->context; - if (pic_ctx->picsys.surface != surface) + const picture_sys_d3d9_t *picsys = ActiveD3D9PictureSys(picture); + if (picsys->surface != surface) { D3DSURFACE_DESC srcDesc, dstDesc; - IDirect3DSurface9_GetDesc(pic_ctx->picsys.surface, &srcDesc); + IDirect3DSurface9_GetDesc(picsys->surface, &srcDesc); IDirect3DSurface9_GetDesc(surface, &dstDesc); if ( srcDesc.Width == dstDesc.Width && srcDesc.Height == dstDesc.Height ) - surface = pic_ctx->picsys.surface; + surface = picsys->surface; else { HRESULT hr; @@ -1308,7 +1305,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture, visibleSource.right = picture->format.i_visible_width; visibleSource.bottom = picture->format.i_visible_height; - hr = IDirect3DDevice9_StretchRect( p_d3d9_dev->dev, pic_ctx->picsys.surface, &visibleSource, surface, &visibleSource, D3DTEXF_NONE); + hr = IDirect3DDevice9_StretchRect( p_d3d9_dev->dev, picsys->surface, &visibleSource, surface, &visibleSource, D3DTEXF_NONE); if (FAILED(hr)) { msg_Err(vd, "Failed to copy the hw surface to the decoder surface (hr=0x%lX)", hr ); } @@ -1782,7 +1779,7 @@ GLConvUpdate(const opengl_tex_converter_t *tc, GLuint *textures, struct glpriv *priv = tc->priv; HRESULT hr; - picture_sys_d3d9_t *picsys = ActivePictureSys(pic); + picture_sys_d3d9_t *picsys = ActiveD3D9PictureSys(pic); if (unlikely(!picsys || !priv->gl_render)) return VLC_EGENERIC; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
