From a1e57b49197a872990f31cedb2b193bcdeac304b Mon Sep 17 00:00:00 2001 From: James Hilliard Date: Mon, 27 Jun 2022 11:27:32 -0600 Subject: [PATCH] gst: only reconfigure if not already negotiated It appears that negotiate leaks resources if called more than once. Signed-off-by: James Hilliard --- src/gst/gstpipewiresrc.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index 54b0c957c..338b868be 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -424,6 +424,7 @@ gst_pipewire_src_init (GstPipeWireSrc * src) { /* we operate in time */ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); + gst_pad_use_fixed_caps (GST_BASE_SRC_PAD (src)); GST_OBJECT_FLAG_SET (src, GST_ELEMENT_FLAG_PROVIDE_CLOCK); @@ -744,7 +745,7 @@ gst_pipewire_src_negotiate (GstBaseSrc * basesrc) thiscaps = gst_pad_query_caps (GST_BASE_SRC_PAD (basesrc), NULL); GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps); /* nothing or anything is allowed, we're done */ - if (thiscaps == NULL) + if (thiscaps == NULL || pwsrc->negotiated) goto no_nego_needed; if (G_UNLIKELY (gst_caps_is_empty (thiscaps))) @@ -814,7 +815,6 @@ gst_pipewire_src_negotiate (GstBaseSrc * basesrc) GST_DEBUG_OBJECT (basesrc, "connect capture with path %s, target-object %s", pwsrc->path, pwsrc->target_object); - pwsrc->negotiated = FALSE; pw_stream_connect (pwsrc->stream, PW_DIRECTION_INPUT, target_id, @@ -975,8 +975,11 @@ gst_pipewire_src_unlock_stop (GstBaseSrc * basesrc) static gboolean gst_pipewire_src_event (GstBaseSrc * src, GstEvent * event) { + GstPipeWireSrc *pwsrc = GST_PIPEWIRE_SRC (src); gboolean res = FALSE; + GST_DEBUG_OBJECT (pwsrc, "handle event %" GST_PTR_FORMAT, event); + switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_UPSTREAM: if (gst_video_event_is_force_key_unit (event)) { @@ -992,6 +995,12 @@ gst_pipewire_src_event (GstBaseSrc * src, GstEvent * event) res = GST_BASE_SRC_CLASS (parent_class)->event (src, event); } break; + case GST_EVENT_RECONFIGURE: + if (!pwsrc->negotiated) + res = GST_BASE_SRC_CLASS (parent_class)->event (src, event); + else + res = TRUE; + break; default: res = GST_BASE_SRC_CLASS (parent_class)->event (src, event); break; @@ -1357,11 +1366,11 @@ gst_pipewire_src_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: pw_thread_loop_lock (this->core->loop); this->negotiated = FALSE; pw_thread_loop_unlock (this->core->loop); - break; - case GST_STATE_CHANGE_READY_TO_NULL: gst_pipewire_src_close (this); break; default: