[vlc-devel] [PATCH] converter_vaapi: check the buffers can be used in tc_va_check_derive_image
Steve Lhomme
robux4 at ycbcr.xyz
Mon Nov 18 14:28:59 CET 2019
This is the same check that is done when creating the converter pool.
We must do the tc_va_check_derive_image() after the opengl_fragment_shader_init()
since we check the texture planes.
---
modules/video_output/opengl/converter_vaapi.c | 40 +++++++++++++++++--
1 file changed, 37 insertions(+), 3 deletions(-)
diff --git a/modules/video_output/opengl/converter_vaapi.c b/modules/video_output/opengl/converter_vaapi.c
index b4d7fc8bef3..4b8fd06bfbf 100644
--- a/modules/video_output/opengl/converter_vaapi.c
+++ b/modules/video_output/opengl/converter_vaapi.c
@@ -352,6 +352,40 @@ tc_va_check_derive_image(opengl_tex_converter_t *tc,
VAImage va_image = { .image_id = VA_INVALID_ID };
int ret = vlc_vaapi_DeriveImage(o, priv->vadpy, va_surface_ids[0],
&va_image);
+ if (ret != VLC_SUCCESS)
+ goto error;
+
+ assert(va_image.format.fourcc == priv->fourcc);
+
+ VABufferInfo va_buffer_info = (VABufferInfo) {
+ .mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME
+ };
+ if (vlc_vaapi_AcquireBufferHandle(o ,priv->vadpy, va_image.buf,
+ &va_buffer_info))
+ goto error;
+
+ for (unsigned i = 0; i < va_image.num_planes; ++i)
+ {
+ EGLint w = (va_image.width * tc->texs[i].w.num) / tc->texs[i].w.den;
+ EGLint h = (va_image.height * tc->texs[i].h.num) / tc->texs[i].h.den;
+ EGLImageKHR egl_image =
+ vaegl_image_create(tc, w, h, priv->drm_fourccs[i], va_buffer_info.handle,
+ va_image.offsets[i], va_image.pitches[i]);
+ if (egl_image == NULL)
+ {
+ msg_Warn(o, "Can't create Image KHR: kernel too old ?");
+ goto error;
+ }
+ vaegl_image_destroy(tc, egl_image);
+ }
+
+error:
+ if (va_image.image_id != VA_INVALID_ID)
+ {
+ if (va_image.buf != VA_INVALID_ID)
+ vlc_vaapi_ReleaseBufferHandle(o, priv->vadpy, va_image.buf);
+ vlc_vaapi_DestroyImage(o, priv->vadpy, va_image.image_id);
+ }
picture_pool_Release(pool);
@@ -424,14 +458,14 @@ Open(vlc_object_t *obj)
if (tc_va_check_interop_blacklist(tc, priv->vadpy))
goto error;
- if (tc_va_check_derive_image(tc, dec_device))
- goto error;
-
tc->fshader = opengl_fragment_shader_init(tc, GL_TEXTURE_2D, vlc_sw_chroma,
tc->fmt.space);
if (tc->fshader == 0)
goto error;
+ if (tc_va_check_derive_image(tc, dec_device))
+ goto error;
+
tc->pf_update = tc_vaegl_update;
tc->pf_get_pool = tc_vaegl_get_pool;
--
2.17.1
More information about the vlc-devel
mailing list