From 48fae6fa3eb98f84cc2398e0c37cdb39159b81e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ordo=C3=B1ez=20M=C3=BCller=2C=20Antonio?= Date: Tue, 24 Mar 2026 11:04:13 +0100 Subject: [PATCH] clean up port's io struct when node is paused --- spa/plugins/libcamera/libcamera-source.cpp | 8 ++++++++ spa/plugins/videotestsrc/videotestsrc.c | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/spa/plugins/libcamera/libcamera-source.cpp b/spa/plugins/libcamera/libcamera-source.cpp index 3d65270ae..a0b4b5cec 100644 --- a/spa/plugins/libcamera/libcamera-source.cpp +++ b/spa/plugins/libcamera/libcamera-source.cpp @@ -1571,6 +1571,8 @@ int impl_node_set_io(void *object, uint32_t id, void *data, size_t size) int impl_node_send_command(void *object, const struct spa_command *command) { struct impl *impl = (struct impl*)object; + struct port *port; + struct spa_io_buffers *io; int res; spa_return_val_if_fail(impl != nullptr, -EINVAL); @@ -1593,6 +1595,12 @@ int impl_node_send_command(void *object, const struct spa_command *command) case SPA_NODE_COMMAND_Pause: case SPA_NODE_COMMAND_Suspend: spa_libcamera_stream_off(impl); + port = GET_OUT_PORT(impl, 0); + io = port->io; + if (io && (io->buffer_id < port->n_buffers)) { + spa_libcamera_buffer_recycle(impl, port, io->buffer_id); + io->buffer_id = SPA_ID_INVALID; + } break; default: return -ENOTSUP; diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c index c3e9f8700..355dcb328 100644 --- a/spa/plugins/videotestsrc/videotestsrc.c +++ b/spa/plugins/videotestsrc/videotestsrc.c @@ -352,6 +352,7 @@ static int impl_node_send_command(void *object, const struct spa_command *comman { struct impl *this = object; struct port *port; + struct spa_io_buffers *io; spa_return_val_if_fail(this != NULL, -EINVAL); spa_return_val_if_fail(command != NULL, -EINVAL); @@ -389,6 +390,11 @@ static int impl_node_send_command(void *object, const struct spa_command *comman return 0; this->started = false; set_timer(this, false); + io = port->io; + if (io && (io->buffer_id < port->n_buffers)) { + reuse_buffer(this, port, io->buffer_id); + io->buffer_id = SPA_ID_INVALID; + } break; default: return -ENOTSUP; @@ -527,7 +533,7 @@ impl_node_port_enum_params(void *object, int seq, result.id = id; result.next = start; - next: +next: result.index = result.next++; spa_pod_builder_init(&b, buffer, sizeof(buffer));