[vlc-devel] [PATCH 26/39] directx_va: pass the decoder surface via the returned vlc_va_surface_t

Steve Lhomme robux4 at videolabs.io
Fri Jun 2 16:46:29 CEST 2017


---
 modules/codec/avcodec/d3d11va.c    | 6 ++++--
 modules/codec/avcodec/directx_va.c | 4 ++--
 modules/codec/avcodec/directx_va.h | 3 ++-
 modules/codec/avcodec/dxva2.c      | 7 +++++--
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index 03998a6f6a..3a375a028a 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -246,9 +246,10 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
     if (p_sys == NULL)
     {
         assert(!va->sys->b_extern_pool);
-        vlc_va_surface_t *va_surface = directx_va_Get(va, &va->sys->dx_sys, data);
+        vlc_va_surface_t *va_surface = directx_va_Get(va, &va->sys->dx_sys);
         if (!va_surface)
             return VLC_EGENERIC;
+        *data = va_surface->decoderSurface;
         pic->p_sys = va_surface->p_pic->p_sys;
         pic->p_sys->va_surface = va_surface;
         return VLC_SUCCESS;
@@ -283,9 +284,10 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
     *data = p_sys->decoder;
     return VLC_SUCCESS;
 #endif
-    vlc_va_surface_t *va_surface = directx_va_Get(va, &va->sys->dx_sys, data);
+    vlc_va_surface_t *va_surface = directx_va_Get(va, &va->sys->dx_sys);
     if (!va_surface)
         return VLC_EGENERIC;
+    *data = va_surface->decoderSurface;
     pic->p_sys = va_surface->p_pic->p_sys;
     pic->p_sys->va_surface = va_surface;
     return VLC_SUCCESS;
diff --git a/modules/codec/avcodec/directx_va.c b/modules/codec/avcodec/directx_va.c
index d164661848..5bb0c3f85b 100644
--- a/modules/codec/avcodec/directx_va.c
+++ b/modules/codec/avcodec/directx_va.c
@@ -384,7 +384,7 @@ void DestroyVideoDecoder(vlc_va_t *va, directx_sys_t *dx_sys)
 }
 
 /* FIXME it is nearly common with VAAPI */
-vlc_va_surface_t *directx_va_Get(vlc_va_t *va, directx_sys_t *dx_sys, uint8_t **data)
+vlc_va_surface_t *directx_va_Get(vlc_va_t *va, directx_sys_t *dx_sys)
 {
     /* Check the device */
     if (dx_sys->pf_check_device(va)!=VLC_SUCCESS)
@@ -415,7 +415,7 @@ vlc_va_surface_t *directx_va_Get(vlc_va_t *va, directx_sys_t *dx_sys, uint8_t **
 
     surface->refcount = 1;
     surface->order = ++dx_sys->surface_order;
-    *data = (void *)dx_sys->hw_surface[i];
+    surface->decoderSurface = dx_sys->hw_surface[i];
 
     vlc_mutex_unlock( &dx_sys->surface_lock );
 
diff --git a/modules/codec/avcodec/directx_va.h b/modules/codec/avcodec/directx_va.h
index 146f408338..85e25e2606 100644
--- a/modules/codec/avcodec/directx_va.h
+++ b/modules/codec/avcodec/directx_va.h
@@ -47,6 +47,7 @@ typedef struct {
     unsigned int       order;
     vlc_mutex_t        *p_lock;
     picture_t          *p_pic;
+    AVVA_DecoderSurface  *decoderSurface;
 } vlc_va_surface_t;
 
 typedef struct input_list_t {
@@ -135,7 +136,7 @@ typedef struct
 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_va_surface_t *directx_va_Get(vlc_va_t *, directx_sys_t *, uint8_t **data);
+vlc_va_surface_t *directx_va_Get(vlc_va_t *, directx_sys_t *);
 void directx_va_AddRef(vlc_va_surface_t *surface);
 void directx_va_Release(vlc_va_surface_t *surface);
 char *directx_va_GetDecoderName(const GUID *guid);
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 1e9f20c11f..48c1027eeb 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -224,9 +224,12 @@ static int CheckDevice(vlc_va_t *va)
 
 static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
 {
-    vlc_va_surface_t *va_surface = directx_va_Get(va, &va->sys->dx_sys, data);
+    vlc_va_surface_t *va_surface = directx_va_Get(va, &va->sys->dx_sys);
+    if (unlikely(va_surface==NULL))
+        return VLC_EGENERIC;
+    *data = (uint8_t*)va_surface->decoderSurface;
     pic->p_sys->va_surface = va_surface;
-    return va_surface ? VLC_SUCCESS : VLC_EGENERIC;
+    return VLC_SUCCESS;
 }
 
 static void Close(vlc_va_t *va, AVCodecContext *ctx)
-- 
2.12.1



More information about the vlc-devel mailing list