mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
pad: implement DRAIN handling
When we forward the DRAIN query and there is nothing to forward it to, assume we are drained. When a basesink receives a drain query, reply with TRUE.
This commit is contained in:
parent
318baf4cd9
commit
e332862985
2 changed files with 43 additions and 2 deletions
42
gst/gstpad.c
42
gst/gstpad.c
|
@ -2757,6 +2757,29 @@ filter_done:
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GstQuery *query;
|
||||
gboolean result;
|
||||
gboolean dispatched;
|
||||
} QueryData;
|
||||
|
||||
static gboolean
|
||||
query_forward_func (GstPad * pad, QueryData * data)
|
||||
{
|
||||
/* for each pad we send to, we should ref the query; it's up
|
||||
* to downstream to unref again when handled. */
|
||||
GST_LOG_OBJECT (pad, "query peer %p (%s) of %s:%s",
|
||||
data->query, GST_EVENT_TYPE_NAME (data->query), GST_DEBUG_PAD_NAME (pad));
|
||||
|
||||
data->result |= gst_pad_peer_query (pad, data->query);
|
||||
|
||||
data->dispatched = TRUE;
|
||||
|
||||
/* stop on first successful reply */
|
||||
return data->result;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_pad_query_default:
|
||||
* @pad: a #GstPad to call the default query handler on.
|
||||
|
@ -2804,8 +2827,23 @@ gst_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query)
|
|||
}
|
||||
|
||||
if (forward) {
|
||||
ret = gst_pad_forward
|
||||
(pad, (GstPadForwardFunction) gst_pad_peer_query, query);
|
||||
QueryData data;
|
||||
|
||||
data.query = query;
|
||||
data.dispatched = FALSE;
|
||||
data.result = FALSE;
|
||||
|
||||
gst_pad_forward (pad, (GstPadForwardFunction) query_forward_func, &data);
|
||||
|
||||
if (data.dispatched) {
|
||||
ret = data.result;
|
||||
} else {
|
||||
/* nothing dispatched, could be drained */
|
||||
if (GST_QUERY_TYPE (query) == GST_QUERY_DRAIN)
|
||||
ret = TRUE;
|
||||
else
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -4550,6 +4550,9 @@ gst_base_sink_default_query (GstBaseSink * basesink, GstQuery * query)
|
|||
res = TRUE;
|
||||
break;
|
||||
}
|
||||
case GST_QUERY_DRAIN:
|
||||
res = TRUE;
|
||||
break;
|
||||
default:
|
||||
res =
|
||||
gst_pad_query_default (basesink->sinkpad, GST_OBJECT_CAST (basesink),
|
||||
|
|
Loading…
Reference in a new issue