mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
media: keep track of active transports
Keep track of which transport is active to avoid closing the connection too soon. Remove the destination transport also when going to NULL. Print some stats about the SDES and other RTCP messages we receive from the clients.
This commit is contained in:
parent
b0beb1c8d1
commit
5955fc7d12
2 changed files with 42 additions and 5 deletions
|
@ -690,16 +690,40 @@ caps_notify (GstPad * pad, GParamSpec * unused, GstRTSPMediaStream * stream)
|
||||||
g_free (capsstr);
|
g_free (capsstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dump_structure (const GstStructure *s)
|
||||||
|
{
|
||||||
|
gchar *sstr;
|
||||||
|
|
||||||
|
sstr = gst_structure_to_string (s);
|
||||||
|
g_message ("structure: %s", sstr);
|
||||||
|
g_free (sstr);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_new_ssrc (GObject *session, GObject *source, GstRTSPMedia *media)
|
on_new_ssrc (GObject *session, GObject *source, GstRTSPMedia *media)
|
||||||
{
|
{
|
||||||
g_message ("%p: new source %p", media, source);
|
g_message ("%p: new source %p", media, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_ssrc_sdes (GObject *session, GObject *source, GstRTSPMedia *media)
|
||||||
|
{
|
||||||
|
GstStructure *sdes;
|
||||||
|
|
||||||
|
g_message ("%p: new SDES %p", media, source);
|
||||||
|
g_object_get (source, "sdes", &sdes, NULL);
|
||||||
|
dump_structure (sdes);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_ssrc_active (GObject *session, GObject *source, GstRTSPMedia *media)
|
on_ssrc_active (GObject *session, GObject *source, GstRTSPMedia *media)
|
||||||
{
|
{
|
||||||
|
GstStructure *stats;
|
||||||
|
|
||||||
g_message ("%p: source %p is active", media, source);
|
g_message ("%p: source %p is active", media, source);
|
||||||
|
g_object_get (source, "stats", &stats, NULL);
|
||||||
|
dump_structure (stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -813,6 +837,8 @@ setup_stream (GstRTSPMediaStream *stream, guint idx, GstRTSPMedia *media)
|
||||||
|
|
||||||
g_signal_connect (stream->session, "on-new-ssrc", (GCallback) on_new_ssrc,
|
g_signal_connect (stream->session, "on-new-ssrc", (GCallback) on_new_ssrc,
|
||||||
media);
|
media);
|
||||||
|
g_signal_connect (stream->session, "on-ssrc-sdes", (GCallback) on_ssrc_sdes,
|
||||||
|
media);
|
||||||
g_signal_connect (stream->session, "on-ssrc-active", (GCallback) on_ssrc_active,
|
g_signal_connect (stream->session, "on-ssrc-active", (GCallback) on_ssrc_active,
|
||||||
media);
|
media);
|
||||||
g_signal_connect (stream->session, "on-bye-ssrc", (GCallback) on_bye_ssrc,
|
g_signal_connect (stream->session, "on-bye-ssrc", (GCallback) on_bye_ssrc,
|
||||||
|
@ -1025,6 +1051,10 @@ default_handle_message (GstRTSPMedia *media, GstMessage *message)
|
||||||
g_free (debug);
|
g_free (debug);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_MESSAGE_ELEMENT:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
g_message ("%p: got message type %s", media, gst_message_type_get_name (type));
|
g_message ("%p: got message type %s", media, gst_message_type_get_name (type));
|
||||||
break;
|
break;
|
||||||
|
@ -1279,11 +1309,13 @@ gst_rtsp_media_set_state (GstRTSPMedia *media, GstState state, GArray *transport
|
||||||
|
|
||||||
add = remove = FALSE;
|
add = remove = FALSE;
|
||||||
|
|
||||||
|
g_message ("going to state %s media %p", gst_element_state_get_name (state), media);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case GST_STATE_NULL:
|
case GST_STATE_NULL:
|
||||||
/* unlock the streams so that they follow the state changes from now on */
|
/* unlock the streams so that they follow the state changes from now on */
|
||||||
unlock_streams (media);
|
unlock_streams (media);
|
||||||
break;
|
/* fallthrough */
|
||||||
case GST_STATE_PAUSED:
|
case GST_STATE_PAUSED:
|
||||||
/* we're going from PLAYING to PAUSED, READY or NULL, remove */
|
/* we're going from PLAYING to PAUSED, READY or NULL, remove */
|
||||||
if (media->target_state == GST_STATE_PLAYING)
|
if (media->target_state == GST_STATE_PLAYING)
|
||||||
|
@ -1325,27 +1357,31 @@ gst_rtsp_media_set_state (GstRTSPMedia *media, GstState state, GArray *transport
|
||||||
min = trans->client_port.min;
|
min = trans->client_port.min;
|
||||||
max = trans->client_port.max;
|
max = trans->client_port.max;
|
||||||
|
|
||||||
if (add) {
|
if (add && !tr->active) {
|
||||||
g_message ("adding %s:%d-%d", dest, min, max);
|
g_message ("adding %s:%d-%d", dest, min, max);
|
||||||
g_signal_emit_by_name (stream->udpsink[0], "add", dest, min, NULL);
|
g_signal_emit_by_name (stream->udpsink[0], "add", dest, min, NULL);
|
||||||
g_signal_emit_by_name (stream->udpsink[1], "add", dest, max, NULL);
|
g_signal_emit_by_name (stream->udpsink[1], "add", dest, max, NULL);
|
||||||
|
tr->active = TRUE;
|
||||||
media->active++;
|
media->active++;
|
||||||
} else if (remove) {
|
} else if (remove && tr->active) {
|
||||||
g_message ("removing %s:%d-%d", dest, min, max);
|
g_message ("removing %s:%d-%d", dest, min, max);
|
||||||
g_signal_emit_by_name (stream->udpsink[0], "remove", dest, min, NULL);
|
g_signal_emit_by_name (stream->udpsink[0], "remove", dest, min, NULL);
|
||||||
g_signal_emit_by_name (stream->udpsink[1], "remove", dest, max, NULL);
|
g_signal_emit_by_name (stream->udpsink[1], "remove", dest, max, NULL);
|
||||||
|
tr->active = FALSE;
|
||||||
media->active--;
|
media->active--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_RTSP_LOWER_TRANS_TCP:
|
case GST_RTSP_LOWER_TRANS_TCP:
|
||||||
if (add) {
|
if (add && !tr->active) {
|
||||||
g_message ("adding TCP %s", trans->destination);
|
g_message ("adding TCP %s", trans->destination);
|
||||||
stream->transports = g_list_prepend (stream->transports, tr);
|
stream->transports = g_list_prepend (stream->transports, tr);
|
||||||
|
tr->active = TRUE;
|
||||||
media->active++;
|
media->active++;
|
||||||
} else if (remove) {
|
} else if (remove && tr->active) {
|
||||||
g_message ("removing TCP %s", trans->destination);
|
g_message ("removing TCP %s", trans->destination);
|
||||||
stream->transports = g_list_remove (stream->transports, tr);
|
stream->transports = g_list_remove (stream->transports, tr);
|
||||||
|
tr->active = FALSE;
|
||||||
media->active--;
|
media->active--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -61,6 +61,7 @@ struct _GstRTSPMediaTrans {
|
||||||
GstRTSPSendFunc send_rtcp;
|
GstRTSPSendFunc send_rtcp;
|
||||||
gpointer user_data;
|
gpointer user_data;
|
||||||
GDestroyNotify notify;
|
GDestroyNotify notify;
|
||||||
|
gboolean active;
|
||||||
|
|
||||||
GstRTSPTransport *transport;
|
GstRTSPTransport *transport;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue