[vlc-devel] [PATCH 02/16] hw: vaapi: share the bare structure to store a VAAPI picture context

Steve Lhomme robux4 at ycbcr.xyz
Thu Oct 24 16:20:16 CEST 2019


Without the picref which should go away in the end.

Also share some other functions needed to create surfaces.
---
 modules/hw/vaapi/vlc_vaapi.c | 44 ++++++++++++------------------------
 modules/hw/vaapi/vlc_vaapi.h | 23 +++++++++++++++++++
 2 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/modules/hw/vaapi/vlc_vaapi.c b/modules/hw/vaapi/vlc_vaapi.c
index 47fd463da65..1333284fabe 100644
--- a/modules/hw/vaapi/vlc_vaapi.c
+++ b/modules/hw/vaapi/vlc_vaapi.c
@@ -42,21 +42,7 @@
 #include <vlc_filter.h>
 #include <vlc_picture_pool.h>
 
-/* This macro is designed to wrap any VA call, and in case of failure,
-   display the VA error string then goto the 'error' label (which you must
-   define). */
-#define VA_CALL(o, f, args...)                          \
-    do                                                  \
-    {                                                   \
-        VAStatus s = f(args);                           \
-        if (s != VA_STATUS_SUCCESS)                     \
-        {                                               \
-            msg_Err(o, "%s: %s", #f, vaErrorStr(s));    \
-            goto error;                                 \
-        }                                               \
-    } while (0)
-
-static void
+void
 vlc_chroma_to_vaapi(int i_vlc_chroma, unsigned *va_rt_format, int *va_fourcc)
 {
     switch (i_vlc_chroma)
@@ -417,9 +403,7 @@ error:
 
 struct vaapi_pic_ctx
 {
-    picture_context_t s;
-    VASurfaceID surface;
-    VADisplay va_dpy;
+    struct vaapi_pic_context ctx;
     picture_t *picref;
 };
 
@@ -470,12 +454,12 @@ pic_ctx_copy_cb(struct picture_context_t *opaque)
     if (dst_ctx == NULL)
         return NULL;
 
-    dst_ctx->s.destroy = pic_ctx_destroy_cb;
-    dst_ctx->s.copy = pic_ctx_copy_cb;
-    dst_ctx->surface = src_ctx->surface;
-    dst_ctx->va_dpy = src_ctx->va_dpy;
+    dst_ctx->ctx.s.destroy = pic_ctx_destroy_cb;
+    dst_ctx->ctx.s.copy = pic_ctx_copy_cb;
+    dst_ctx->ctx.surface = src_ctx->ctx.surface;
+    dst_ctx->ctx.va_dpy = src_ctx->ctx.va_dpy;
     dst_ctx->picref = picture_Hold(src_ctx->picref);
-    return &dst_ctx->s;
+    return &dst_ctx->ctx.s;
 }
 
 static void
@@ -532,10 +516,10 @@ vlc_vaapi_PoolNew(vlc_object_t *o, vlc_decoder_device *dec_device,
             goto error_pic;
         }
         p_sys->instance = instance;
-        p_sys->ctx.s.destroy = pic_sys_ctx_destroy_cb;
-        p_sys->ctx.s.copy = pic_ctx_copy_cb;
-        p_sys->ctx.surface = instance->render_targets[i];
-        p_sys->ctx.va_dpy = dpy;
+        p_sys->ctx.ctx.s.destroy = pic_sys_ctx_destroy_cb;
+        p_sys->ctx.ctx.s.copy = pic_ctx_copy_cb;
+        p_sys->ctx.ctx.surface = instance->render_targets[i];
+        p_sys->ctx.ctx.va_dpy = dpy;
         p_sys->ctx.picref = NULL;
         picture_resource_t rsc = {
             .p_sys = p_sys,
@@ -595,7 +579,7 @@ vlc_vaapi_PicAttachContext(picture_t *pic)
 
     picture_sys_t *p_sys = pic->p_sys;
     p_sys->ctx.picref = pic;
-    pic->context = &p_sys->ctx.s;
+    pic->context = &p_sys->ctx.ctx.s;
 }
 
 VASurfaceID
@@ -604,7 +588,7 @@ vlc_vaapi_PicGetSurface(picture_t *pic)
     ASSERT_VAAPI_CHROMA(pic);
     assert(pic->context);
 
-    return ((struct vaapi_pic_ctx *)pic->context)->surface;
+    return ((struct vaapi_pic_ctx *)pic->context)->ctx.surface;
 }
 
 VADisplay
@@ -614,5 +598,5 @@ vlc_vaapi_PicGetDisplay(picture_t *pic)
     assert(pic->context);
 
     struct vaapi_pic_ctx *pic_ctx = (struct vaapi_pic_ctx *)pic->context;
-    return pic_ctx->va_dpy;
+    return pic_ctx->ctx.va_dpy;
 }
diff --git a/modules/hw/vaapi/vlc_vaapi.h b/modules/hw/vaapi/vlc_vaapi.h
index e72caa03501..910c02b3743 100644
--- a/modules/hw/vaapi/vlc_vaapi.h
+++ b/modules/hw/vaapi/vlc_vaapi.h
@@ -153,6 +153,13 @@ vlc_vaapi_EndPicture(vlc_object_t *o, VADisplay dpy, VAContextID ctx);
  * VAAPI helpers *
  *****************/
 
+struct vaapi_pic_context
+{
+    picture_context_t s;
+    VASurfaceID surface;
+    VADisplay va_dpy;
+};
+
 /* Creates a VAConfigID */
 VAConfigID
 vlc_vaapi_CreateConfigChecked(vlc_object_t *o, VADisplay dpy,
@@ -190,4 +197,20 @@ vlc_vaapi_IsChromaOpaque(int i_vlc_chroma)
         || i_vlc_chroma == VLC_CODEC_VAAPI_420_10BPP;
 }
 
+void vlc_chroma_to_vaapi(int i_vlc_chroma, unsigned *va_rt_format, int *va_fourcc);
+
+/* This macro is designed to wrap any VA call, and in case of failure,
+   display the VA error string then goto the 'error' label (which you must
+   define). */
+#define VA_CALL(o, f, args...)                          \
+    do                                                  \
+    {                                                   \
+        VAStatus s = f(args);                           \
+        if (s != VA_STATUS_SUCCESS)                     \
+        {                                               \
+            msg_Err(o, "%s: %s", #f, vaErrorStr(s));    \
+            goto error;                                 \
+        }                                               \
+    } while (0)
+
 #endif /* VLC_VAAPI_H */
-- 
2.17.1



More information about the vlc-devel mailing list