From 080f41b8713e06f1e2bba4f31077c4548bf59f01 Mon Sep 17 00:00:00 2001 From: columbarius Date: Fri, 28 May 2021 10:42:25 +0200 Subject: [PATCH] screencast: pipewire try no to die on changed dimensions --- include/pipewire_screencast.h | 2 ++ src/screencast/pipewire_screencast.c | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/pipewire_screencast.h b/include/pipewire_screencast.h index b49e926d..44d1ea68 100644 --- a/include/pipewire_screencast.h +++ b/include/pipewire_screencast.h @@ -8,6 +8,8 @@ void xdpw_pwr_import_buffer(struct xdpw_screencast_instance *cast); void xdpw_pwr_export_buffer(struct xdpw_screencast_instance *cast); +void xdpw_pwr_destroy_shm_buffer(struct xdpw_screencast_instance *cast, + struct pw_buffer *buffer); void pwr_update_stream_param(struct xdpw_screencast_instance *cast); void xdpw_pwr_stream_create(struct xdpw_screencast_instance *cast); void xdpw_pwr_stream_destroy(struct xdpw_screencast_instance *cast); diff --git a/src/screencast/pipewire_screencast.c b/src/screencast/pipewire_screencast.c index f22e981a..babe2842 100644 --- a/src/screencast/pipewire_screencast.c +++ b/src/screencast/pipewire_screencast.c @@ -149,15 +149,19 @@ static void pwr_handle_stream_add_buffer(void *data, struct pw_buffer *buffer) { } static void pwr_handle_stream_remove_buffer(void *data, struct pw_buffer *buffer) { + struct xdpw_screencast_instance *cast = data; struct spa_data *d; logprint(TRACE, "pipewire: remove buffer event handle"); d = buffer->buffer->datas; + if (buffer == cast->current_pw_buffer) { + logprint(TRACE, "pipewire: can't remove buffer. still in use"); + return; + } switch (d[0].type) { case SPA_DATA_MemFd: - wl_buffer_destroy(d[0].data); - close(d[0].fd); + xdpw_pwr_destroy_shm_buffer(cast, buffer); break; default: break; @@ -179,6 +183,7 @@ void xdpw_pwr_import_buffer(struct xdpw_screencast_instance *cast) { if ((pw_buf = pw_stream_dequeue_buffer(cast->stream)) == NULL) { logprint(WARN, "pipewire: out of buffers"); + cast->simple_frame.buffer = NULL; return; } @@ -225,11 +230,24 @@ void xdpw_pwr_export_buffer(struct xdpw_screencast_instance *cast) { logprint(TRACE, "pipewire: y_invert %d", cast->simple_frame.y_invert); logprint(TRACE, "********************"); - pw_stream_queue_buffer(cast->stream, pw_buf); + if (cast->current_pw_buffer) { + pw_stream_queue_buffer(cast->stream, pw_buf); + } else { + xdpw_pwr_destroy_shm_buffer(cast, pw_buf); + } cast->current_pw_buffer = NULL; } +void xdpw_pwr_destroy_shm_buffer(struct xdpw_screencast_instance *cast, struct pw_buffer *buffer) { + struct spa_data *d; + + d = buffer->buffer->datas; + wl_buffer_destroy(d[0].data); + d[0].data = NULL; + close(d[0].fd); +} + void pwr_update_stream_param(struct xdpw_screencast_instance *cast) { logprint(TRACE, "pipewire: stream update parameters"); struct pw_stream *stream = cast->stream;