mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
sessionpool: add function to filter sessions
Add generic function to retrieve/remove sessions.
This commit is contained in:
parent
a403469a03
commit
a4c90c28c7
2 changed files with 110 additions and 0 deletions
|
@ -380,6 +380,74 @@ gst_rtsp_session_pool_cleanup (GstRTSPSessionPool *pool)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GstRTSPSessionPool *pool;
|
||||||
|
GstRTSPSessionFilterFunc func;
|
||||||
|
gpointer user_data;
|
||||||
|
GList *list;
|
||||||
|
} FilterData;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
filter_func (gchar *sessionid, GstRTSPSession *sess, FilterData *data)
|
||||||
|
{
|
||||||
|
switch (data->func (data->pool, sess, data->user_data)) {
|
||||||
|
case GST_RTSP_FILTER_REMOVE:
|
||||||
|
return TRUE;
|
||||||
|
case GST_RTSP_FILTER_REF:
|
||||||
|
/* keep ref */
|
||||||
|
data->list = g_list_prepend (data->list, g_object_ref (sess));
|
||||||
|
/* fallthrough */
|
||||||
|
default:
|
||||||
|
case GST_RTSP_FILTER_KEEP:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtsp_session_pool_filter:
|
||||||
|
* @pool: a #GstRTSPSessionPool
|
||||||
|
* @func: a callback
|
||||||
|
* @user_data: user data passed to @func
|
||||||
|
*
|
||||||
|
* Call @func for each session in @pool. The result value of @func determines
|
||||||
|
* what happens to the session. @func will be called with the session pool
|
||||||
|
* locked so no further actions on @pool can be performed from @func.
|
||||||
|
*
|
||||||
|
* If @func returns #GST_RTSP_FILTER_REMOVE, the session will be removed from
|
||||||
|
* @pool.
|
||||||
|
*
|
||||||
|
* If @func returns #GST_RTSP_FILTER_KEEP, the session will remain in @pool.
|
||||||
|
*
|
||||||
|
* If @func returns #GST_RTSP_FILTER_REF, the session will remain in @pool but
|
||||||
|
* will also be added with an additional ref to the result GList of this
|
||||||
|
* function..
|
||||||
|
*
|
||||||
|
* Returns: a GList with all sessions for which @func returned
|
||||||
|
* #GST_RTSP_FILTER_REF. After usage, each element in the GList should be unreffed
|
||||||
|
* before the list is freed.
|
||||||
|
*/
|
||||||
|
GList *
|
||||||
|
gst_rtsp_session_pool_filter (GstRTSPSessionPool *pool,
|
||||||
|
GstRTSPSessionFilterFunc func, gpointer user_data)
|
||||||
|
{
|
||||||
|
FilterData data;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_RTSP_SESSION_POOL (pool), NULL);
|
||||||
|
g_return_val_if_fail (func != NULL, NULL);
|
||||||
|
|
||||||
|
data.pool = pool;
|
||||||
|
data.func = func;
|
||||||
|
data.user_data = user_data;
|
||||||
|
data.list = NULL;
|
||||||
|
|
||||||
|
g_mutex_lock (pool->lock);
|
||||||
|
g_hash_table_foreach_remove (pool->sessions, (GHRFunc) filter_func, &data);
|
||||||
|
g_mutex_unlock (pool->lock);
|
||||||
|
|
||||||
|
return data.list;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GSource source;
|
GSource source;
|
||||||
|
|
|
@ -81,6 +81,45 @@ struct _GstRTSPSessionPoolClass {
|
||||||
*/
|
*/
|
||||||
typedef gboolean (*GstRTSPSessionPoolFunc) (GstRTSPSessionPool *pool, gpointer user_data);
|
typedef gboolean (*GstRTSPSessionPoolFunc) (GstRTSPSessionPool *pool, gpointer user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstRTSPFilterResult:
|
||||||
|
* @GST_RTSP_FILTER_REMOVE: Remove session
|
||||||
|
* @GST_RTSP_FILTER_KEEP: Keep session in the pool
|
||||||
|
* @GST_RTSP_FILTER_REF: Ref session in the result list
|
||||||
|
*
|
||||||
|
* Possible return values for gst_rtsp_session_pool_filter().
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GST_RTSP_FILTER_REMOVE,
|
||||||
|
GST_RTSP_FILTER_KEEP,
|
||||||
|
GST_RTSP_FILTER_REF,
|
||||||
|
} GstRTSPFilterResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstRTSPSessionFilterFunc:
|
||||||
|
* @pool: a #GstRTSPSessionPool object
|
||||||
|
* @session: a #GstRTSPSession in @pool
|
||||||
|
* @user_data: user data that has been given to gst_rtsp_session_pool_filter()
|
||||||
|
*
|
||||||
|
* This function will be called by the gst_rtsp_session_pool_filter(). An
|
||||||
|
* implementation should return a value of #GstRTSPFilterResult.
|
||||||
|
*
|
||||||
|
* When this function returns #GST_RTSP_FILTER_REMOVE, @session will be removed
|
||||||
|
* from @pool.
|
||||||
|
*
|
||||||
|
* A return value of #GST_RTSP_FILTER_KEEP will leave @session untouched in
|
||||||
|
* @pool.
|
||||||
|
*
|
||||||
|
* A value of GST_RTSP_FILTER_REF will add @session to the result #GList of
|
||||||
|
* gst_rtsp_session_pool_filter().
|
||||||
|
*
|
||||||
|
* Returns: a #GstRTSPFilterResult.
|
||||||
|
*/
|
||||||
|
typedef GstRTSPFilterResult (*GstRTSPSessionFilterFunc) (GstRTSPSessionPool *pool,
|
||||||
|
GstRTSPSession *session,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
|
||||||
GType gst_rtsp_session_pool_get_type (void);
|
GType gst_rtsp_session_pool_get_type (void);
|
||||||
|
|
||||||
|
@ -101,6 +140,9 @@ gboolean gst_rtsp_session_pool_remove (GstRTSPSessionPoo
|
||||||
GstRTSPSession *sess);
|
GstRTSPSession *sess);
|
||||||
|
|
||||||
/* perform session maintenance */
|
/* perform session maintenance */
|
||||||
|
GList * gst_rtsp_session_pool_filter (GstRTSPSessionPool *pool,
|
||||||
|
GstRTSPSessionFilterFunc func,
|
||||||
|
gpointer user_data);
|
||||||
guint gst_rtsp_session_pool_cleanup (GstRTSPSessionPool *pool);
|
guint gst_rtsp_session_pool_cleanup (GstRTSPSessionPool *pool);
|
||||||
GSource * gst_rtsp_session_pool_create_watch (GstRTSPSessionPool *pool);
|
GSource * gst_rtsp_session_pool_create_watch (GstRTSPSessionPool *pool);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue