[vlc-devel] [PATCH 27/39] avcodec: do not use a picture from the display before creating the VA

Steve Lhomme robux4 at ycbcr.xyz
Mon Oct 7 16:29:06 CEST 2019


---
 modules/codec/avcodec/d3d11va.c | 20 ++------------------
 modules/codec/avcodec/dxva2.c   | 12 ++----------
 modules/codec/avcodec/va.c      |  7 +++----
 modules/codec/avcodec/va.h      |  4 ++--
 modules/codec/avcodec/vaapi.c   |  2 +-
 modules/codec/avcodec/video.c   |  3 +--
 modules/hw/vdpau/avcodec.c      |  3 +--
 7 files changed, 12 insertions(+), 39 deletions(-)

diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index a16af7c8a3f..a89f66f5c39 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -56,7 +56,7 @@ typedef picture_sys_d3d11_t VA_PICSYS;
 #include "directx_va.h"
 
 static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
-                const es_format_t *, void *, vlc_decoder_device *);
+                const es_format_t *, vlc_decoder_device *);
 
 vlc_module_begin()
     set_description(N_("Direct3D11 Video Acceleration"))
@@ -303,7 +303,7 @@ static void Close(vlc_va_t *va)
 static const struct vlc_va_operations ops = { Get, Close, };
 
 static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
-                const es_format_t *fmt, void *picsys, vlc_decoder_device *dec_device)
+                const es_format_t *fmt, vlc_decoder_device *dec_device)
 {
     int err = VLC_EGENERIC;
 
@@ -354,22 +354,6 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
                D3D11_ReleaseDevice(&sys->d3d_dev);
             } else {
                 sys->hw.video_context = d3dvidctx;
-
-                if (picsys != NULL)
-                {
-                    picture_sys_d3d11_t *p_sys = picsys;
-                    /* TODO this will go away in push, we decide the decoding format */
-                    assert(p_sys->texture[KNOWN_DXGI_INDEX] != NULL);
-                    D3D11_TEXTURE2D_DESC dstDesc;
-                    ID3D11Texture2D_GetDesc( p_sys->texture[KNOWN_DXGI_INDEX], &dstDesc);
-                    sys->render = dstDesc.Format;
-                    if (dstDesc.BindFlags & D3D11_BIND_DECODER)
-                    {
-                        sys->textureWidth = dstDesc.Width;
-                        sys->textureHeight = dstDesc.Height;
-                        sys->totalTextureSlices = dstDesc.ArraySize;
-                    }
-                }
             }
         }
     }
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 22ee6bf657a..4c8cf03e15f 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -43,7 +43,7 @@ typedef picture_sys_d3d9_t VA_PICSYS;
 #include "directx_va.h"
 
 static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
-                const es_format_t *, void *, vlc_decoder_device *);
+                const es_format_t *, vlc_decoder_device *);
 
 vlc_module_begin()
     set_description(N_("DirectX Video Acceleration (DXVA) 2.0"))
@@ -244,7 +244,7 @@ static void Close(vlc_va_t *va)
 static const struct vlc_va_operations ops = { Get, Close, };
 
 static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
-                const es_format_t *fmt, void *picsys, vlc_decoder_device *dec_device)
+                const es_format_t *fmt, vlc_decoder_device *dec_device)
 {
     int err = VLC_EGENERIC;
 
@@ -268,14 +268,6 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
             free( sys );
             return VLC_EGENERIC;
         }
-        if (picsys != NULL)
-        {
-            picture_sys_d3d9_t *p_sys = picsys;
-            /* TODO this will go away in push, we decide the decoding format */
-            D3DSURFACE_DESC src;
-            if (SUCCEEDED(IDirect3DSurface9_GetDesc(p_sys->surface, &src)))
-                sys->render = src.Format;
-        }
     }
     else if (D3D9_Create(va, &sys->hd3d) != VLC_SUCCESS) {
         msg_Warn(va, "cannot load d3d9.dll");
diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c
index 2e9938755bf..ee7d5084e40 100644
--- a/modules/codec/avcodec/va.c
+++ b/modules/codec/avcodec/va.c
@@ -95,16 +95,15 @@ static int vlc_va_Start(void *func, bool forced, va_list ap)
     enum PixelFormat pix_fmt = va_arg(ap, enum PixelFormat);
     const es_format_t *fmt = va_arg(ap, const es_format_t *);
     vlc_decoder_device *device = va_arg(ap, vlc_decoder_device *);
-    void *p_sys = va_arg(ap, void *);
     vlc_va_open open = func;
 
     (void) forced;
-    return open(va, ctx, pix_fmt, fmt, p_sys, device);
+    return open(va, ctx, pix_fmt, fmt, device);
 }
 
 vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,
                      enum PixelFormat pix_fmt, const es_format_t *fmt,
-                     vlc_decoder_device *device, void *sys)
+                     vlc_decoder_device *device)
 {
     struct vlc_va_t *va = vlc_object_create(obj, sizeof (*va));
     if (unlikely(va == NULL))
@@ -113,7 +112,7 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,
     char *modlist = var_InheritString(obj, "avcodec-hw");
 
     if (vlc_module_load(va, "hw decoder", modlist, true,
-                        vlc_va_Start, va, avctx, pix_fmt, fmt, device, sys) == NULL)
+                        vlc_va_Start, va, avctx, pix_fmt, fmt, device) == NULL)
     {
         vlc_object_delete(va);
         va = NULL;
diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h
index ee5af4d89d6..7c82facb23e 100644
--- a/modules/codec/avcodec/va.h
+++ b/modules/codec/avcodec/va.h
@@ -42,7 +42,7 @@ struct vlc_va_t {
 };
 
 typedef int (*vlc_va_open)(vlc_va_t *, AVCodecContext *, enum PixelFormat,
-                           const es_format_t *, void *, vlc_decoder_device *);
+                           const es_format_t *, vlc_decoder_device *);
 
 #define set_va_callback(activate, priority) \
     { \
@@ -69,7 +69,7 @@ vlc_fourcc_t vlc_va_GetChroma(enum PixelFormat hwfmt, enum PixelFormat swfmt);
  */
 vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *,
                      enum PixelFormat, const es_format_t *fmt,
-                     vlc_decoder_device *device, void *p_sys);
+                     vlc_decoder_device *device);
 
 /**
  * Get a hardware video surface for a libavcodec frame.
diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
index 5419f691ff2..d831573003d 100644
--- a/modules/codec/avcodec/vaapi.c
+++ b/modules/codec/avcodec/vaapi.c
@@ -147,7 +147,7 @@ static void Delete(vlc_va_t *va)
 static const struct vlc_va_operations ops = { Get, Delete, };
 
 static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
-                  const es_format_t *fmt, void *p_sys, vlc_decoder_device *dec_device)
+                  const es_format_t *fmt, vlc_decoder_device *dec_device)
 {
     if (pix_fmt != AV_PIX_FMT_VAAPI_VLD || dec_device == NULL ||
         dec_device->type != VLC_DECODER_DEVICE_VAAPI)
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 99c46f0efc3..357a7d5d423 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -1741,10 +1741,9 @@ no_reuse:
             continue; /* Unsupported brand of hardware acceleration */
         vlc_mutex_unlock(&p_sys->lock);
 
-        // TEMP: decoder_NewPicture cannot be used until decoder_UpdateVideoOutput is called
         vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context, hwfmt,
                                   &p_dec->fmt_in,
-                                  init_device, NULL);
+                                  init_device);
         if (init_device)
             vlc_decoder_device_Release(init_device);
         vlc_mutex_lock(&p_sys->lock);
diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
index bfc6786bdb1..67fc44d12f2 100644
--- a/modules/hw/vdpau/avcodec.c
+++ b/modules/hw/vdpau/avcodec.c
@@ -133,13 +133,12 @@ static void Close(vlc_va_t *va)
 static const struct vlc_va_operations ops = { Lock, Close, };
 
 static int Open(vlc_va_t *va, AVCodecContext *avctx, enum PixelFormat pix_fmt,
-                const es_format_t *fmt, void *p_sys, vlc_decoder_device *dec_device)
+                const es_format_t *fmt, vlc_decoder_device *dec_device)
 {
     if (pix_fmt != AV_PIX_FMT_VDPAU)
         return VLC_EGENERIC;
 
     (void) fmt;
-    (void) p_sys;
     void *func;
     VdpStatus err;
     VdpChromaType type;
-- 
2.17.1



More information about the vlc-devel mailing list