diff -uNr vlc-0.8.6c/modules/demux/live555.cpp vlc-0.8.6c-patched/modules/demux/live555.cpp --- vlc-0.8.6c/modules/demux/live555.cpp 2007-06-16 15:25:08.000000000 +0100 +++ vlc-0.8.6c-patched/modules/demux/live555.cpp 2007-09-13 10:43:08.000000000 +0100 @@ -153,6 +153,7 @@ VLC_COMMON_MEMBERS int64_t i_remain; + vlc_bool_t b_handle_keep_alive; demux_sys_t *p_sys; }; @@ -1163,6 +1164,19 @@ 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; #if 0 /* reset PCR and PCR start, mmh won't work well for multi-stream I fear */ for( i = 0; i < p_sys->i_track; i++ ) @@ -1510,10 +1524,21 @@ { 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 */