vlc | branch: master | Steve Lhomme <[email protected]> | Wed Nov 13 08:45:49 2019 +0100| [27b6be39b64d102f81477b44ff907e5c2cdd3a13] | committer: Steve Lhomme
picture: add the video context in the picture context The creator of the picture_context_t must set the video context if needed. If set, the picture context must hold a reference to the video context. When "copying" a picture (using the same surface in another picture context) a new reference has to be acquired. Add an inline function to get the video context from a picture. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=27b6be39b64d102f81477b44ff907e5c2cdd3a13 --- include/vlc_picture.h | 6 ++++++ modules/codec/avcodec/d3d11va.c | 1 + modules/codec/avcodec/dxva2.c | 1 + modules/codec/avcodec/vaapi.c | 1 + modules/codec/vt_utils.c | 1 + modules/hw/d3d11/d3d11_deinterlace.c | 1 + modules/hw/d3d11/d3d11_surface.c | 1 + modules/hw/d3d9/dxa9.c | 1 + modules/hw/d3d9/dxva2_deinterlace.c | 1 + modules/hw/nvdec/nvdec.c | 1 + modules/hw/vaapi/vlc_vaapi.c | 1 + modules/hw/vdpau/picture.c | 1 + src/misc/picture.c | 3 +++ 13 files changed, 20 insertions(+) diff --git a/include/vlc_picture.h b/include/vlc_picture.h index 3298630e02..75a87c8a81 100644 --- a/include/vlc_picture.h +++ b/include/vlc_picture.h @@ -69,6 +69,7 @@ typedef struct picture_context_t { void (*destroy)(struct picture_context_t *); struct picture_context_t *(*copy)(struct picture_context_t *); + struct vlc_video_context *vctx; } picture_context_t; typedef struct picture_buffer_t @@ -161,6 +162,11 @@ struct picture_t atomic_uintptr_t refs; }; +static inline vlc_video_context* picture_GetVideoContext(picture_t *pic) +{ + return pic->context ? pic->context->vctx : NULL; +} + /** * This function will create a new picture. * The picture created will implement a default release management compatible diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index d4319df743..7f2c8e88ad 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -177,6 +177,7 @@ static struct d3d11va_pic_context *CreatePicContext( return NULL; pic_ctx->ctx.s = (picture_context_t) { d3d11va_pic_context_destroy, d3d11va_pic_context_copy, + NULL /*TODO*/ }; D3D11_TEXTURE2D_DESC txDesc; diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 7b42d6a663..a3c708e4ff 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -187,6 +187,7 @@ static struct dxva2_pic_context *CreatePicContext(IDirect3DSurface9 *surface) return NULL; pic_ctx->ctx.s = (picture_context_t) { dxva2_pic_context_destroy, dxva2_pic_context_copy, + NULL /*TODO*/ }; pic_ctx->ctx.picsys.surface = surface; AcquireD3D9PictureSys(&pic_ctx->ctx.picsys); diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c index 36cb5a1487..5a5c86cff9 100644 --- a/modules/codec/avcodec/vaapi.c +++ b/modules/codec/avcodec/vaapi.c @@ -163,6 +163,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) } vaapi_ctx->ctx.s = (picture_context_t) { vaapi_dec_pic_context_destroy, vaapi_dec_pic_context_copy, + NULL /*TODO*/ }; vaapi_ctx->ctx.surface = sys->render_targets[va_surface_GetIndex(va_surface)]; vaapi_ctx->ctx.va_dpy = sys->hw_ctx.display; diff --git a/modules/codec/vt_utils.c b/modules/codec/vt_utils.c index cb71dae139..cac1389199 100644 --- a/modules/codec/vt_utils.c +++ b/modules/codec/vt_utils.c @@ -89,6 +89,7 @@ cvpxpic_attach_common(picture_t *p_pic, CVPixelBufferRef cvpx, } ctx->s = (picture_context_t) { pf_destroy, cvpxpic_copy_cb, + NULL // no video context for now }; ctx->cvpx = CVPixelBufferRetain(cvpx); ctx->nb_fields = p_pic->i_nb_fields; diff --git a/modules/hw/d3d11/d3d11_deinterlace.c b/modules/hw/d3d11/d3d11_deinterlace.c index 90215efbd7..5c58632e59 100644 --- a/modules/hw/d3d11/d3d11_deinterlace.c +++ b/modules/hw/d3d11/d3d11_deinterlace.c @@ -266,6 +266,7 @@ picture_t *AllocPicture( filter_t *p_filter ) { pic_ctx->s = (picture_context_t) { d3d11_pic_context_destroy, d3d11_pic_context_copy, + NULL /*TODO*/ }; pic_ctx->picsys = *pic_sys; AcquireD3D11PictureSys( &pic_ctx->picsys ); diff --git a/modules/hw/d3d11/d3d11_surface.c b/modules/hw/d3d11/d3d11_surface.c index 9f0a71e60b..8b24f34bdf 100644 --- a/modules/hw/d3d11/d3d11_surface.c +++ b/modules/hw/d3d11/d3d11_surface.c @@ -585,6 +585,7 @@ static void NV12_D3D11(filter_t *p_filter, picture_t *src, picture_t *dst) { pic_ctx->s = (picture_context_t) { d3d11_pic_context_destroy, d3d11_pic_context_copy, + NULL /*TODO*/ }; pic_ctx->picsys = *p_sys; AcquireD3D11PictureSys(&pic_ctx->picsys); diff --git a/modules/hw/d3d9/dxa9.c b/modules/hw/d3d9/dxa9.c index cd1619be40..2ff00276bb 100644 --- a/modules/hw/d3d9/dxa9.c +++ b/modules/hw/d3d9/dxa9.c @@ -272,6 +272,7 @@ static void YV12_D3D9(filter_t *p_filter, picture_t *src, picture_t *dst) { pic_ctx->s = (picture_context_t) { d3d9_pic_context_destroy, d3d9_pic_context_copy, + NULL /*TODO*/ }; pic_ctx->picsys = *p_sys; AcquireD3D9PictureSys(&pic_ctx->picsys); diff --git a/modules/hw/d3d9/dxva2_deinterlace.c b/modules/hw/d3d9/dxva2_deinterlace.c index 2564752818..48b59a2336 100644 --- a/modules/hw/d3d9/dxva2_deinterlace.c +++ b/modules/hw/d3d9/dxva2_deinterlace.c @@ -326,6 +326,7 @@ picture_t *AllocPicture( filter_t *p_filter ) { pic_ctx->s = (picture_context_t) { d3d9_pic_context_destroy, d3d9_pic_context_copy, + NULL /*TODO*/ }; pic_ctx->picsys = *pic_sys; AcquireD3D9PictureSys( &pic_ctx->picsys ); diff --git a/modules/hw/nvdec/nvdec.c b/modules/hw/nvdec/nvdec.c index e82338dcd4..3b22088d94 100644 --- a/modules/hw/nvdec/nvdec.c +++ b/modules/hw/nvdec/nvdec.c @@ -372,6 +372,7 @@ static int CUDAAPI HandlePictureDisplay(void *p_opaque, CUVIDPARSERDISPINFO *p_d goto error; picctx->ctx = (picture_context_t) { NVDecCtxDestroy, NVDecCtxClone, + NULL /*TODO*/ }; uintptr_t pool_idx = (uintptr_t)p_pic->p_sys; picctx->devidePtr = p_sys->outputDevicePtr[pool_idx]; diff --git a/modules/hw/vaapi/vlc_vaapi.c b/modules/hw/vaapi/vlc_vaapi.c index 4c4a30d9b3..a871085967 100644 --- a/modules/hw/vaapi/vlc_vaapi.c +++ b/modules/hw/vaapi/vlc_vaapi.c @@ -509,6 +509,7 @@ vlc_vaapi_PoolNew(vlc_object_t *o, vlc_decoder_device *dec_device, p_sys->instance = instance; p_sys->ctx.ctx.s = (picture_context_t) { pic_sys_ctx_destroy_cb, pic_ctx_copy_cb, + NULL /*TODO*/ }; p_sys->ctx.ctx.surface = instance->render_targets[i]; p_sys->ctx.ctx.va_dpy = dpy; diff --git a/modules/hw/vdpau/picture.c b/modules/hw/vdpau/picture.c index d834d0303a..e50a3f3e47 100644 --- a/modules/hw/vdpau/picture.c +++ b/modules/hw/vdpau/picture.c @@ -96,6 +96,7 @@ vlc_vdp_video_field_t *vlc_vdp_video_create(vdp_t *vdp, field->context = (picture_context_t) { VideoSurfaceDestroy, VideoSurfaceCopy, + NULL /*TODO*/ }; field->frame = frame; field->structure = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; diff --git a/src/misc/picture.c b/src/misc/picture.c index 3288aa6514..990277ef15 100644 --- a/src/misc/picture.c +++ b/src/misc/picture.c @@ -43,7 +43,10 @@ static void PictureDestroyContext( picture_t *p_picture ) picture_context_t *ctx = p_picture->context; if (ctx != NULL) { + vlc_video_context *vctx = ctx->vctx; ctx->destroy(ctx); + if (vctx) + vlc_video_context_Release(vctx); p_picture->context = NULL; } } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
