[vlc-commits] dump: output to access output rather than file (fixes #1873)
Rémi Denis-Courmont
git at videolan.org
Thu Nov 29 16:45:44 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Nov 29 17:42:36 2012 +0200| [cd56c2fb49cdc2cae08e1b5842577250a4067b88] | committer: Rémi Denis-Courmont
dump: output to access output rather than file (fixes #1873)
The default output plugin is file for obvious backward compatibility
reasons. Note that using anything but the file output really only makes
sense for MPEG-TS streams.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cd56c2fb49cdc2cae08e1b5842577250a4067b88
---
modules/demux/demuxdump.c | 66 ++++++++++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 28 deletions(-)
diff --git a/modules/demux/demuxdump.c b/modules/demux/demuxdump.c
index 960fe36..5c12244 100644
--- a/modules/demux/demuxdump.c
+++ b/modules/demux/demuxdump.c
@@ -27,8 +27,9 @@
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_demux.h>
-#include <vlc_fs.h>
+#include <vlc_sout.h>
+#define ACCESS_TEXT N_("Dump module")
#define FILE_TEXT N_("Dump filename")
#define FILE_LONGTEXT N_( \
"Name of the file to which the raw stream will be dumped." )
@@ -45,6 +46,8 @@ vlc_module_begin ()
set_subcategory( SUBCAT_INPUT_DEMUX )
set_description( N_("File dumper") )
set_capability( "demux", 0 )
+ add_module( "demuxdump-access", "sout access", "file", ACCESS_TEXT,
+ ACCESS_TEXT, true )
add_savefile( "demuxdump-file", "stream-demux.dump", FILE_TEXT,
FILE_LONGTEXT, false )
add_bool( "demuxdump-append", false, APPEND_TEXT, APPEND_LONGTEXT,
@@ -69,34 +72,35 @@ static int Open( vlc_object_t * p_this )
if( !p_demux->b_force )
return VLC_EGENERIC;
- const char *mode = "wb";
+ char *access = var_InheritString( p_demux, "demuxdump-access" );
+ if( access == NULL )
+ return VLC_EGENERIC;
+
+ /* --sout-file-append (defaults to false) */
+ var_Create( p_demux, "sout-file-append", VLC_VAR_BOOL );
if( var_InheritBool( p_demux, "demuxdump-append" ) )
- mode = "ab";
+ var_SetBool( p_demux, "sout-file-append", true );
+ /* --sout-file-format (always false) */
+ var_Create( p_demux, "sout-file-format", VLC_VAR_BOOL );
char *path = var_InheritString( p_demux, "demuxdump-file" );
if( path == NULL )
- return VLC_ENOMEM;
-
- FILE *stream;
- if( !strcmp( path, "-" ) )
{
- msg_Info( p_demux, "dumping raw stream to standard output" );
- stream = stdout;
+ free( access );
+ msg_Err( p_demux, "no dump file name given" );
+ return VLC_EGENERIC;
}
- else
+
+ sout_access_out_t *out = sout_AccessOutNew( p_demux, access, path );
+ free( path );
+ free( access );
+ if( out == NULL )
{
- stream = vlc_fopen( path, mode );
- if( stream == NULL )
- msg_Err( p_demux, "cannot write `%s': %m", path );
- else
- msg_Info( p_demux, "writing raw stream to file `%s'", path );
- free( path );
-
- if( stream == NULL )
- return VLC_EGENERIC;
+ msg_Err( p_demux, "cannot create output" );
+ return VLC_EGENERIC;
}
- p_demux->p_sys = (void *)stream;
+ p_demux->p_sys = (void *)out;
p_demux->pf_demux = Demux;
p_demux->pf_control = Control;
return VLC_SUCCESS;
@@ -108,10 +112,9 @@ static int Open( vlc_object_t * p_this )
static void Close( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t*)p_this;
- FILE *stream = (void *)p_demux->p_sys;
+ sout_access_out_t *out = (void *)p_demux->p_sys;
- if( stream != stdout )
- fclose( stream );
+ sout_AccessOutDelete( out );
}
/**
@@ -119,17 +122,24 @@ static void Close( vlc_object_t *p_this )
*/
static int Demux( demux_t *p_demux )
{
- FILE *stream = (void *)p_demux->p_sys;
- char buf[DUMP_BLOCKSIZE];
+ sout_access_out_t *out = (void *)p_demux->p_sys;
+
+ block_t *block = block_Alloc( DUMP_BLOCKSIZE );
+ if( unlikely(block == NULL) )
+ return -1;
- int rd = stream_Read( p_demux->s, buf, sizeof (buf) );
+ int rd = stream_Read( p_demux->s, block->p_buffer, DUMP_BLOCKSIZE );
if ( rd <= 0 )
+ {
+ block_Release( block );
return rd;
+ }
+ block->i_buffer = rd;
- size_t wr = fwrite( buf, 1, rd, stream );
+ size_t wr = sout_AccessOutWrite( out, block );
if( wr != (size_t)rd )
{
- msg_Err( p_demux, "cannot write data: %m" );
+ msg_Err( p_demux, "cannot write data" );
return -1;
}
return 1;
More information about the vlc-commits
mailing list