Commit 442b1df3 authored by Steinar H. Gunderson's avatar Steinar H. Gunderson Committed by 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: default avatarRémi Denis-Courmont <remi@remlab.net>
parent ddb88bf1
...@@ -34,6 +34,9 @@ ...@@ -34,6 +34,9 @@
#include <time.h> #include <time.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_plugin.h> #include <vlc_plugin.h>
...@@ -243,6 +246,17 @@ static int Control( sout_access_out_t *p_access, int i_query, va_list args ) ...@@ -243,6 +246,17 @@ static int Control( sout_access_out_t *p_access, int i_query, va_list args )
break; 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: default:
return VLC_EGENERIC; return VLC_EGENERIC;
} }
......
...@@ -118,9 +118,12 @@ int OpenMux( vlc_object_t *p_this ) ...@@ -118,9 +118,12 @@ int OpenMux( vlc_object_t *p_this )
p_sys->io_buffer_size = 32768; /* FIXME */ p_sys->io_buffer_size = 32768; /* FIXME */
p_sys->io_buffer = malloc( p_sys->io_buffer_size ); 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 = avio_alloc_context(
p_sys->io_buffer, p_sys->io_buffer_size, 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->pb = p_sys->io;
p_sys->oc->nb_streams = 0; p_sys->oc->nb_streams = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment