From 30b5229e0eeb5117fe3061cfcc1d1e59c199f4d9 Mon Sep 17 00:00:00 2001 From: columbarius Date: Fri, 15 Jul 2022 09:13:52 +0200 Subject: [PATCH] screen-cast-stream: Use SPA_META_Header With this header we can set a flag to signal that the whole buffer is corrupt and should be ignored. With this we can cater to all cases: * Window buffer fine, but cursor broken: Use the spa_meta_cursor properties like id or offset accordingly * Window buffer broken, but cursor fine: Use the chunk flags * Both are broken / the dequeued buffer is not usable Use the spa_meta_header flag Additionally clients can now check if a buffer contains spa_meta_header data and can thus only check for the new or the old behaviour. Part-of: --- src/backends/meta-screen-cast-stream-src.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c index d25d0c427..8d0e44955 100644 --- a/src/backends/meta-screen-cast-stream-src.c +++ b/src/backends/meta-screen-cast-stream-src.c @@ -598,6 +598,7 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src, MetaRectangle crop_rect; struct pw_buffer *buffer; struct spa_buffer *spa_buffer; + struct spa_meta_header *header; uint8_t *data = NULL; uint64_t now_us; g_autoptr (GError) error = NULL; @@ -640,9 +641,17 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src, spa_buffer = buffer->buffer; data = spa_buffer->datas[0].data; + header = spa_buffer_find_meta_data (spa_buffer, + SPA_META_Header, + sizeof (*header)); + if (spa_buffer->datas[0].type != SPA_DATA_DmaBuf && !data) { g_critical ("Invalid buffer data"); + if (header) + header->flags = SPA_META_HEADER_FLAG_CORRUPTED; + + pw_stream_queue_buffer (priv->pipewire_stream, buffer); return; } @@ -700,6 +709,9 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src, priv->last_frame_timestamp_us = now_us; + if (header) + header->flags = 0; + pw_stream_queue_buffer (priv->pipewire_stream, buffer); } @@ -795,7 +807,7 @@ on_stream_param_changed (void *data, uint8_t params_buffer[1024]; int32_t width, height, stride, size; struct spa_pod_builder pod_builder; - const struct spa_pod *params[3]; + const struct spa_pod *params[4]; const int bpp = 4; int buffer_types; @@ -840,6 +852,12 @@ on_stream_param_changed (void *data, SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor), SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (384, 384))); + params[3] = spa_pod_builder_add_object ( + &pod_builder, + SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, + SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Header), + SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_header))); + pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params)); if (klass->notify_params_updated)