From c517e712ed3a06d7c0bbf0a7ab11a659317f9a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= Date: Thu, 7 Aug 2025 18:15:48 +0200 Subject: [PATCH] spa: libcamera: source: clear buffers when format is changed pipewire assumes that the buffers are removed from a port when its format is changed even without an explicit call to `port_use_buffer()`. So if the format is not just tested, clear the buffers, as well as the libcamera requests and buffers because they are also recreated when a new format is set. This matches the behaviour of the v4l2 plugin. Furthermore, this change also removes the call to `spa_libcamera_use_buffers()` because that function does nothing. And finally this change necessitates that the current format is always reset (when not testing), not just before reaching `spa_libcamera_set_format()`. --- spa/plugins/libcamera/libcamera-source.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/spa/plugins/libcamera/libcamera-source.cpp b/spa/plugins/libcamera/libcamera-source.cpp index 3e65cc2d3..485bbfb05 100644 --- a/spa/plugins/libcamera/libcamera-source.cpp +++ b/spa/plugins/libcamera/libcamera-source.cpp @@ -1849,16 +1849,16 @@ int port_set_format(struct impl *impl, struct port *port, { const bool try_only = SPA_FLAG_IS_SET(flags, SPA_NODE_PARAM_FLAG_TEST_ONLY); - if (format == nullptr) { - if (try_only || !port->current_format) - return 0; - + if (!try_only) { spa_libcamera_stream_off(impl); spa_libcamera_clear_buffers(impl, port); freeBuffers(impl, port); port->current_format.reset(); + } - spa_libcamera_close(impl); + if (format == nullptr) { + if (!try_only) + spa_libcamera_close(impl); } else { spa_video_info info; int res; @@ -1895,11 +1895,6 @@ int port_set_format(struct impl *impl, struct port *port, return -EINVAL; } - if (port->current_format && !try_only) { - spa_libcamera_use_buffers(impl, port, nullptr, 0); - port->current_format.reset(); - } - res = spa_libcamera_set_format(impl, port, &info, try_only); if (res < 0) return res;