[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