inputselector: Use a separate query for upstream pads and let it fail if one upstream query fails

This commit is contained in:
Sebastian Dröge 2015-02-19 01:16:52 +02:00
parent 6f9adbe273
commit 66e8d3b9a0

View file

@ -1587,6 +1587,7 @@ gst_input_selector_query (GstPad * pad, GstObject * parent, GstQuery * query)
resmin = 0; resmin = 0;
resmax = -1; resmax = -1;
reslive = FALSE; reslive = FALSE;
res = TRUE;
/* perform the query on all sinkpads and combine the results. We take the /* perform the query on all sinkpads and combine the results. We take the
* max of min and the min of max for the result latency. */ * max of min and the min of max for the result latency. */
@ -1594,15 +1595,15 @@ gst_input_selector_query (GstPad * pad, GstObject * parent, GstQuery * query)
for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk; for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk;
walk = g_list_next (walk)) { walk = g_list_next (walk)) {
GstPad *sinkpad = GST_PAD_CAST (walk->data); GstPad *sinkpad = GST_PAD_CAST (walk->data);
GstQuery *peerquery;
if (gst_pad_peer_query (sinkpad, query)) { peerquery = gst_query_new_latency ();
if (gst_pad_peer_query (sinkpad, peerquery)) {
GstClockTime min, max; GstClockTime min, max;
gboolean live; gboolean live;
/* one query succeeded, we succeed too */ gst_query_parse_latency (peerquery, &live, &min, &max);
res = TRUE;
gst_query_parse_latency (query, &live, &min, &max);
GST_DEBUG_OBJECT (sinkpad, GST_DEBUG_OBJECT (sinkpad,
"peer latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT "peer latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
@ -1618,7 +1619,11 @@ gst_input_selector_query (GstPad * pad, GstObject * parent, GstQuery * query)
if (!reslive) if (!reslive)
reslive = live; reslive = live;
} }
} else {
GST_LOG_OBJECT (sinkpad, "latency query failed");
res = FALSE;
} }
gst_query_unref (peerquery);
} }
GST_INPUT_SELECTOR_UNLOCK (sel); GST_INPUT_SELECTOR_UNLOCK (sel);
if (res) { if (res) {