mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
bin: Use the new group-id field of the stream-start message for stream-start message aggregation
If all stream-start messages had a group id (for backwards compatibility), we only consider a stream started if all had the same group id. In 2.0 we should make the group id mandatory.
This commit is contained in:
parent
75d9454bf4
commit
7c936a4cc2
1 changed files with 32 additions and 4 deletions
36
gst/gstbin.c
36
gst/gstbin.c
|
@ -1011,12 +1011,16 @@ is_eos (GstBin * bin, guint32 * seqnum)
|
|||
*
|
||||
* call with bin LOCK */
|
||||
static gboolean
|
||||
is_stream_start (GstBin * bin, guint32 * seqnum)
|
||||
is_stream_start (GstBin * bin, guint32 * seqnum, gboolean * have_group_id,
|
||||
guint * group_id)
|
||||
{
|
||||
gboolean result;
|
||||
gint n_stream_start = 0;
|
||||
GList *walk, *msgs;
|
||||
guint tmp_group_id;
|
||||
gboolean first = TRUE, same_group_id = TRUE;
|
||||
|
||||
*have_group_id = TRUE;
|
||||
*group_id = 0;
|
||||
result = TRUE;
|
||||
for (walk = bin->children; walk; walk = g_list_next (walk)) {
|
||||
GstElement *element;
|
||||
|
@ -1029,7 +1033,18 @@ is_stream_start (GstBin * bin, guint32 * seqnum)
|
|||
GST_MESSAGE_STREAM_START))) {
|
||||
GST_DEBUG ("sink '%s' posted STREAM_START", GST_ELEMENT_NAME (element));
|
||||
*seqnum = gst_message_get_seqnum (GST_MESSAGE_CAST (msgs->data));
|
||||
n_stream_start++;
|
||||
if (gst_message_parse_group_id (GST_MESSAGE_CAST (msgs->data),
|
||||
&tmp_group_id)) {
|
||||
if (first) {
|
||||
first = FALSE;
|
||||
*group_id = tmp_group_id;
|
||||
} else {
|
||||
if (tmp_group_id != *group_id)
|
||||
same_group_id = FALSE;
|
||||
}
|
||||
} else {
|
||||
*have_group_id = FALSE;
|
||||
}
|
||||
} else {
|
||||
GST_DEBUG ("sink '%s' did not post STREAM_START yet",
|
||||
GST_ELEMENT_NAME (element));
|
||||
|
@ -1039,6 +1054,14 @@ is_stream_start (GstBin * bin, guint32 * seqnum)
|
|||
}
|
||||
}
|
||||
|
||||
/* If all have a group_id we only consider this stream started
|
||||
* if all group ids were the same and all sinks posted a stream-start
|
||||
* message */
|
||||
if (*have_group_id)
|
||||
return same_group_id && result;
|
||||
/* otherwise consider this stream started after all sinks
|
||||
* have reported stream-start for backward compatibility.
|
||||
* FIXME 2.0: This should go away! */
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -3195,12 +3218,14 @@ bin_do_stream_start (GstBin * bin)
|
|||
{
|
||||
guint32 seqnum = 0;
|
||||
gboolean stream_start;
|
||||
gboolean have_group_id = FALSE;
|
||||
guint group_id = 0;
|
||||
|
||||
GST_OBJECT_LOCK (bin);
|
||||
/* If all sinks are STREAM_START we forward the STREAM_START message
|
||||
* to the parent bin or application
|
||||
*/
|
||||
stream_start = is_stream_start (bin, &seqnum);
|
||||
stream_start = is_stream_start (bin, &seqnum, &have_group_id, &group_id);
|
||||
GST_OBJECT_UNLOCK (bin);
|
||||
|
||||
if (stream_start) {
|
||||
|
@ -3212,6 +3237,9 @@ bin_do_stream_start (GstBin * bin)
|
|||
|
||||
tmessage = gst_message_new_stream_start (GST_OBJECT_CAST (bin));
|
||||
gst_message_set_seqnum (tmessage, seqnum);
|
||||
if (have_group_id)
|
||||
gst_message_set_group_id (tmessage, group_id);
|
||||
|
||||
GST_DEBUG_OBJECT (bin,
|
||||
"all sinks posted STREAM_START, posting seqnum #%" G_GUINT32_FORMAT,
|
||||
seqnum);
|
||||
|
|
Loading…
Reference in a new issue