[vlc-commits] [Git][videolan/vlc][master] 2 commits: interop_vaapi: Don't use DeriveImage with ExportSurfaceHandle

Steve Lhomme (@robUx4) gitlab at videolan.org
Thu Apr 25 11:01:21 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
b1e5a91d by David Rosca at 2024-04-25T09:34:15+00:00
interop_vaapi: Don't use DeriveImage with ExportSurfaceHandle

DeriveImage is only needed when AcquireBufferHandle is used with old libva.

- - - - -
ac178ac8 by David Rosca at 2024-04-25T09:34:15+00:00
vaapi: chroma: Implement vaPutImage upload fallback

- - - - -


2 changed files:

- modules/hw/vaapi/chroma.c
- modules/video_output/opengl/interop_vaapi.c


Changes:

=====================================
modules/hw/vaapi/chroma.c
=====================================
@@ -262,18 +262,40 @@ UploadSurface(filter_t *filter, picture_t *src)
     vlc_vaapi_PicAttachContext(dest_pic);
     picture_CopyProperties(dest_pic, src);
 
-    if (vlc_vaapi_DeriveImage(VLC_OBJECT(filter), va_dpy,
-                              vlc_vaapi_PicGetSurface(dest_pic), &dest_img)
-        || vlc_vaapi_MapBuffer(VLC_OBJECT(filter), va_dpy,
-                               dest_img.buf, &dest_buf))
+    if (p_sys->derive_failed ||
+        vlc_vaapi_DeriveImage(VLC_OBJECT(filter), va_dpy,
+                              vlc_vaapi_PicGetSurface(dest_pic), &dest_img))
+    {
+        if (p_sys->image_fallback_failed)
+            goto error;
+
+        p_sys->derive_failed = true;
+
+        if (CreateFallbackImage(filter, dest_pic, va_dpy, &dest_img))
+        {
+            p_sys->image_fallback_failed = true;
+            goto error;
+        }
+    }
+
+    if (vlc_vaapi_MapBuffer(VLC_OBJECT(filter), va_dpy,
+                            dest_img.buf, &dest_buf))
         goto error;
 
     FillVAImageFromPicture(&dest_img, dest_buf, dest_pic,
                            src, &p_sys->cache);
 
-    if (vlc_vaapi_UnmapBuffer(VLC_OBJECT(filter), va_dpy, dest_img.buf)
-        || vlc_vaapi_DestroyImage(VLC_OBJECT(filter),
-                                  va_dpy, dest_img.image_id))
+    if (vlc_vaapi_UnmapBuffer(VLC_OBJECT(filter), va_dpy, dest_img.buf))
+        goto error;
+
+    if (p_sys->derive_failed &&
+        vaPutImage(va_dpy, vlc_vaapi_PicGetSurface(dest_pic), dest_img.image_id,
+                   0, 0, dest_pic->format.i_width, dest_pic->format.i_height,
+                   0, 0, dest_pic->format.i_width, dest_pic->format.i_height))
+        goto error;
+
+    if (vlc_vaapi_DestroyImage(VLC_OBJECT(filter),
+                               va_dpy, dest_img.image_id))
         goto error;
 
 ret:


=====================================
modules/video_output/opengl/interop_vaapi.c
=====================================
@@ -86,9 +86,10 @@ struct priv
          * (GPU tiling, compression, etc...) */
         VADRMPRIMESurfaceDescriptor va_surface_descriptor;
 #else
+        VAImage                     va_image;
         VABufferInfo                va_buffer_info;
 #endif
-        VAImage                     va_image;
+        unsigned                    num_planes;
         void *                      egl_images[3];
     } last;
 };
@@ -127,7 +128,7 @@ vaegl_release_last_pic(const struct vlc_gl_interop *interop, struct priv *priv)
 {
     vlc_object_t *o = VLC_OBJECT(interop->gl);
 
-    for (unsigned i = 0; i < priv->last.va_image.num_planes; ++i)
+    for (unsigned i = 0; i < priv->last.num_planes; ++i)
         vaegl_image_destroy(interop, priv->last.egl_images[i]);
 
 #if VA_CHECK_VERSION(1, 1, 0)
@@ -135,9 +136,8 @@ vaegl_release_last_pic(const struct vlc_gl_interop *interop, struct priv *priv)
         close(priv->last.va_surface_descriptor.objects[i].fd);
 #else
     vlc_vaapi_ReleaseBufferHandle(o, priv->vadpy, priv->last.va_image.buf);
-#endif
-
     vlc_vaapi_DestroyImage(o, priv->vadpy, priv->last.va_image.image_id);
+#endif
 
     picture_Release(priv->last.pic);
 }
@@ -196,33 +196,28 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
     (void) plane_offset;
     struct priv *priv = interop->priv;
     vlc_object_t *o = VLC_OBJECT(interop->gl);
-    VAImage va_image;
 #if VA_CHECK_VERSION(1, 1, 0)
     VADRMPRIMESurfaceDescriptor va_surface_descriptor;
 #else
+    VAImage va_image;
     VABufferInfo va_buffer_info;
 #endif
     EGLImageKHR egl_images[3] = { };
     bool release_image = false, release_buffer_info = false;
+    unsigned num_planes = 0;
 
     if (pic == priv->last.pic)
     {
-        va_image = priv->last.va_image;
 #if VA_CHECK_VERSION(1, 1, 0)
         va_surface_descriptor = priv->last.va_surface_descriptor;
+#else
+        va_image = priv->last.va_image;
 #endif
-        for (unsigned i = 0; i < priv->last.va_image.num_planes; ++i)
+        for (unsigned i = 0; i < priv->last.num_planes; ++i)
             egl_images[i] = priv->last.egl_images[i];
     }
     else
     {
-        if (vlc_vaapi_DeriveImage(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
-                                  &va_image))
-            goto error;
-        release_image = true;
-
-        assert(va_image.format.fourcc == priv->fourcc);
-
 #if VA_CHECK_VERSION(1, 1, 0)
         VA_CALL(o, vaSyncSurface, priv->vadpy, vlc_vaapi_PicGetSurface(pic));
         if (vlc_vaapi_ExportSurfaceHandle(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
@@ -230,7 +225,15 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
                                           VA_EXPORT_SURFACE_READ_ONLY | VA_EXPORT_SURFACE_SEPARATE_LAYERS,
                                           &va_surface_descriptor))
             goto error;
+        release_image = true;
 #else
+        if (vlc_vaapi_DeriveImage(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
+                                  &va_image))
+            goto error;
+        release_image = true;
+
+        assert(va_image.format.fourcc == priv->fourcc);
+
         va_buffer_info = (VABufferInfo) {
             .mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME
         };
@@ -242,7 +245,8 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
     }
 
 #if VA_CHECK_VERSION(1, 1, 0)
-    for (unsigned i = 0; i < va_surface_descriptor.num_layers; ++i)
+    num_planes = va_surface_descriptor.num_layers;
+    for (unsigned i = 0; i < num_planes; ++i)
     {
         unsigned obj_idx = va_surface_descriptor.layers[i].object_index[0];
 
@@ -261,7 +265,8 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
         priv->glEGLImageTargetTexture2DOES(interop->tex_target, egl_images[i]);
     }
 #else
-    for (unsigned i = 0; i < va_image.num_planes; ++i)
+    num_planes = va_image.num_planes;
+    for (unsigned i = 0; i < num_planes; ++i)
     {
         egl_images[i] =
             vaegl_image_create(interop, tex_width[i], tex_height[i],
@@ -282,14 +287,15 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
         if (priv->last.pic != NULL)
             vaegl_release_last_pic(interop, priv);
         priv->last.pic = picture_Hold(pic);
-        priv->last.va_image = va_image;
 #if VA_CHECK_VERSION(1, 1, 0)
         priv->last.va_surface_descriptor = va_surface_descriptor;
 #else
+        priv->last.va_image = va_image;
         priv->last.va_buffer_info = va_buffer_info;
 #endif
+        priv->last.num_planes = num_planes;
 
-        for (unsigned i = 0; i < va_image.num_planes; ++i)
+        for (unsigned i = 0; i < num_planes; ++i)
             priv->last.egl_images[i] = egl_images[i];
     }
 
@@ -311,7 +317,9 @@ error:
         for (unsigned i = 0; i < 3 && egl_images[i] != NULL; ++i)
             vaegl_image_destroy(interop, egl_images[i]);
 
+#if !VA_CHECK_VERSION(1, 1, 0)
         vlc_vaapi_DestroyImage(o, priv->vadpy, va_image.image_id);
+#endif
     }
     return VLC_EGENERIC;
 }



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/ffe24cb69db40ddfbc6cb7d93ea617ff2c8cce35...ac178ac8e3132b40330c1344fe3700b38ad0b552

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/ffe24cb69db40ddfbc6cb7d93ea617ff2c8cce35...ac178ac8e3132b40330c1344fe3700b38ad0b552
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list