[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