From 3be19045585cccfeaaed60d80c8db4faeb660fdb Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Mon, 14 Jul 2025 11:52:22 +0900 Subject: [PATCH] pipewiresrc: should not activate the buffer pool from downstream pipewirsrc has own buffer pool and need to clear the buffer pool information in the query to prevent from being activated by base class. --- src/gst/gstpipewiresrc.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index 3c57028b4..bf8a41877 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -118,6 +118,8 @@ static gboolean gst_pipewire_src_event (GstBaseSrc * src, GstEvent * event); static gboolean gst_pipewire_src_query (GstBaseSrc * src, GstQuery * query); static void gst_pipewire_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, GstClockTime * start, GstClockTime * end); +static gboolean gst_pipewire_src_decide_allocation (GstBaseSrc * basesrc, + GstQuery * query); static void gst_pipewire_src_set_property (GObject * object, guint prop_id, @@ -502,6 +504,7 @@ gst_pipewire_src_class_init (GstPipeWireSrcClass * klass) gstbasesrc_class->event = gst_pipewire_src_event; gstbasesrc_class->query = gst_pipewire_src_query; gstbasesrc_class->get_times = gst_pipewire_src_get_times; + gstbasesrc_class->decide_allocation = gst_pipewire_src_decide_allocation; gstpushsrc_class->create = gst_pipewire_src_create; GST_DEBUG_CATEGORY_INIT (pipewire_src_debug, "pipewiresrc", 0, @@ -1552,6 +1555,22 @@ gst_pipewire_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, GST_TIME_ARGS (*start), *start, GST_TIME_ARGS (*end), *end); } +static gboolean +gst_pipewire_src_decide_allocation (GstBaseSrc * basesrc, GstQuery * query) +{ + guint i; + + /* Rewrite decide_allocation function to clear the buffer pool information + * in the query if it exists to prevent from being activated by base class + * because pipewirsrc has own buffer pool. + */ + for (i = 0; i < gst_query_get_n_allocation_pools (query); i++) { + gst_query_remove_nth_allocation_pool (query, i); + } + + return TRUE; +} + static GstFlowReturn gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer) {