[vlc-devel] [PATCH] directx-va: do not load the DLL if not needed

Steve Lhomme robux4 at gmail.com
Wed Jun 17 14:26:01 CEST 2015


From: Steve Lhomme <robUx4 at gmail.com>

---
 modules/codec/avcodec/d3d11va.c    |  2 +-
 modules/codec/avcodec/directx_va.c | 16 +++++++++-------
 modules/codec/avcodec/directx_va.h |  2 +-
 modules/codec/avcodec/dxva2.c      |  2 +-
 4 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index 65a136f..5c27077 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -348,7 +348,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
         }
     }
 
-    err = directx_va_Open(va, &sys->dx_sys, ctx, fmt);
+    err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, dx_sys->d3ddev==NULL || va->sys->d3dctx==NULL);
     if (err!=VLC_SUCCESS)
         goto error;
 
diff --git a/modules/codec/avcodec/directx_va.c b/modules/codec/avcodec/directx_va.c
index c0b3c93..034a572 100644
--- a/modules/codec/avcodec/directx_va.c
+++ b/modules/codec/avcodec/directx_va.c
@@ -422,20 +422,22 @@ void directx_va_Close(vlc_va_t *va, directx_sys_t *dx_sys)
 }
 
 int directx_va_Open(vlc_va_t *va, directx_sys_t *dx_sys,
-                    AVCodecContext *ctx, const es_format_t *fmt)
+                    AVCodecContext *ctx, const es_format_t *fmt, bool b_dll)
 {
     // TODO va->sys = sys;
     dx_sys->codec_id = ctx->codec_id;
 
     vlc_mutex_init( &dx_sys->surface_lock );
 
-    /* Load dll*/
-    dx_sys->hdecoder_dll = LoadLibrary(dx_sys->psz_decoder_dll);
-    if (!dx_sys->hdecoder_dll) {
-        msg_Warn(va, "cannot load DirectX decoder DLL");
-        goto error;
+    if (b_dll) {
+        /* Load dll*/
+        dx_sys->hdecoder_dll = LoadLibrary(dx_sys->psz_decoder_dll);
+        if (!dx_sys->hdecoder_dll) {
+            msg_Warn(va, "cannot load DirectX decoder DLL");
+            goto error;
+        }
+        msg_Dbg(va, "DLLs loaded");
     }
-    msg_Dbg(va, "DLLs loaded");
 
     /* */
     if (dx_sys->pf_create_device(va)) {
diff --git a/modules/codec/avcodec/directx_va.h b/modules/codec/avcodec/directx_va.h
index 3377f85..7559be2 100644
--- a/modules/codec/avcodec/directx_va.h
+++ b/modules/codec/avcodec/directx_va.h
@@ -134,7 +134,7 @@ typedef struct
 
 } directx_sys_t;
 
-int directx_va_Open(vlc_va_t *, directx_sys_t *, AVCodecContext *ctx, const es_format_t *fmt);
+int directx_va_Open(vlc_va_t *, directx_sys_t *, AVCodecContext *ctx, const es_format_t *fmt, bool b_dll);
 void directx_va_Close(vlc_va_t *, directx_sys_t *);
 int directx_va_Setup(vlc_va_t *, directx_sys_t *, AVCodecContext *avctx, vlc_fourcc_t *chroma);
 int directx_va_Get(vlc_va_t *, directx_sys_t *, picture_t *pic, uint8_t **data);
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 0d1cdfc..d92384b 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -357,7 +357,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
     if (p_sys!=NULL)
         IDirect3DSurface9_GetDevice(p_sys->surface, (IDirect3DDevice9**) &dx_sys->d3ddev );
 
-    err = directx_va_Open(va, &sys->dx_sys, ctx, fmt);
+    err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, dx_sys->d3ddev==NULL);
     if (err!=VLC_SUCCESS)
         goto error;
 
-- 
2.4.3




More information about the vlc-devel mailing list