[vlc-devel] [PATCH 35/38] video context: allow storing typed extra data in the video context
Thomas Guillem
thomas at gllm.fr
Wed Oct 2 09:17:54 CEST 2019
This commit could be moved before "nvdec: create a video context for the decoder" to avoid re-modifying all va modules.
On Tue, Oct 1, 2019, at 13:24, Steve Lhomme wrote:
> Each video context can store extra objects, like the IDirect3DDevice9* for D3D9,
> which is not found in the decoder device.
> ---
> include/vlc_picture.h | 18 +++++++++++++++++-
> modules/codec/avcodec/d3d11va.c | 2 +-
> modules/codec/avcodec/dxva2.c | 2 +-
> modules/codec/avcodec/vaapi.c | 2 +-
> modules/hw/nvdec/nvdec.c | 2 +-
> modules/hw/vdpau/avcodec.c | 2 +-
> src/input/decoder_helpers.c | 16 +++++++++++++---
> src/libvlccore.sym | 1 +
> src/video_output/display.c | 2 +-
> 9 files changed, 37 insertions(+), 10 deletions(-)
>
> diff --git a/include/vlc_picture.h b/include/vlc_picture.h
> index 9238e098956..9ca42b9b6e3 100644
> --- a/include/vlc_picture.h
> +++ b/include/vlc_picture.h
> @@ -87,12 +87,28 @@ struct vlc_video_context_operations
> void (*destroy)(void *priv);
> };
>
> +/** Decoder device type */
> +enum vlc_video_context_type
> +{
> + VLC_VIDEO_CONTEXT_NONE,
> + VLC_VIDEO_CONTEXT_VAAPI,
> + VLC_VIDEO_CONTEXT_VDPAU,
> + VLC_VIDEO_CONTEXT_DXVA2,
> + VLC_VIDEO_CONTEXT_D3D11VA,
> + VLC_VIDEO_CONTEXT_AWINDOW,
> + VLC_VIDEO_CONTEXT_NVDEC,
> + VLC_VIDEO_CONTEXT_CVPX,
> + VLC_VIDEO_CONTEXT_MMAL,
> +};
> +
> VLC_API vlc_video_context *
> vlc_video_context_Create(vlc_decoder_device *,
> + enum vlc_video_context_type
> private_type,
> size_t private_size,
> const struct
> vlc_video_context_operations *);
> VLC_API void vlc_video_context_Release(vlc_video_context *);
>
> -VLC_API void *vlc_video_context_GetPrivate(vlc_video_context *);
> +VLC_API enum vlc_video_context_type vlc_video_context_GetType(const
> vlc_video_context *);
> +VLC_API void *vlc_video_context_GetPrivate(vlc_video_context *, enum
> vlc_video_context_type);
> VLC_API vlc_video_context *vlc_video_context_Hold(vlc_video_context *);
>
> /**
> diff --git a/modules/codec/avcodec/d3d11va.c
> b/modules/codec/avcodec/d3d11va.c
> index e895129c202..4b079415e82 100644
> --- a/modules/codec/avcodec/d3d11va.c
> +++ b/modules/codec/avcodec/d3d11va.c
> @@ -354,7 +354,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx,
> enum PixelFormat pix_fmt,
> if (sys->d3d_dev.context_mutex == INVALID_HANDLE_VALUE)
> msg_Warn(va, "No mutex found to lock the decoder");
>
> - sys->vctx = vlc_video_context_Create( dec_device, 0, NULL
> );
> + sys->vctx = vlc_video_context_Create( dec_device,
> VLC_VIDEO_CONTEXT_D3D11VA, 0, NULL );
> if (likely(sys->vctx != NULL))
> {
> void *d3dvidctx = NULL;
> diff --git a/modules/codec/avcodec/dxva2.c
> b/modules/codec/avcodec/dxva2.c
> index 353143214ba..12594ddf0e5 100644
> --- a/modules/codec/avcodec/dxva2.c
> +++ b/modules/codec/avcodec/dxva2.c
> @@ -266,7 +266,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx,
> enum PixelFormat pix_fmt,
> d3d9_decoder_device_t *d3d9_decoder = GetD3D9OpaqueDevice(
> dec_device );
> if ( d3d9_decoder != NULL )
> {
> - sys->vctx = vlc_video_context_Create( dec_device, 0, NULL );
> + sys->vctx = vlc_video_context_Create( dec_device,
> VLC_VIDEO_CONTEXT_DXVA2, 0, NULL );
> if (likely(sys->vctx != NULL))
> {
> D3D9_CloneExternal(&sys->hd3d, d3d9_decoder->device);
> diff --git a/modules/codec/avcodec/vaapi.c
> b/modules/codec/avcodec/vaapi.c
> index c0acbd70f60..337a1b4f8c5 100644
> --- a/modules/codec/avcodec/vaapi.c
> +++ b/modules/codec/avcodec/vaapi.c
> @@ -204,7 +204,7 @@ static int Create(vlc_va_t *va, AVCodecContext
> *ctx, enum PixelFormat pix_fmt,
>
> msg_Info(va, "Using %s", vaQueryVendorString(sys->hw_ctx.display));
>
> - sys->vctx = vlc_video_context_Create( dec_device, 0, NULL );
> + sys->vctx = vlc_video_context_Create( dec_device,
> VLC_VIDEO_CONTEXT_VAAPI, 0, NULL );
> if (sys->vctx == NULL)
> goto error;
>
> diff --git a/modules/hw/nvdec/nvdec.c b/modules/hw/nvdec/nvdec.c
> index 6d7f07314ac..d59949c8ff4 100644
> --- a/modules/hw/nvdec/nvdec.c
> +++ b/modules/hw/nvdec/nvdec.c
> @@ -869,7 +869,7 @@ static int OpenDecoder(vlc_object_t *p_this)
> goto error;
> }
>
> - p_sys->vctx_out = vlc_video_context_Create( device, 0, NULL );
> + p_sys->vctx_out = vlc_video_context_Create( device,
> VLC_VIDEO_CONTEXT_NVDEC, 0, NULL );
>
> vlc_fourcc_t output_chromas[3];
> size_t chroma_idx = 0;
> diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
> index e4a5c58b9fb..2688714c717 100644
> --- a/modules/hw/vdpau/avcodec.c
> +++ b/modules/hw/vdpau/avcodec.c
> @@ -215,7 +215,7 @@ static int Open(vlc_va_t *va, AVCodecContext
> *avctx, enum PixelFormat pix_fmt,
> goto error;
> }
>
> - sys->vctx = vlc_video_context_Create( device, 0, NULL );
> + sys->vctx = vlc_video_context_Create( device,
> VLC_VIDEO_CONTEXT_VDPAU, 0, NULL );
> if (sys->vctx == NULL)
> goto error;
>
> diff --git a/src/input/decoder_helpers.c b/src/input/decoder_helpers.c
> index bc741867517..828e4bdb697 100644
> --- a/src/input/decoder_helpers.c
> +++ b/src/input/decoder_helpers.c
> @@ -195,11 +195,13 @@ struct vlc_video_context
> vlc_atomic_rc_t rc;
> vlc_decoder_device *device;
> const struct vlc_video_context_operations *ops;
> + enum vlc_video_context_type private_type;
> size_t private_size;
> uint8_t private[];
> };
>
> vlc_video_context * vlc_video_context_Create(vlc_decoder_device
> *device,
> + enum vlc_video_context_type
> private_type,
> size_t private_size,
> const struct
> vlc_video_context_operations *ops)
> {
> @@ -207,6 +209,7 @@ vlc_video_context *
> vlc_video_context_Create(vlc_decoder_device *device,
> if (unlikely(vctx == NULL))
> return NULL;
> vlc_atomic_rc_init( &vctx->rc );
> + vctx->private_type = private_type;
> vctx->private_size = private_size;
> vctx->device = device;
> if (vctx->device)
> @@ -215,9 +218,16 @@ vlc_video_context *
> vlc_video_context_Create(vlc_decoder_device *device,
> return vctx;
> }
>
> -void *vlc_video_context_GetPrivate(vlc_video_context *vctx)
> +void *vlc_video_context_GetPrivate(vlc_video_context *vctx, enum
> vlc_video_context_type type)
> {
> - return &vctx->private;
> + if (vctx->private_type == type)
> + return &vctx->private;
> + return NULL;
> +}
> +
> +enum vlc_video_context_type vlc_video_context_GetType(const
> vlc_video_context *vctx)
> +{
> + return vctx->private_type;
> }
>
> vlc_video_context *vlc_video_context_Hold(vlc_video_context *vctx)
> @@ -233,7 +243,7 @@ void vlc_video_context_Release(vlc_video_context
> *vctx)
> if (vctx->device)
> vlc_decoder_device_Release( vctx->device );
> if ( vctx->ops && vctx->ops->destroy )
> - vctx->ops->destroy( vlc_video_context_GetPrivate(vctx) );
> + vctx->ops->destroy( vlc_video_context_GetPrivate(vctx,
> vctx->private_type) );
> free(vctx);
> }
> }
> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> index bba72aa0012..66899073871 100644
> --- a/src/libvlccore.sym
> +++ b/src/libvlccore.sym
> @@ -948,6 +948,7 @@ vlc_media_tree_Preparse
> vlc_viewpoint_to_4x4
> vlc_video_context_Create
> vlc_video_context_Release
> +vlc_video_context_GetType
> vlc_video_context_GetPrivate
> vlc_video_context_Hold
> vlc_video_context_HoldDevice
> diff --git a/src/video_output/display.c b/src/video_output/display.c
> index 56245be3b08..f9fb3d0e7c2 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -770,7 +770,7 @@ vout_display_t *vout_display_New(vlc_object_t
> *parent,
> if (owner)
> vd->owner = *owner;
>
> - vlc_video_context *fake_vctx =
> vlc_video_context_Create(dec_device, 0, NULL);
> + vlc_video_context *fake_vctx =
> vlc_video_context_Create(dec_device, VLC_VIDEO_CONTEXT_NONE, 0, NULL);
>
> if (vlc_module_load(vd, "vout display", module, module && *module != '\0',
> vout_display_start, vd, &osys->cfg, &vd->fmt,
> --
> 2.17.1
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list