From ca22622517c381a687e311b5eb8bf97c31140f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 1 Feb 2021 18:33:35 +0100 Subject: [PATCH] screen-cast/src: Only allocate DMA buffers if other end supports it The other end of the PipeWire stream can set the buffer data type to a bitmask of supported buffer types. We should respect this, and not attempt to allocate a DMA buffer if it isn't asked for. Part-of: --- src/backends/meta-screen-cast-stream-src.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c index 5d3440e5d..39c688d78 100644 --- a/src/backends/meta-screen-cast-stream-src.c +++ b/src/backends/meta-screen-cast-stream-src.c @@ -747,10 +747,17 @@ on_stream_add_buffer (void *data, spa_data[0].maxsize = stride * priv->video_format.size.height; spa_data[0].data = NULL; - dmabuf_handle = - meta_screen_cast_create_dma_buf_handle (screen_cast, - priv->video_format.size.width, - priv->video_format.size.height); + if (spa_data[0].type & (1 << SPA_DATA_DmaBuf)) + { + dmabuf_handle = + meta_screen_cast_create_dma_buf_handle (screen_cast, + priv->video_format.size.width, + priv->video_format.size.height); + } + else + { + dmabuf_handle = NULL; + } if (dmabuf_handle) { @@ -766,6 +773,13 @@ on_stream_add_buffer (void *data, { unsigned int seals; + if (!(spa_data[0].type & (1 << SPA_DATA_MemFd))) + { + g_critical ("No supported PipeWire stream buffer data type could " + "be negotiated"); + return; + } + /* Fallback to a memfd buffer */ spa_data[0].type = SPA_DATA_MemFd; spa_data[0].flags = SPA_DATA_FLAG_READWRITE;