[vlc-commits] kva: don't use a local pool with a unique picture

Steve Lhomme git at videolan.org
Mon Feb 25 14:34:20 CET 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Mon Feb 25 14:27:13 2019 +0100| [358f24987c281997e83109e434c88fc5137abd4e] | committer: Steve Lhomme

kva: don't use a local pool with a unique picture

Copy the picture to the GPU during Prepare() rather than between lock/unlock.

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

 modules/video_output/kva.c | 79 ++++++++++++----------------------------------
 1 file changed, 20 insertions(+), 59 deletions(-)

diff --git a/modules/video_output/kva.c b/modules/video_output/kva.c
index da2ce992b7..ffff7ba620 100644
--- a/modules/video_output/kva.c
+++ b/modules/video_output/kva.c
@@ -30,7 +30,6 @@
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_vout_display.h>
-#include <vlc_picture_pool.h>
 
 #include <ctype.h>
 #include <float.h>
@@ -100,29 +99,24 @@ struct vout_display_sys_t
     RECTL              client_rect;
     vout_window_t     *parent_window;
     HWND               parent;
-    picture_pool_t    *pool;
     unsigned           button_pressed;
     bool               is_mouse_hidden;
     bool               is_on_top;
     ULONG              cursor_timeout;
-};
 
-typedef struct
-{
-    int i_chroma_shift;
-} picture_sys_t;
+    int                i_chroma_shift;
+};
 
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static picture_pool_t *Pool   (vout_display_t *, unsigned);
 static void            Display(vout_display_t *, picture_t *);
 static int             Control(vout_display_t *, int, va_list);
 
 static int  OpenDisplay ( vout_display_t *, video_format_t * );
 static void CloseDisplay( vout_display_t * );
 
-static int  KVALock( picture_t * );
+static int  KVALock( vout_display_sys_t *, picture_t * );
 static void KVAUnlock( picture_t * );
 
 static void             MorphToPM     ( void );
@@ -150,6 +144,18 @@ struct open_init
     video_format_t *fmtp;
 };
 
+static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic, vlc_tick_t date)
+{
+    VLC_UNUSED(subpic);
+    VLC_UNUSED(date);
+    picture_t fake_pic = *pic;
+    if (KVALock(vd->sys, &fake_pic) == VLC_SUCCESS)
+    {
+        picture_CopyPixels(&fake_pic, pic);
+        KVAUnlock(&fake_pic);
+    }
+}
+
 static void PMThread( void *arg )
 {
     struct open_init *init = ( struct open_init * )arg;
@@ -268,8 +274,7 @@ static void PMThread( void *arg )
 
     vd->info.has_double_click = true;
 
-    vd->pool    = Pool;
-    vd->prepare = NULL;
+    vd->prepare = Prepare;
     vd->display = Display;
     vd->control = Control;
 
@@ -363,25 +368,11 @@ static void Close ( vlc_object_t *object )
 
     DosWaitThread( &sys->tid, DCWW_WAIT );
 
-    if( sys->pool )
-        picture_pool_Release( sys->pool );
-
     DosCloseEventSem( sys->ack_event );
 
     free( sys );
 }
 
-/**
- * Return a pool of direct buffers
- */
-static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
-{
-    vout_display_sys_t *sys = vd->sys;
-    VLC_UNUSED(count);
-
-    return sys->pool;
-}
-
 /*****************************************************************************
  * Display: displays previously rendered output
  *****************************************************************************
@@ -598,36 +589,7 @@ static int OpenDisplay( vout_display_t *vd, video_format_t *fmt )
         return VLC_EGENERIC;
     }
 
-    /* Create the associated picture */
-    picture_sys_t *picsys = malloc( sizeof( *picsys ) );
-    if( picsys == NULL )
-        return VLC_ENOMEM;
-    picsys->i_chroma_shift = i_chroma_shift;
-
-    picture_resource_t resource = {
-        .p_sys = picsys, .pf_destroy = DestroyPicture,
-    };
-    picture_t *picture = picture_NewFromResource( fmt, &resource );
-    if( !picture )
-    {
-        free( picsys );
-        return VLC_ENOMEM;
-    }
-
-    /* Wrap it into a picture pool */
-    picture_pool_configuration_t pool_cfg;
-    memset( &pool_cfg, 0, sizeof( pool_cfg ));
-    pool_cfg.picture_count = 1;
-    pool_cfg.picture       = &picture;
-    pool_cfg.lock          = KVALock;
-    pool_cfg.unlock        = KVAUnlock;
-
-    sys->pool = picture_pool_NewExtended( &pool_cfg );
-    if( !sys->pool )
-    {
-        picture_Release( picture );
-        return VLC_ENOMEM;
-    }
+    sys->i_chroma_shift = i_chroma_shift;
 
     char *title = var_InheritString( vd, "video-title" );
     if (title != NULL
@@ -681,9 +643,8 @@ static void CloseDisplay( vout_display_t *vd )
     VLC_UNUSED( vd );
 }
 
-static int KVALock( picture_t *picture )
+static int KVALock( vout_display_sys_t *sys, picture_t *picture )
 {
-    picture_sys_t *picsys = picture->p_sys;
     PVOID kva_buffer;
     ULONG kva_bpl;
 
@@ -702,8 +663,8 @@ static int KVALock( picture_t *picture )
         plane_t *p = &picture->p[n];
 
         p->p_pixels = o->p_pixels + o->i_lines * o->i_pitch;
-        p->i_pitch  = kva_bpl >> picsys->i_chroma_shift;
-        p->i_lines  = picture->format.i_height >> picsys->i_chroma_shift;
+        p->i_pitch  = kva_bpl >> sys->i_chroma_shift;
+        p->i_lines  = picture->format.i_height >> sys->i_chroma_shift;
     }
 
     return VLC_SUCCESS;



More information about the vlc-commits mailing list