vlc | branch: master | Steve Lhomme <[email protected]> | Mon Sep 2 12:41:25 2019 +0200| [377d00bb98538d04447467f47454f3b432a5bada] | committer: Steve Lhomme
direct_va: store the va_surface in the picture context So that every clone can get/release a reference to the original surface. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=377d00bb98538d04447467f47454f3b432a5bada --- modules/codec/avcodec/d3d11va.c | 3 ++- modules/codec/avcodec/dxva2.c | 3 ++- modules/codec/avcodec/va_surface.c | 21 +++++++++++---------- modules/codec/avcodec/va_surface_internal.h | 4 ++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index 7b3900ea7b..b39f5e19f3 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -208,7 +208,7 @@ done: return pic_ctx; } -static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_index) +static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_index, vlc_va_surface_t *va_surface) { vlc_va_sys_t *sys = va->sys; ID3D11VideoDecoderOutputView *surface = sys->hw_surface[surface_index]; @@ -235,6 +235,7 @@ static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_ind * CreatePicContext(), undo one of them otherwise we need an extra release * when the pool is emptied */ ReleaseD3D11PictureSys(&pic_ctx->picsys); + pic_ctx->va_surface = va_surface; return pic_ctx; } diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 695b3f63ae..8ac094ecb4 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -193,7 +193,7 @@ static struct va_pic_context *CreatePicContext(IDirect3DSurface9 *surface, IDire return pic_ctx; } -static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_index) +static struct va_pic_context* 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); @@ -203,6 +203,7 @@ static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_ind * CreatePicContext(), undo one of them otherwise we need an extra release * when the pool is emptied */ ReleaseD3D9PictureSys(&pic_ctx->picsys); + pic_ctx->va_surface = va_surface; return pic_ctx; } diff --git a/modules/codec/avcodec/va_surface.c b/modules/codec/avcodec/va_surface.c index c3ea01efaa..4d0032d068 100644 --- a/modules/codec/avcodec/va_surface.c +++ b/modules/codec/avcodec/va_surface.c @@ -42,12 +42,13 @@ typedef int VA_PICSYS; struct vlc_va_surface_t { atomic_uintptr_t refcount; + struct va_pic_context *pic_va_ctx; }; 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_surface_Release(va_pool->surface[i]); va_pool->callbacks->pf_destroy_surfaces(sys); va_pool->surface_count = 0; } @@ -119,17 +120,17 @@ static int SetupSurfaces(vlc_va_t *va, va_pool_t *va_pool, unsigned count) int err = VLC_ENOMEM; for (unsigned i = 0; i < va_pool->surface_count; i++) { - struct vlc_va_surface_t *p_surface = malloc(sizeof(*p_surface)); + vlc_va_surface_t *p_surface = malloc(sizeof(*p_surface)); if (unlikely(p_surface==NULL)) goto done; - va_pool->surface[i] = va_pool->callbacks->pf_new_surface_context(va, i); - if (unlikely(va_pool->surface[i]==NULL)) + p_surface->pic_va_ctx = va_pool->callbacks->pf_new_surface_context(va, i, p_surface); + if (unlikely(p_surface->pic_va_ctx==NULL)) { free(p_surface); goto done; } - va_pool->surface[i]->va_surface = p_surface; - atomic_init(&va_pool->surface[i]->va_surface->refcount, 1); + va_pool->surface[i] = p_surface; + atomic_init(&p_surface->refcount, 1); } err = VLC_SUCCESS; @@ -143,14 +144,14 @@ done: static picture_context_t *GetSurface(va_pool_t *va_pool) { for (unsigned i = 0; i < va_pool->surface_count; i++) { - struct va_pic_context *surface = va_pool->surface[i]; + vlc_va_surface_t *surface = va_pool->surface[i]; uintptr_t expected = 1; - if (atomic_compare_exchange_strong(&surface->va_surface->refcount, &expected, 2)) + if (atomic_compare_exchange_strong(&surface->refcount, &expected, 2)) { - picture_context_t *field = surface->s.copy(&surface->s); + picture_context_t *field = surface->pic_va_ctx->s.copy(&surface->pic_va_ctx->s); /* the copy should have added an extra reference */ - atomic_fetch_sub(&surface->va_surface->refcount, 1); + atomic_fetch_sub(&surface->refcount, 1); return field; } } diff --git a/modules/codec/avcodec/va_surface_internal.h b/modules/codec/avcodec/va_surface_internal.h index f875862258..2f8d6e81e2 100644 --- a/modules/codec/avcodec/va_surface_internal.h +++ b/modules/codec/avcodec/va_surface_internal.h @@ -41,7 +41,7 @@ typedef struct int surface_width; int surface_height; - struct va_pic_context *surface[MAX_SURFACE_COUNT]; + vlc_va_surface_t *surface[MAX_SURFACE_COUNT]; const struct va_pool_cfg *callbacks; @@ -71,7 +71,7 @@ struct va_pool_cfg { /** * Create a new context for the surface being acquired */ - struct va_pic_context* (*pf_new_surface_context)(vlc_va_t *, int surface_index); + struct va_pic_context* (*pf_new_surface_context)(vlc_va_t *, int surface_index, vlc_va_surface_t *); }; int va_pool_Open(vlc_va_t *, const struct va_pool_cfg *, va_pool_t *); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
