Merge branch 'inhibit-reconfigure' into 'master'

gst: only reconfigure if not already negotiated

See merge request pipewire/pipewire!1297
This commit is contained in:
James Hilliard 2023-02-20 21:56:42 +00:00
commit 178bea3e9e

View file

@ -407,6 +407,7 @@ gst_pipewire_src_init (GstPipeWireSrc * src)
{ {
/* we operate in time */ /* we operate in time */
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_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 */ /* we're a live source, unless explicitly requested not to be */
gst_base_src_set_live (GST_BASE_SRC (src), TRUE); 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); thiscaps = gst_pad_query_caps (GST_BASE_SRC_PAD (basesrc), NULL);
GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps); GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps);
/* nothing or anything is allowed, we're done */ /* nothing or anything is allowed, we're done */
if (thiscaps == NULL) if (thiscaps == NULL || pwsrc->negotiated)
goto no_nego_needed; goto no_nego_needed;
if (G_UNLIKELY (gst_caps_is_empty (thiscaps))) 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", GST_DEBUG_OBJECT (basesrc, "connect capture with path %s, target-object %s",
pwsrc->path, pwsrc->target_object); pwsrc->path, pwsrc->target_object);
pwsrc->negotiated = FALSE;
pw_stream_connect (pwsrc->stream, pw_stream_connect (pwsrc->stream,
PW_DIRECTION_INPUT, PW_DIRECTION_INPUT,
target_id, target_id,
@ -1048,8 +1048,11 @@ gst_pipewire_src_unlock_stop (GstBaseSrc * basesrc)
static gboolean static gboolean
gst_pipewire_src_event (GstBaseSrc * src, GstEvent * event) gst_pipewire_src_event (GstBaseSrc * src, GstEvent * event)
{ {
GstPipeWireSrc *pwsrc = GST_PIPEWIRE_SRC (src);
gboolean res = FALSE; gboolean res = FALSE;
GST_DEBUG_OBJECT (pwsrc, "handle event %" GST_PTR_FORMAT, event);
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_CUSTOM_UPSTREAM: case GST_EVENT_CUSTOM_UPSTREAM:
if (gst_video_event_is_force_key_unit (event)) { 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); res = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
} }
break; break;
case GST_EVENT_RECONFIGURE:
if (!pwsrc->negotiated)
res = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
else
res = TRUE;
break;
default: default:
res = GST_BASE_SRC_CLASS (parent_class)->event (src, event); res = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
break; break;
@ -1425,11 +1434,11 @@ gst_pipewire_src_change_state (GstElement * element, GstStateChange transition)
case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
break; break;
case GST_STATE_CHANGE_PAUSED_TO_READY: case GST_STATE_CHANGE_PAUSED_TO_READY:
break;
case GST_STATE_CHANGE_READY_TO_NULL:
pw_thread_loop_lock (this->core->loop); pw_thread_loop_lock (this->core->loop);
this->negotiated = FALSE; this->negotiated = FALSE;
pw_thread_loop_unlock (this->core->loop); pw_thread_loop_unlock (this->core->loop);
break;
case GST_STATE_CHANGE_READY_TO_NULL:
gst_pipewire_src_close (this); gst_pipewire_src_close (this);
break; break;
default: default: