[vlc-devel] [PATCH] Handle GET_PARAMETER keepalive responses during PAUSE
Rémi Denis-Courmont
remi at remlab.net
Wed Jun 24 19:30:07 CEST 2015
Le mercredi 24 juin 2015, 18:18:03 Paul Clark a écrit :
> Fixes ticket#14939
>
> Because Demux() is not called during PAUSE the GET_PARAMETER keepalives are
> sent by the TimeoutPrevention thread. However this was not giving Live555
> a chance to handle the responses through doEventLoop(), and so the responses
> were queued up. Because of a separate issue in handling pipelined
> GET_PARAMETER responses in Live555 itself (now fixed, 2015-06-24), after
> two GPs this would result in the loss of the PLAY response on resume,
> locking everything up.
>
> Even with the fix to Live555, queuing up all GP responses until the stream
> is resumed is unpleasant and will eventually overflow Live555's response
> buffer.
>
> This fix calls the usual Live555 response handling mechanism for GPs sent
> in the background thread during pause. I have not added it to the normal
> GP sends in Demux() because that calls doEventLoop() anyway, and to do so
> would add a delay to normal processing.
>
> TimeoutPrevention now requires access to p_demux itself, not just p_sys.
> ---
> modules/access/live555.cpp | 20 +++++++++++++++-----
> 1 file changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/modules/access/live555.cpp b/modules/access/live555.cpp
> index fef590a..517ce58 100644
> --- a/modules/access/live555.cpp
> +++ b/modules/access/live555.cpp
> @@ -172,7 +172,7 @@ typedef struct
>
> struct timeout_thread_t
> {
> - demux_sys_t *p_sys;
> + demux_t *p_demux;
> vlc_thread_t handle;
> bool b_handle_keep_alive;
> };
> @@ -1235,7 +1235,7 @@ static int Play( demux_t *p_demux )
> if( p_sys->p_timeout )
> {
> memset( p_sys->p_timeout, 0, sizeof(timeout_thread_t) );
> - p_sys->p_timeout->p_sys = p_demux->p_sys; /* lol,
> object recursion :D */
> + p_sys->p_timeout->p_demux = p_demux;
> if( vlc_clone( &p_sys->p_timeout->handle,
> TimeoutPrevention,
> p_sys->p_timeout,
> VLC_THREAD_PRIORITY_LOW ) )
> {
> @@ -2108,6 +2108,8 @@ VLC_NORETURN
> static void* TimeoutPrevention( void *p_data )
> {
> timeout_thread_t *p_timeout = (timeout_thread_t *)p_data;
> + demux_t *p_demux = p_timeout->p_demux;
> + demux_sys_t *p_sys = p_demux->p_sys;
>
> for( ;; )
> {
> @@ -2117,12 +2119,20 @@ static void* TimeoutPrevention( void *p_data )
> char *psz_bye = NULL;
> int canc = vlc_savecancel ();
>
> - p_timeout->p_sys->rtsp->sendGetParameterCommand(
> *p_timeout->p_sys->ms, NULL, psz_bye );
> + p_sys->rtsp->sendGetParameterCommand( *p_sys->ms,
> default_live555_callback, psz_bye );
> +
> + if( !wait_Live555_response( p_demux ) )
Are you sure this function is re-entrant? Seems like nothing good will happen
if the timeout thread and the input thread end up waiting at the same time.
> + {
> + msg_Err( p_demux, "GET_PARAMETER keepalive failed: %s",
> + p_sys->env->getResultMsg() );
> + /* Just continue, worst case is we get timed out later */
> + }
> +
> vlc_restorecancel (canc);
> }
> - p_timeout->p_sys->b_timeout_call = !p_timeout->b_handle_keep_alive;
> + p_sys->b_timeout_call = !p_timeout->b_handle_keep_alive;
>
> - msleep (((int64_t)p_timeout->p_sys->i_timeout - 2) * CLOCK_FREQ);
> + msleep (((int64_t)p_sys->i_timeout - 2) * CLOCK_FREQ);
> }
> vlc_assert_unreachable(); /* dead code */
> }
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list