From: Jean-Paul Saman Date: Wed, 21 Nov 2007 22:28:20 +0000 (+0000) Subject: Patch by Glen Gray: RTSP keep alive fix. If the server doesn't handle RTCP-RR packets... X-Git-Tag: 0.9.0-test0~4452 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=6a440b7379fe87ed67f175893e2e7763d62e7ef6;p=vlc 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. --- diff --git a/modules/demux/live555.cpp b/modules/demux/live555.cpp index bae120c4bc..3fed8f0d72 100644 --- a/modules/demux/live555.cpp +++ b/modules/demux/live555.cpp @@ -146,6 +146,7 @@ struct timeout_thread_t VLC_COMMON_MEMBERS int64_t i_remain; + vlc_bool_t b_handle_keep_alive; demux_sys_t *p_sys; }; @@ -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() ); 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 ); p_sys->i_pcr = 0; #if (LIVEMEDIA_LIBRARY_VERSION_INT >= 1195257600) @@ -1616,10 +1631,21 @@ static void TimeoutPrevention( timeout_thread_t *p_timeout ) { 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 *= 1000000; - p_timeout->p_sys->b_timeout_call = VLC_TRUE; 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; msleep( 200000 ); /* 200 ms */