rtsp-session: add property extra-timeout

Extra time to add to the timeout, in seconds. This only
affects the time until a session is considered timed out
and is not signalled in the RTSP request responses.
Only the value of the timeout property is signalled in the
request responses.
This commit is contained in:
Göran Jönsson 2019-10-15 07:33:29 +02:00 committed by Sebastian Dröge
parent 0b1b6670c8
commit 74b19b3709

View file

@ -64,6 +64,7 @@ struct _GstRTSPSessionPrivate
GList *medias; GList *medias;
guint medias_cookie; guint medias_cookie;
guint extra_time_timeout;
}; };
#undef DEBUG #undef DEBUG
@ -71,6 +72,7 @@ struct _GstRTSPSessionPrivate
#define DEFAULT_TIMEOUT 60 #define DEFAULT_TIMEOUT 60
#define NO_TIMEOUT -1 #define NO_TIMEOUT -1
#define DEFAULT_ALWAYS_VISIBLE FALSE #define DEFAULT_ALWAYS_VISIBLE FALSE
#define DEFAULT_EXTRA_TIMEOUT 5
enum enum
{ {
@ -78,6 +80,7 @@ enum
PROP_SESSIONID, PROP_SESSIONID,
PROP_TIMEOUT, PROP_TIMEOUT,
PROP_TIMEOUT_ALWAYS_VISIBLE, PROP_TIMEOUT_ALWAYS_VISIBLE,
PROP_EXTRA_TIME_TIMEOUT,
PROP_LAST PROP_LAST
}; };
@ -118,6 +121,28 @@ gst_rtsp_session_class_init (GstRTSPSessionClass * klass)
"timeout always visible in header", "timeout always visible in header",
DEFAULT_ALWAYS_VISIBLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); DEFAULT_ALWAYS_VISIBLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GstRTSPSession::extra-timeout:
*
* Extra time to add to the timeout, in seconds. This only affects the
* time until a session is considered timed out and is not signalled
* in the RTSP request responses. Only the value of the timeout
* property is signalled in the request responses.
*
* Default value is 5 seconds.
* If the application is using a buffer that is configured to hold
* amount of data equal to the sessiontimeout, extra-timeout can be
* set to zero to prevent loss of data
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_EXTRA_TIME_TIMEOUT,
g_param_spec_uint ("extra-timeout",
"Add extra time to timeout ", "Add extra time to timeout", 0,
G_MAXUINT, DEFAULT_EXTRA_TIMEOUT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
GST_DEBUG_CATEGORY_INIT (rtsp_session_debug, "rtspsession", 0, GST_DEBUG_CATEGORY_INIT (rtsp_session_debug, "rtspsession", 0,
"GstRTSPSession"); "GstRTSPSession");
} }
@ -134,6 +159,7 @@ gst_rtsp_session_init (GstRTSPSession * session)
g_mutex_init (&priv->lock); g_mutex_init (&priv->lock);
g_mutex_init (&priv->last_access_lock); g_mutex_init (&priv->last_access_lock);
priv->timeout = DEFAULT_TIMEOUT; priv->timeout = DEFAULT_TIMEOUT;
priv->extra_time_timeout = DEFAULT_EXTRA_TIMEOUT;
gst_rtsp_session_touch (session); gst_rtsp_session_touch (session);
} }
@ -177,6 +203,9 @@ gst_rtsp_session_get_property (GObject * object, guint propid,
case PROP_TIMEOUT_ALWAYS_VISIBLE: case PROP_TIMEOUT_ALWAYS_VISIBLE:
g_value_set_boolean (value, priv->timeout_always_visible); g_value_set_boolean (value, priv->timeout_always_visible);
break; break;
case PROP_EXTRA_TIME_TIMEOUT:
g_value_set_uint (value, priv->extra_time_timeout);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
} }
@ -202,6 +231,11 @@ gst_rtsp_session_set_property (GObject * object, guint propid,
priv->timeout_always_visible = g_value_get_boolean (value); priv->timeout_always_visible = g_value_get_boolean (value);
g_mutex_unlock (&priv->lock); g_mutex_unlock (&priv->lock);
break; break;
case PROP_EXTRA_TIME_TIMEOUT:
g_mutex_lock (&priv->lock);
priv->extra_time_timeout = g_value_get_uint (value);
g_mutex_unlock (&priv->lock);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
} }
@ -651,8 +685,11 @@ gst_rtsp_session_next_timeout_usec (GstRTSPSession * session, gint64 now)
last_access = GST_USECOND * (priv->last_access_monotonic_time); last_access = GST_USECOND * (priv->last_access_monotonic_time);
/* add timeout allow for 5 seconds of extra time */ /* add timeout allow for priv->extra_time_timeout
last_access += priv->timeout * GST_SECOND + (5 * GST_SECOND); * seconds of extra time */
last_access += priv->timeout * GST_SECOND +
(priv->extra_time_timeout * GST_SECOND);
g_mutex_unlock (&priv->last_access_lock); g_mutex_unlock (&priv->last_access_lock);
now_ns = GST_USECOND * now; now_ns = GST_USECOND * now;
@ -701,8 +738,11 @@ gst_rtsp_session_next_timeout (GstRTSPSession * session, GTimeVal * now)
last_access = GST_USECOND * (priv->last_access_real_time); last_access = GST_USECOND * (priv->last_access_real_time);
/* add timeout allow for 5 seconds of extra time */ /* add timeout allow for priv->extra_time_timeout
last_access += priv->timeout * GST_SECOND + (5 * GST_SECOND); * seconds of extra time */
last_access += priv->timeout * GST_SECOND +
(priv->extra_time_timeout * GST_SECOND);
g_mutex_unlock (&priv->last_access_lock); g_mutex_unlock (&priv->last_access_lock);
now_ns = GST_TIMEVAL_TO_TIME (*now); now_ns = GST_TIMEVAL_TO_TIME (*now);