[vlc-commits] opengl/vdpau: keep a reference to the decoder device

Steve Lhomme git at videolan.org
Tue Oct 22 09:02:06 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Mon Oct 21 08:35:40 2019 +0200| [1a7b811574bad3156e171fb47e878d3d28dc07c6] | committer: Steve Lhomme

opengl/vdpau: keep a reference to the decoder device

It's not going to change during the lifetime of the converter module, unlike
the video context.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1a7b811574bad3156e171fb47e878d3d28dc07c6
---

 modules/video_output/opengl/converter_vdpau.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/modules/video_output/opengl/converter_vdpau.c b/modules/video_output/opengl/converter_vdpau.c
index 5220699128..874f8f5307 100644
--- a/modules/video_output/opengl/converter_vdpau.c
+++ b/modules/video_output/opengl/converter_vdpau.c
@@ -58,17 +58,19 @@ static PFNGLVDPAUSURFACEACCESSNVPROC            _glVDPAUSurfaceAccessNV;
 static PFNGLVDPAUMAPSURFACESNVPROC              _glVDPAUMapSurfacesNV;
 static PFNGLVDPAUUNMAPSURFACESNVPROC            _glVDPAUUnmapSurfacesNV;
 
+typedef struct {
+    vlc_decoder_device *dec_device;
+} converter_sys_t;
+
 static picture_pool_t *
 tc_vdpau_gl_get_pool(opengl_tex_converter_t const *tc,
                      unsigned int requested_count)
 {
-    vlc_decoder_device *dec_device = vlc_video_context_HoldDevice(tc->vctx);
-    picture_pool_t *pool;
-    pool = vlc_vdp_output_pool_create(dec_device->opaque,
+    converter_sys_t *sys = tc->priv;
+    vlc_decoder_device *dec_device = sys->dec_device;
+    return vlc_vdp_output_pool_create(dec_device->opaque,
                                       VDP_RGBA_FORMAT_B8G8R8A8,
                                       &tc->fmt, requested_count);
-    vlc_decoder_device_Release(dec_device);
-    return pool;
 }
 
 static int
@@ -116,7 +118,8 @@ Close(vlc_object_t *obj)
 {
     opengl_tex_converter_t *tc = (void *)obj;
     _glVDPAUFiniNV(); assert(tc->vt->GetError() == GL_NO_ERROR);
-    vlc_decoder_device *dec_device = vlc_video_context_HoldDevice(tc->vctx);
+    converter_sys_t *sys = tc->priv;
+    vlc_decoder_device *dec_device = sys->dec_device;
     vdp_release_x11(dec_device->opaque);
     vlc_decoder_device_Release(dec_device);
 }
@@ -139,6 +142,14 @@ Open(vlc_object_t *obj)
         return VLC_EGENERIC;
     }
 
+    converter_sys_t *sys = vlc_obj_malloc(VLC_OBJECT(tc), sizeof(*sys));
+    if (unlikely(sys == NULL))
+    {
+        vlc_decoder_device_Release(dec_device);
+        return VLC_ENOMEM;
+    }
+    sys->dec_device = dec_device;
+
     tc->fmt.i_chroma = VLC_CODEC_VDPAU_OUTPUT;
 
     VdpDevice device;
@@ -176,8 +187,6 @@ Open(vlc_object_t *obj)
 
     INTEROP_CALL(glVDPAUInitNV, (void *)(uintptr_t)device, vdp_gpa);
 
-    vlc_decoder_device_Release(dec_device);
-
     tc->fshader = opengl_fragment_shader_init(tc, GL_TEXTURE_2D,
                                               VLC_CODEC_RGB32,
                                               COLOR_SPACE_UNDEF);
@@ -189,6 +198,7 @@ Open(vlc_object_t *obj)
 
     tc->pf_get_pool = tc_vdpau_gl_get_pool;
     tc->pf_update = tc_vdpau_gl_update;
+    tc->priv = sys;
 
     return VLC_SUCCESS;
 }



More information about the vlc-commits mailing list