gst: only reconfigure if not already negotiated

It appears that negotiate leaks resources if called more than once.

Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
This commit is contained in:
James Hilliard 2022-06-27 11:27:32 -06:00
parent 67db81729e
commit a1e57b4919

View file

@ -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: