[vlc-commits] direct3d9: refactor Direct3D9CreatePicturePool

Thomas Guillem git at videolan.org
Mon Nov 13 13:12:13 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Nov  8 17:48:07 2017 +0100| [a84e5591eab7f24c0e2928a97e2f7069121dbc79] | committer: Thomas Guillem

direct3d9: refactor Direct3D9CreatePicturePool

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

 modules/video_output/win32/direct3d9.c | 44 +++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 16 deletions(-)

diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 22ad032963..6bf54ec43b 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -179,10 +179,12 @@ static const d3d_format_t *Direct3DFindFormat(vout_display_t *vd, vlc_fourcc_t c
 
 static int  Open(vlc_object_t *);
 
-static picture_pool_t *Direct3D9CreatePicturePool  (vout_display_t *, unsigned);
+static picture_pool_t *Direct3D9CreatePicturePool  (vlc_object_t *, struct d3dctx *,
+     const d3d_format_t *, const video_format_t *, unsigned);
 
 static void           Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture);
 static void           Display(vout_display_t *, picture_t *, subpicture_t *subpicture);
+static picture_pool_t*DisplayPool(vout_display_t *, unsigned);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -313,7 +315,7 @@ static int Open(vlc_object_t *object)
     video_format_Copy(&vd->fmt, &fmt);
     vd->info = info;
 
-    vd->pool = Direct3D9CreatePicturePool;
+    vd->pool = DisplayPool;
     vd->prepare = Prepare;
     vd->display = Display;
     vd->control = Control;
@@ -389,20 +391,19 @@ static void Direct3D9UnlockSurface(picture_t *picture)
 }
 
 /* */
-static picture_pool_t *Direct3D9CreatePicturePool(vout_display_t *vd, unsigned count)
+static picture_pool_t *Direct3D9CreatePicturePool(vlc_object_t *o,
+    struct d3dctx *d3dctx, const d3d_format_t *default_d3dfmt, const video_format_t *fmt, unsigned count)
 {
+    picture_pool_t*   pool = NULL;
     picture_t**       pictures = NULL;
     unsigned          picture_count = 0;
 
-    if ( vd->sys->sys.pool != NULL )
-        return vd->sys->sys.pool;
-
     pictures = calloc(count, sizeof(*pictures));
     if (!pictures)
         goto error;
 
     D3DFORMAT format;
-    switch (vd->fmt.i_chroma)
+    switch (fmt->i_chroma)
     {
     case VLC_CODEC_D3D9_OPAQUE_10B:
         format = MAKEFOURCC('P','0','1','0');
@@ -411,7 +412,9 @@ static picture_pool_t *Direct3D9CreatePicturePool(vout_display_t *vd, unsigned c
         format = MAKEFOURCC('N','V','1','2');
         break;
     default:
-        format = vd->sys->d3dtexture_format->format;
+        if (!default_d3dfmt)
+            goto error;
+        format = default_d3dfmt->format;
         break;
     }
 
@@ -421,15 +424,15 @@ static picture_pool_t *Direct3D9CreatePicturePool(vout_display_t *vd, unsigned c
         if (unlikely(picsys == NULL))
             goto error;
 
-        HRESULT hr = IDirect3DDevice9_CreateOffscreenPlainSurface(vd->sys->d3dctx.dev,
-                                                          vd->fmt.i_width,
-                                                          vd->fmt.i_height,
+        HRESULT hr = IDirect3DDevice9_CreateOffscreenPlainSurface(d3dctx->dev,
+                                                          fmt->i_width,
+                                                          fmt->i_height,
                                                           format,
                                                           D3DPOOL_DEFAULT,
                                                           &picsys->surface,
                                                           NULL);
         if (FAILED(hr)) {
-           msg_Err(vd, "Failed to allocate surface %d (hr=0x%0lx)", picture_count, hr);
+           msg_Err(o, "Failed to allocate surface %d (hr=0x%0lx)", picture_count, hr);
            free(picsys);
            goto error;
         }
@@ -439,7 +442,7 @@ static picture_pool_t *Direct3D9CreatePicturePool(vout_display_t *vd, unsigned c
             .pf_destroy = DestroyPicture,
         };
 
-        picture_t *picture = picture_NewFromResource(&vd->fmt, &resource);
+        picture_t *picture = picture_NewFromResource(fmt, &resource);
         if (unlikely(picture == NULL)) {
             free(picsys);
             goto error;
@@ -452,20 +455,29 @@ static picture_pool_t *Direct3D9CreatePicturePool(vout_display_t *vd, unsigned c
     memset(&pool_cfg, 0, sizeof(pool_cfg));
     pool_cfg.picture_count = count;
     pool_cfg.picture       = pictures;
-    if( !is_d3d9_opaque( vd->fmt.i_chroma ) )
+    if( !is_d3d9_opaque( fmt->i_chroma ) )
     {
         pool_cfg.lock = Direct3D9LockSurface;
         pool_cfg.unlock = Direct3D9UnlockSurface;
     }
 
-    vd->sys->sys.pool = picture_pool_NewExtended( &pool_cfg );
+    pool = picture_pool_NewExtended( &pool_cfg );
 
 error:
-    if (vd->sys->sys.pool == NULL && pictures) {
+    if (pool == NULL && pictures) {
         for (unsigned i=0;i<picture_count; ++i)
             DestroyPicture(pictures[i]);
     }
     free(pictures);
+    return pool;
+}
+
+static picture_pool_t *DisplayPool(vout_display_t *vd, unsigned count)
+{
+    if ( vd->sys->sys.pool != NULL )
+        return vd->sys->sys.pool;
+    vd->sys->sys.pool = Direct3D9CreatePicturePool(VLC_OBJECT(vd), &vd->sys->d3dctx,
+        vd->sys->d3dtexture_format, &vd->fmt, count);
     return vd->sys->sys.pool;
 }
 



More information about the vlc-commits mailing list