summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2011-08-25 12:40:52 +0200
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2011-09-19 11:56:44 +0200
commitf65d4c83000788c2621fc5bced0d65e000924751 (patch)
tree3b97ef577fa92c2c72a3ed59ab4f57840324cc8b /gst
parent77ebd33991df40c239827f5666f2bbfc558518c4 (diff)
rtpsession: avoid timing out source too quickly
... following a PAUSE/PLAY cycle, particularly applicable when operating with a short RTCP interval (possibly forced so server-side).
Diffstat (limited to 'gst')
-rw-r--r--gst/rtpmanager/gstrtpsession.c4
-rw-r--r--gst/rtpmanager/rtpsession.c18
-rw-r--r--gst/rtpmanager/rtpsession.h1
3 files changed, 16 insertions, 7 deletions
diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c
index ebeb3fd9b..030a9e4bc 100644
--- a/gst/rtpmanager/gstrtpsession.c
+++ b/gst/rtpmanager/gstrtpsession.c
@@ -837,6 +837,10 @@ rtcp_thread (GstRtpSession * rtpsession)
session = rtpsession->priv->session;
+ GST_DEBUG_OBJECT (rtpsession, "starting at %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (current_time));
+ session->start_time = current_time;
+
while (!rtpsession->priv->stop_thread) {
GstClockReturn res;
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index 757fefe55..d5b7f13bf 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -2748,6 +2748,7 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
gboolean is_sender, is_active;
RTPSession *sess = data->sess;
GstClockTime interval;
+ GstClockTime btime;
is_sender = RTP_SOURCE_IS_SENDER (source);
is_active = RTP_SOURCE_IS_ACTIVE (source);
@@ -2766,11 +2767,13 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
}
/* sources that were inactive for more than 5 times the deterministic reporting
* interval get timed out. the min timeout is 5 seconds. */
- if (data->current_time > source->last_activity) {
+ /* mind old time that might pre-date last time going to PLAYING */
+ btime = MAX (source->last_activity, sess->start_time);
+ if (data->current_time > btime) {
interval = MAX (data->interval * 5, 5 * GST_SECOND);
- if (data->current_time - source->last_activity > interval) {
+ if (data->current_time - btime > interval) {
GST_DEBUG ("removing timeout source %08x, last %" GST_TIME_FORMAT,
- source->ssrc, GST_TIME_ARGS (source->last_activity));
+ source->ssrc, GST_TIME_ARGS (btime));
remove = TRUE;
}
}
@@ -2779,12 +2782,13 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
/* senders that did not send for a long time become a receiver, this also
* holds for our own source. */
if (is_sender) {
- if (data->current_time > source->last_rtp_activity) {
+ /* mind old time that might pre-date last time going to PLAYING */
+ btime = MAX (source->last_rtp_activity, sess->start_time);
+ if (data->current_time > btime) {
interval = MAX (data->interval * 2, 5 * GST_SECOND);
- if (data->current_time - source->last_rtp_activity > interval) {
+ if (data->current_time - btime > interval) {
GST_DEBUG ("sender source %08x timed out and became receiver, last %"
- GST_TIME_FORMAT, source->ssrc,
- GST_TIME_ARGS (source->last_rtp_activity));
+ GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime));
source->is_sender = FALSE;
sess->stats.sender_sources--;
sendertimeout = TRUE;
diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h
index 30b74bb5d..6b827f60a 100644
--- a/gst/rtpmanager/rtpsession.h
+++ b/gst/rtpmanager/rtpsession.h
@@ -209,6 +209,7 @@ struct _RTPSession {
GstClockTime next_rtcp_check_time;
GstClockTime last_rtcp_send_time;
+ GstClockTime start_time;
gboolean first_rtcp;
gboolean allow_early;