vlc | branch: master | Steinar H. Gunderson <[email protected]> | Fri Aug 16 16:42:11 2013 +0200| [442b1df3e5cac1e54a2c1353896faa61b9765c32] | committer: Rémi Denis-Courmont
avformat mux: Propagate seekable status into avformat. 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. Signed-off-by: Rémi Denis-Courmont <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=442b1df3e5cac1e54a2c1353896faa61b9765c32 --- 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> #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 ); p_sys->oc->pb = p_sys->io; p_sys->oc->nb_streams = 0; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
