diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index 8267c6950..52876b4ca 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -407,6 +407,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)); /* we're a live source, unless explicitly requested not to be */ gst_base_src_set_live (GST_BASE_SRC (src), TRUE); @@ -797,7 +798,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))) @@ -869,7 +870,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, @@ -1048,8 +1048,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)) { @@ -1065,6 +1068,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; @@ -1425,11 +1434,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: