vlc | branch: master | Steve Lhomme <[email protected]> | Wed Jun 19 07:44:45 2019 +0200| [4cd31c8384a98aae3f3f7c84e0e01e169ad1b082] | committer: Steve Lhomme
directx_va: get the picture_context_t from the va_pool We can fill the picture outside of this call. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4cd31c8384a98aae3f3f7c84e0e01e169ad1b082 --- modules/codec/avcodec/d3d11va.c | 7 ++++--- modules/codec/avcodec/dxva2.c | 11 +++++++---- modules/codec/avcodec/va_surface.c | 9 ++++----- modules/codec/avcodec/va_surface_internal.h | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index a1beacc6f7..d52fa80da5 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -287,9 +287,10 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) else #endif { - int res = va_pool_Get(&va->sys->dx_sys.va_pool, pic); - if (unlikely(res != VLC_SUCCESS)) - return res; + picture_context_t *pic_ctx = va_pool_Get(&va->sys->dx_sys.va_pool); + if (unlikely(pic_ctx == NULL)) + return VLC_ENOITEM; + pic->context = pic_ctx; } *data = (uint8_t*)((struct va_pic_context *)pic->context)->picsys.decoder; return VLC_SUCCESS; diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index da029b5a18..4899a6be3a 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -229,10 +229,13 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) return VLC_EGENERIC; } - int res = va_pool_Get(&sys->dx_sys.va_pool, pic); - if (likely(res==VLC_SUCCESS)) - *data = (uint8_t*)((struct va_pic_context*)pic->context)->picsys.surface; - return res; + picture_context_t *pic_ctx = va_pool_Get(&sys->dx_sys.va_pool); + if (likely(pic_ctx==NULL)) + return VLC_ENOITEM; + + pic->context = pic_ctx; + *data = (uint8_t*)((struct va_pic_context*)pic->context)->picsys.surface; + return VLC_SUCCESS; } static void Close(vlc_va_t *va, void **ctx) diff --git a/modules/codec/avcodec/va_surface.c b/modules/codec/avcodec/va_surface.c index 6e266b6663..7f96d65ef2 100644 --- a/modules/codec/avcodec/va_surface.c +++ b/modules/codec/avcodec/va_surface.c @@ -157,24 +157,23 @@ static picture_context_t *GetSurface(va_pool_t *va_pool) return NULL; } -int va_pool_Get(va_pool_t *va_pool, picture_t *pic) +picture_context_t *va_pool_Get(va_pool_t *va_pool) { unsigned tries = (VLC_TICK_FROM_SEC(1) + VOUT_OUTMEM_SLEEP) / VOUT_OUTMEM_SLEEP; picture_context_t *field; if (va_pool->surface_count == 0) - return VLC_ENOITEM; + return NULL; while ((field = GetSurface(va_pool)) == NULL) { if (--tries == 0) - return VLC_ENOITEM; + return NULL; /* Pool empty. Wait for some time as in src/input/decoder.c. * XXX: Both this and the core should use a semaphore or a CV. */ vlc_tick_sleep(VOUT_OUTMEM_SLEEP); } - pic->context = field; - return VLC_SUCCESS; + return field; } void va_surface_AddRef(vlc_va_surface_t *surface) diff --git a/modules/codec/avcodec/va_surface_internal.h b/modules/codec/avcodec/va_surface_internal.h index c11e6ea9fd..41360ee0e2 100644 --- a/modules/codec/avcodec/va_surface_internal.h +++ b/modules/codec/avcodec/va_surface_internal.h @@ -78,7 +78,7 @@ int va_pool_Open(vlc_va_t *, const video_format_t *, va_pool_t *); void va_pool_Close(vlc_va_t *va, va_pool_t *); int va_pool_SetupDecoder(vlc_va_t *, va_pool_t *, const AVCodecContext *, unsigned count, int alignment); int va_pool_SetupSurfaces(vlc_va_t *, va_pool_t *, unsigned count); -int va_pool_Get(va_pool_t *, picture_t *); +picture_context_t *va_pool_Get(va_pool_t *); void va_surface_AddRef(vlc_va_surface_t *surface); void va_surface_Release(vlc_va_surface_t *surface); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
