Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
e59ca646
Commit
e59ca646
authored
Nov 27, 2010
by
Pierre Ynard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rtsp: implement session timeouts
Based on keep-alive RTSP requests
parent
f5d7ac64
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
105 additions
and
7 deletions
+105
-7
modules/stream_out/rtp.c
modules/stream_out/rtp.c
+8
-0
modules/stream_out/rtsp.c
modules/stream_out/rtsp.c
+97
-7
No files found.
modules/stream_out/rtp.c
View file @
e59ca646
...
...
@@ -167,6 +167,12 @@ static const char *const ppsz_protocols[] = {
"interfaces (address 0.0.0.0), on port 554, with no path.\nTo listen " \
"only on the local interface, use \"localhost\" as address." )
#define RTSP_TIMEOUT_TEXT N_( "RTSP session timeout (s)" )
#define RTSP_TIMEOUT_LONGTEXT N_( "RTSP sessions will be closed after " \
"not receiving any RTSP request for this long. Setting it to a " \
"negative value or zero disables timeouts. The default is 60 (one " \
"minute)." )
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
...
...
@@ -240,6 +246,8 @@ vlc_module_begin ()
add_shortcut
(
"rtsp"
)
add_string
(
"rtsp-host"
,
NULL
,
RTSP_HOST_TEXT
,
RTSP_HOST_LONGTEXT
,
true
)
add_integer
(
"rtsp-timeout"
,
60
,
RTSP_TIMEOUT_TEXT
,
RTSP_TIMEOUT_LONGTEXT
,
true
)
vlc_module_end
()
...
...
modules/stream_out/rtsp.c
View file @
e59ca646
...
...
@@ -68,6 +68,9 @@ struct rtsp_stream_t
int
sessionc
;
rtsp_session_t
**
sessionv
;
int
timeout
;
vlc_timer_t
timer
;
};
...
...
@@ -79,6 +82,8 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args,
const
httpd_message_t
*
query
);
static
void
RtspClientDel
(
rtsp_stream_t
*
rtsp
,
rtsp_session_t
*
session
);
static
void
RtspTimeOut
(
void
*
data
);
rtsp_stream_t
*
RtspSetup
(
vlc_object_t
*
owner
,
vod_media_t
*
media
,
const
vlc_url_t
*
url
)
{
...
...
@@ -100,6 +105,13 @@ rtsp_stream_t *RtspSetup( vlc_object_t *owner, vod_media_t *media,
rtsp
->
track_id
=
0
;
vlc_mutex_init
(
&
rtsp
->
lock
);
rtsp
->
timeout
=
var_InheritInteger
(
owner
,
"rtsp-timeout"
);
if
(
rtsp
->
timeout
>
0
)
{
if
(
vlc_timer_create
(
&
rtsp
->
timer
,
RtspTimeOut
,
rtsp
))
goto
error
;
}
rtsp
->
port
=
(
url
->
i_port
>
0
)
?
url
->
i_port
:
554
;
rtsp
->
psz_path
=
strdup
(
(
url
->
psz_path
!=
NULL
)
?
url
->
psz_path
:
"/"
);
if
(
rtsp
->
psz_path
==
NULL
)
...
...
@@ -138,11 +150,14 @@ void RtspUnsetup( rtsp_stream_t *rtsp )
if
(
rtsp
->
url
)
httpd_UrlDelete
(
rtsp
->
url
);
if
(
rtsp
->
host
)
httpd_HostDelete
(
rtsp
->
host
);
while
(
rtsp
->
sessionc
>
0
)
RtspClientDel
(
rtsp
,
rtsp
->
sessionv
[
0
]
);
if
(
rtsp
->
host
)
httpd_HostDelete
(
rtsp
->
host
);
if
(
rtsp
->
timeout
>
0
)
vlc_timer_destroy
(
rtsp
->
timer
);
free
(
rtsp
->
psz_path
);
vlc_mutex_destroy
(
&
rtsp
->
lock
);
...
...
@@ -172,6 +187,7 @@ struct rtsp_session_t
{
rtsp_stream_t
*
stream
;
uint64_t
id
;
mtime_t
last_seen
;
/* for timeouts */
bool
vod_started
;
/* true if the VoD media instance was created */
/* output (id-access) */
...
...
@@ -288,6 +304,49 @@ void RtspDelId( rtsp_stream_t *rtsp, rtsp_stream_id_t *id )
}
/** rtsp must be locked */
static
void
RtspUpdateTimer
(
rtsp_stream_t
*
rtsp
)
{
if
(
rtsp
->
timeout
<=
0
)
return
;
mtime_t
timeout
=
0
;
for
(
int
i
=
0
;
i
<
rtsp
->
sessionc
;
i
++
)
{
if
(
timeout
==
0
||
rtsp
->
sessionv
[
i
]
->
last_seen
<
timeout
)
timeout
=
rtsp
->
sessionv
[
i
]
->
last_seen
;
}
if
(
timeout
!=
0
)
timeout
+=
rtsp
->
timeout
*
CLOCK_FREQ
;
vlc_timer_schedule
(
rtsp
->
timer
,
true
,
timeout
,
0
);
}
static
void
RtspTimeOut
(
void
*
data
)
{
rtsp_stream_t
*
rtsp
=
data
;
vlc_mutex_lock
(
&
rtsp
->
lock
);
mtime_t
now
=
mdate
();
for
(
int
i
=
rtsp
->
sessionc
-
1
;
i
>=
0
;
i
--
)
{
if
(
rtsp
->
sessionv
[
i
]
->
last_seen
+
rtsp
->
timeout
*
CLOCK_FREQ
<
now
)
{
if
(
rtsp
->
vod_media
!=
NULL
)
{
char
psz_sesbuf
[
17
];
snprintf
(
psz_sesbuf
,
sizeof
(
psz_sesbuf
),
"%"
PRIx64
,
rtsp
->
sessionv
[
i
]
->
id
);
vod_stop
(
rtsp
->
vod_media
,
psz_sesbuf
);
}
RtspClientDel
(
rtsp
,
rtsp
->
sessionv
[
i
]);
}
}
RtspUpdateTimer
(
rtsp
);
vlc_mutex_unlock
(
&
rtsp
->
lock
);
}
/** rtsp must be locked */
static
rtsp_session_t
*
RtspClientNew
(
rtsp_stream_t
*
rtsp
)
...
...
@@ -349,6 +408,17 @@ void RtspClientDel( rtsp_stream_t *rtsp, rtsp_session_t *session )
}
/** rtsp must be locked */
static
void
RtspClientAlive
(
rtsp_session_t
*
session
)
{
if
(
session
->
stream
->
timeout
<=
0
)
return
;
session
->
last_seen
=
mdate
();
RtspUpdateTimer
(
session
->
stream
);
}
/* Attach a starting VoD RTP id to its RTSP track, and let it
* initialize with the parameters of the SETUP request */
int
RtspTrackAttach
(
rtsp_stream_t
*
rtsp
,
const
char
*
name
,
...
...
@@ -764,6 +834,7 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
continue
;
}
}
RtspClientAlive
(
ses
);
INSERT_ELEM
(
ses
->
trackv
,
ses
->
trackc
,
ses
->
trackc
,
track
);
...
...
@@ -825,6 +896,7 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
+
sizeof
(
"url=/trackID=123;seq=65535;"
"rtptime=4294967295, "
)
)
+
1
];
size_t
infolen
=
0
;
RtspClientAlive
(
ses
);
sout_stream_id_t
*
sout_id
=
NULL
;
if
(
vod
)
...
...
@@ -927,7 +999,10 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
vlc_mutex_lock
(
&
rtsp
->
lock
);
ses
=
RtspClientGet
(
rtsp
,
psz_session
);
if
(
ses
!=
NULL
)
{
vod_pause
(
rtsp
->
vod_media
,
psz_session
);
RtspClientAlive
(
ses
);
}
vlc_mutex_unlock
(
&
rtsp
->
lock
);
break
;
}
...
...
@@ -941,6 +1016,11 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
psz_session
=
httpd_MsgGet
(
query
,
"Session"
);
answer
->
i_status
=
200
;
vlc_mutex_lock
(
&
rtsp
->
lock
);
rtsp_session_t
*
ses
=
RtspClientGet
(
rtsp
,
psz_session
);
if
(
ses
!=
NULL
)
RtspClientAlive
(
ses
);
vlc_mutex_unlock
(
&
rtsp
->
lock
);
break
;
case
HTTPD_MSG_TEARDOWN
:
...
...
@@ -960,15 +1040,19 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
RtspClientDel
(
rtsp
,
ses
);
if
(
vod
)
vod_stop
(
rtsp
->
vod_media
,
psz_session
);
RtspUpdateTimer
(
rtsp
);
}
else
/* Delete one track from the session */
for
(
int
i
=
0
;
i
<
ses
->
trackc
;
i
++
)
{
if
(
ses
->
trackv
[
i
].
id
==
id
)
for
(
int
i
=
0
;
i
<
ses
->
trackc
;
i
++
)
{
RtspTrackClose
(
&
ses
->
trackv
[
i
]
);
REMOVE_ELEM
(
ses
->
trackv
,
ses
->
trackc
,
i
);
if
(
ses
->
trackv
[
i
].
id
==
id
)
{
RtspTrackClose
(
&
ses
->
trackv
[
i
]
);
REMOVE_ELEM
(
ses
->
trackv
,
ses
->
trackc
,
i
);
}
}
RtspClientAlive
(
ses
);
}
}
vlc_mutex_unlock
(
&
rtsp
->
lock
);
...
...
@@ -980,7 +1064,13 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
}
if
(
psz_session
)
httpd_MsgAdd
(
answer
,
"Session"
,
"%s"
/*;timeout=5*/
,
psz_session
);
{
if
(
rtsp
->
timeout
>
0
)
httpd_MsgAdd
(
answer
,
"Session"
,
"%s;timeout=%d"
,
psz_session
,
rtsp
->
timeout
);
else
httpd_MsgAdd
(
answer
,
"Session"
,
"%s"
,
psz_session
);
}
httpd_MsgAdd
(
answer
,
"Content-Length"
,
"%d"
,
answer
->
i_body
);
httpd_MsgAdd
(
answer
,
"Cache-Control"
,
"no-cache"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment