[vlc-devel] [PATCH 35/38] video context: allow storing typed extra data in the video context

Steve Lhomme robux4 at ycbcr.xyz
Tue Oct 1 13:24:17 CEST 2019


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



More information about the vlc-devel mailing list