summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChrisDuncanAnyvision <chrisd@anyvision.co>2020-11-10 18:18:12 +0000
committerTim-Philipp Müller <tim@centricular.com>2020-11-11 10:07:23 +0000
commit2009453d416dfb6d4129a231f28c0f46a53b35df (patch)
tree975100f174780b6954850276c0fc19e950b09080
parent35f52729fc8bd962bd7676ca4b656932f4cbbad4 (diff)
downloadgstreamer-plugins-good-2009453d416dfb6d4129a231f28c0f46a53b35df.tar.gz
rtspsrc: Ensure same group-id used for both TCP/UDP stream-start events
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/814>
-rw-r--r--gst/rtsp/gstrtspsrc.c27
-rw-r--r--gst/rtsp/gstrtspsrc.h3
2 files changed, 28 insertions, 2 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index b34e3c03f..5f9f0febf 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -1400,6 +1400,7 @@ gst_rtspsrc_init (GstRTSPSrc * src)
src->onvif_rate_control = DEFAULT_ONVIF_RATE_CONTROL;
src->is_live = DEFAULT_IS_LIVE;
src->seek_seqnum = GST_SEQNUM_INVALID;
+ src->group_id = GST_GROUP_ID_INVALID;
/* get a list of all extensions */
src->extensions = gst_rtsp_ext_list_get ();
@@ -1423,6 +1424,8 @@ gst_rtspsrc_init (GstRTSPSrc * src)
g_mutex_init (&src->conninfo.recv_lock);
g_cond_init (&src->cmd_cond);
+ g_mutex_init (&src->group_lock);
+
GST_OBJECT_FLAG_SET (src, GST_ELEMENT_FLAG_SOURCE);
gst_bin_set_suppressed_flags (GST_BIN (src),
GST_ELEMENT_FLAG_SOURCE | GST_ELEMENT_FLAG_SINK);
@@ -1478,6 +1481,8 @@ gst_rtspsrc_finalize (GObject * object)
g_mutex_clear (&rtspsrc->conninfo.recv_lock);
g_cond_clear (&rtspsrc->cmd_cond);
+ g_mutex_clear (&rtspsrc->group_lock);
+
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -2987,6 +2992,19 @@ gst_rtspsrc_handle_src_event (GstPad * pad, GstObject * parent,
return res;
}
+static void
+gst_rtspsrc_stream_start_event_add_group_id (GstRTSPSrc * src, GstEvent * event)
+{
+ g_mutex_lock (&src->group_lock);
+
+ if (src->group_id == GST_GROUP_ID_INVALID)
+ src->group_id = gst_util_group_id_next ();
+
+ g_mutex_unlock (&src->group_lock);
+
+ gst_event_set_group_id (event, src->group_id);
+}
+
static gboolean
gst_rtspsrc_handle_src_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event)
@@ -3005,12 +3023,15 @@ gst_rtspsrc_handle_src_sink_event (GstPad * pad, GstObject * parent,
cs = g_checksum_new (G_CHECKSUM_SHA256);
uri = self->conninfo.location;
g_checksum_update (cs, (const guchar *) uri, strlen (uri));
+
stream_id =
g_strdup_printf ("%s/%s", g_checksum_get_string (cs),
stream->stream_id);
+
g_checksum_free (cs);
gst_event_unref (event);
event = gst_event_new_stream_start (stream_id);
+ gst_rtspsrc_stream_start_event_add_group_id (self, event);
g_free (stream_id);
break;
}
@@ -5393,7 +5414,6 @@ gst_rtspsrc_handle_data (GstRTSPSrc * src, GstRTSPMessage * message)
GChecksum *cs;
gchar *uri;
GList *streams;
- guint group_id = gst_util_group_id_next ();
/* generate an SHA256 sum of the URI */
cs = g_checksum_new (G_CHECKSUM_SHA256);
@@ -5411,8 +5431,10 @@ gst_rtspsrc_handle_data (GstRTSPSrc * src, GstRTSPMessage * message)
stream_id =
g_strdup_printf ("%s/%d", g_checksum_get_string (cs), ostream->id);
+
event = gst_event_new_stream_start (stream_id);
- gst_event_set_group_id (event, group_id);
+
+ gst_rtspsrc_stream_start_event_add_group_id (src, event);
g_free (stream_id);
gst_rtspsrc_stream_push_event (src, ostream, event);
@@ -9173,6 +9195,7 @@ gst_rtspsrc_change_state (GstElement * element, GstStateChange transition)
}
break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
+ rtspsrc->group_id = GST_GROUP_ID_INVALID;
break;
default:
break;
diff --git a/gst/rtsp/gstrtspsrc.h b/gst/rtsp/gstrtspsrc.h
index 743ad15c9..469d2dace 100644
--- a/gst/rtsp/gstrtspsrc.h
+++ b/gst/rtsp/gstrtspsrc.h
@@ -324,6 +324,9 @@ struct _GstRTSPSrc {
GstRTSPVersion version;
GstEvent *initial_seek;
+
+ guint group_id;
+ GMutex group_lock;
};
struct _GstRTSPSrcClass {