Commit 6a440b73 authored by Jean-Paul Saman's avatar Jean-Paul Saman

Patch by Glen Gray: RTSP keep alive fix. If the server doesn't handle RTCP-RR...

Patch by Glen Gray: RTSP keep alive fix. If the server doesn't handle RTCP-RR packets and requires specific GET_PARAMETER commands (such as Kasenna) then the session times out when vlc is paused because the current version only sends the info when Demux() is called. Demux() is only called when data is received. This patch fixes this issue with a boolean that is set during PAUSED state that allows the timer thread to send the GET_PARAMTER messages instead and thus keeping the RTSP session alive.
parent ab76f23e
...@@ -146,6 +146,7 @@ struct timeout_thread_t ...@@ -146,6 +146,7 @@ struct timeout_thread_t
VLC_COMMON_MEMBERS VLC_COMMON_MEMBERS
int64_t i_remain; int64_t i_remain;
vlc_bool_t b_handle_keep_alive;
demux_sys_t *p_sys; demux_sys_t *p_sys;
}; };
...@@ -1249,6 +1250,20 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -1249,6 +1250,20 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
msg_Err( p_demux, "PLAY or PAUSE failed %s", p_sys->env->getResultMsg() ); msg_Err( p_demux, "PLAY or PAUSE failed %s", p_sys->env->getResultMsg() );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* When we Pause, we'll need the TimeoutPrevention thread to
* handle sending the "Keep Alive" message to the server.
* Unfortunately Live555 isn't thread safe and so can't
* do this normally while the main Demux thread is handling
* a live stream. We end up with the Timeout thread blocking
* waiting for a response from the server. So when we PAUSE
* we set a flag that the TimeoutPrevention function will check
* and if it's set, it will trigger the GET_PARAMETER message */
if( b_bool && p_sys->p_timeout != NULL )
p_sys->p_timeout->b_handle_keep_alive = VLC_TRUE;
else if( !b_bool && p_sys->p_timeout != NULL )
p_sys->p_timeout->b_handle_keep_alive = VLC_FALSE;
es_out_Control( p_demux->out, ES_OUT_RESET_PCR ); es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
p_sys->i_pcr = 0; p_sys->i_pcr = 0;
#if (LIVEMEDIA_LIBRARY_VERSION_INT >= 1195257600) #if (LIVEMEDIA_LIBRARY_VERSION_INT >= 1195257600)
...@@ -1616,10 +1631,21 @@ static void TimeoutPrevention( timeout_thread_t *p_timeout ) ...@@ -1616,10 +1631,21 @@ static void TimeoutPrevention( timeout_thread_t *p_timeout )
{ {
if( p_timeout->i_remain <= 0 ) if( p_timeout->i_remain <= 0 )
{ {
char *psz_bye = NULL;
p_timeout->i_remain = (int64_t)p_timeout->p_sys->i_timeout -2; p_timeout->i_remain = (int64_t)p_timeout->p_sys->i_timeout -2;
p_timeout->i_remain *= 1000000; p_timeout->i_remain *= 1000000;
p_timeout->p_sys->b_timeout_call = VLC_TRUE;
msg_Dbg( p_timeout, "reset the timeout timer" ); msg_Dbg( p_timeout, "reset the timeout timer" );
if( p_timeout->b_handle_keep_alive == VLC_TRUE )
{
#if LIVEMEDIA_LIBRARY_VERSION_INT >= 1138089600
p_timeout->p_sys->rtsp->getMediaSessionParameter( *p_timeout->p_sys->ms, NULL, psz_bye );
#endif
p_timeout->p_sys->b_timeout_call = VLC_FALSE;
}
else
{
p_timeout->p_sys->b_timeout_call = VLC_TRUE;
}
} }
p_timeout->i_remain -= 200000; p_timeout->i_remain -= 200000;
msleep( 200000 ); /* 200 ms */ msleep( 200000 ); /* 200 ms */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment