[vlc-devel] [PATCH] udp: add timeout parameter

Rémi Denis-Courmont remi at remlab.net
Tue Mar 15 18:18:16 CET 2016


Le 2016-03-15 18:16, Ilkka Ollakka a écrit :
> By default we wait -1 as previously, but you can give --udp-timeout
> as timeout in seconds
> how long we wait for next packet before deciding that input has 
> ended.
> ---
>  modules/access/udp.c | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/modules/access/udp.c b/modules/access/udp.c
> index b243fce..84f7918 100644
> --- a/modules/access/udp.c
> +++ b/modules/access/udp.c
> @@ -43,6 +43,9 @@
>  #include <vlc_network.h>
>  #include <vlc_block.h>
>  #include <vlc_interrupt.h>
> +#ifdef HAVE_POLL
> +# include <poll.h>
> +#endif
>  #include <fcntl.h>
>
>
> 
> /*****************************************************************************
> @@ -53,6 +56,7 @@ static void Close( vlc_object_t * );
>
>  #define BUFFER_TEXT N_("Receive buffer")
>  #define BUFFER_LONGTEXT N_("UDP receive buffer size (bytes)" )
> +#define TIMEOUT_TEXT N_("UDP Source timeout (sec)")
>
>  vlc_module_begin ()
>      set_shortname( N_("UDP" ) )
> @@ -62,6 +66,9 @@ vlc_module_begin ()
>
>      add_obsolete_integer( "server-port" ) /* since 2.0.0 */
>      add_integer( "udp-buffer", 0x400000, BUFFER_TEXT,
> BUFFER_LONGTEXT, true )
> +#ifdef HAVE_POLL
> +    add_integer( "udp-timeout", -1, TIMEOUT_TEXT, NULL, true )
> +#endif
>
>      set_capability( "access", 0 )
>      add_shortcut( "udp", "udpstream", "udp4", "udp6" )
> @@ -72,6 +79,7 @@ vlc_module_end ()
>  struct access_sys_t
>  {
>      int fd;
> +    int timeout;
>      size_t mtu;
>      size_t fifo_size;
>      block_fifo_t *fifo;
> @@ -181,6 +189,12 @@ static int Open( vlc_object_t *p_this )
>      sys->fifo_size = var_InheritInteger( p_access, "udp-buffer");
>      vlc_sem_init( &sys->semaphore, 0 );
>
> +#ifdef HAVE_POLL

Why?

> +    sys->timeout = var_InheritInteger( p_access, "udp-timeout");
> +    if( sys->timeout > 0)
> +        sys->timeout *= 1000;
> +#endif
> +
>      if( vlc_clone( &sys->thread, ThreadRead, p_access,
>                     VLC_THREAD_PRIORITY_INPUT ) )
>      {
> @@ -291,9 +305,20 @@ static void* ThreadRead( void *data )
>          block_cleanup_push(pkt);
>          do
>          {
> -#ifndef LIBVLC_USE_PTHREAD
> -            struct pollfd ufd = { .fd = sys->fd, .events = POLLIN };
> -            while (poll(&ufd, 1, -1) <= 0); /* cancellation point */
> +#ifdef HAVE_POLL
> +            int poll_return=0;
> +            struct pollfd ufd[1];
> +            ufd[0].fd = sys->fd;
> +            ufd[0].events = POLLIN;
> +
> +            while ((poll_return = poll(ufd, 1, sys->timeout)) < 0);
> /* cancellation point */
> +            if (unlikely( poll_return == 0))
> +            {
> +                msg_Err( access, "Timeout on receiving, timeout %d
> seconds", sys->timeout/1000 );
> +                access->info.b_eof=1;

I think accessing b_eof here is UB.

> +                len = 0;
> +                break;
> +            }
>  #endif
>              len = recvmsg(sys->fd, &msg, 0);
>          }

-- 
Rémi Denis-Courmont
http://www.remlab.net/


More information about the vlc-devel mailing list