[vlc-devel] [PATCH 1/4] avformat mux: Propagate seekable status into avformat.

Rémi Denis-Courmont remi at remlab.net
Sun Aug 25 11:41:04 CEST 2013


Le vendredi 16 août 2013 16:42:11 Steinar H. Gunderson a écrit :
> Some muxes, in particular mkv/webm, behave very differently depending on
> whether we say that the stream is seekable or not (by providing the IOSeek
> function). It does not help that the seek function itself returns an error.
> 
> Thus, add a new access_out control called ACCESS_OUT_CAN_SEEK, set to true
> for seekable files in the file output only, and propagate the status of that
> into avformat at initialization time.
> ---
>  modules/access_output/file.c |   14 ++++++++++++++
>  modules/demux/avformat/mux.c |    5 ++++-
>  2 files changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/modules/access_output/file.c b/modules/access_output/file.c
> index 8bc2b6f..61192c2 100644
> --- a/modules/access_output/file.c
> +++ b/modules/access_output/file.c
> @@ -34,6 +34,9 @@
>  #include <time.h>
>  #include <fcntl.h>
>  #include <errno.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>

Not that I really care but is this available on all platforms? (OS/2?)

> 
>  #include <vlc_common.h>
>  #include <vlc_plugin.h>
> @@ -243,6 +246,17 @@ static int Control( sout_access_out_t *p_access, int
> i_query, va_list args ) break;
>          }
> 
> +        case ACCESS_OUT_CAN_SEEK:
> +        {
> +            bool *pb = va_arg( args, bool * );
> +            struct stat st;
> +            if( fstat( (intptr_t)p_access->p_sys, &st ) == -1 )
> +                *pb = false;
> +            else
> +                *pb = S_ISREG( st.st_mode ) || S_ISBLK( st.st_mode );
> +            break;
> +        }
> +
>          default:
>              return VLC_EGENERIC;
>      }
> diff --git a/modules/demux/avformat/mux.c b/modules/demux/avformat/mux.c
> index 97f5fb3..990489c 100644
> --- a/modules/demux/avformat/mux.c
> +++ b/modules/demux/avformat/mux.c
> @@ -118,9 +118,12 @@ int OpenMux( vlc_object_t *p_this )
>      p_sys->io_buffer_size = 32768;  /* FIXME */
>      p_sys->io_buffer = malloc( p_sys->io_buffer_size );
> 
> +    bool b_can_seek;
> +    if( sout_AccessOutControl( p_mux->p_access, ACCESS_OUT_CAN_SEEK,
> &b_can_seek ) )
> +        b_can_seek = false;
>      p_sys->io = avio_alloc_context(
>          p_sys->io_buffer, p_sys->io_buffer_size,
> -        1, p_mux, NULL, IOWrite, IOSeek );
> +        1, p_mux, NULL, IOWrite, b_can_seek ? IOSeek : NULL );

This is an undefined conditional if the access output is not "file".

You should probably wrap ACCESS_OUT_CAN_SEEK into an inline helper.

>      p_sys->oc->pb = p_sys->io;
>      p_sys->oc->nb_streams = 0;
-- 
Rémi Denis-Courmont
http://www.remlab.net/




More information about the vlc-devel mailing list