X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fdemuxdump.c;h=5c12244eaa914d37363ed9c0285f62b34ea3ce8c;hb=f9c5295c1d898200542ac0d2c2eb4c73cacf6424;hp=5f2a5f01b14711d9a0a965453a04a32e53529527;hpb=f66626b34809a4881a52582ae755586e885270c6;p=vlc diff --git a/modules/demux/demuxdump.c b/modules/demux/demuxdump.c index 5f2a5f01b1..5c12244eaa 100644 --- a/modules/demux/demuxdump.c +++ b/modules/demux/demuxdump.c @@ -1,44 +1,35 @@ /***************************************************************************** * demuxdump.c : Pseudo demux module for vlc (dump raw stream) ***************************************************************************** - * Copyright (C) 2001-2004 the VideoLAN team - * $Id$ + * Copyright (C) 2001-2004 VLC authors and VideoLAN * * Authors: Laurent Aimar * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -/***************************************************************************** - * Preamble + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include - #include #include #include -#include +#include -/***************************************************************************** - * Module descriptor - *****************************************************************************/ +#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." ) @@ -49,154 +40,112 @@ static int Open( vlc_object_t * ); static void Close ( vlc_object_t * ); -vlc_module_begin(); - set_shortname("Dump"); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_DEMUX ); - set_description( N_("File dumper") ); - set_capability( "demux", 0 ); - add_file( "demuxdump-file", "stream-demux.dump", NULL, FILE_TEXT, - FILE_LONGTEXT, false ); - change_unsafe(); - add_bool( "demuxdump-append", 0, NULL, APPEND_TEXT, APPEND_LONGTEXT, - false ); - set_callbacks( Open, Close ); - add_shortcut( "dump" ); -vlc_module_end(); +vlc_module_begin () + set_shortname("Dump") + set_category( CAT_INPUT ) + 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, + false ) + set_callbacks( Open, Close ) + add_shortcut( "dump" ) +vlc_module_end () +#define DUMP_BLOCKSIZE 16384 -/***************************************************************************** - * Local prototypes - *****************************************************************************/ static int Demux( demux_t * ); static int Control( demux_t *, int,va_list ); -#define DUMP_BLOCKSIZE 16384 - -struct demux_sys_t -{ - char *psz_file; - FILE *p_file; - uint64_t i_write; - - uint8_t buffer[DUMP_BLOCKSIZE]; -}; - -/* - * Data reading functions +/** + * Initializes the raw dump pseudo-demuxer. */ - -/***************************************************************************** - * Open: initializes dump structures - *****************************************************************************/ static int Open( vlc_object_t * p_this ) { - demux_t *p_demux = (demux_t*)p_this; - demux_sys_t *p_sys; - const char *psz_mode; - vlc_value_t val; - bool b_append; + demux_t *p_demux = (demux_t*)p_this; /* Accept only if forced */ if( !p_demux->b_force ) return VLC_EGENERIC; - var_Create( p_demux, "demuxdump-append", VLC_VAR_BOOL|VLC_VAR_DOINHERIT ); - var_Get( p_demux, "demuxdump-append", &val ); - b_append = val.b_bool; - if ( b_append ) - psz_mode = "ab"; - else - psz_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" ) ) + var_SetBool( p_demux, "sout-file-append", true ); + /* --sout-file-format (always false) */ + var_Create( p_demux, "sout-file-format", VLC_VAR_BOOL ); - p_demux->pf_demux = Demux; - p_demux->pf_control = Control; - p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); - p_sys->i_write = 0; - p_sys->p_file = NULL; - p_sys->psz_file = var_CreateGetString( p_demux, "demuxdump-file" ); - if( *p_sys->psz_file == '\0' ) + char *path = var_InheritString( p_demux, "demuxdump-file" ); + if( path == NULL ) { - msg_Warn( p_demux, "no dump file name given" ); + free( access ); + msg_Err( p_demux, "no dump file name given" ); return VLC_EGENERIC; } - if( !strcmp( p_sys->psz_file, "-" ) ) + sout_access_out_t *out = sout_AccessOutNew( p_demux, access, path ); + free( path ); + free( access ); + if( out == NULL ) { - msg_Info( p_demux, "dumping raw stream to standard output" ); - p_sys->p_file = stdout; - } - else if( ( p_sys->p_file = utf8_fopen( p_sys->psz_file, psz_mode ) ) == NULL ) - { - msg_Err( p_demux, "cannot create `%s' for writing", p_sys->psz_file ); - - free( p_sys ); + msg_Err( p_demux, "cannot create output" ); return VLC_EGENERIC; } - msg_Info( p_demux, "%s raw stream to file `%s'", - b_append ? "appending" : "dumping", p_sys->psz_file ); + p_demux->p_sys = (void *)out; + p_demux->pf_demux = Demux; + p_demux->pf_control = Control; return VLC_SUCCESS; } -/***************************************************************************** - * Close: - *****************************************************************************/ +/** + * Destroys the pseudo-demuxer. + */ static void Close( vlc_object_t *p_this ) { + demux_t *p_demux = (demux_t*)p_this; + sout_access_out_t *out = (void *)p_demux->p_sys; - demux_t *p_demux = (demux_t*)p_this; - demux_sys_t *p_sys = p_demux->p_sys; - - msg_Info( p_demux ,"closing %s (%"PRId64" Kbytes dumped)", p_sys->psz_file, - p_sys->i_write / 1024 ); - - if( p_sys->p_file != stdout ) - { - fclose( p_sys->p_file ); - } - free( p_sys->psz_file ); - - free( p_sys ); + sout_AccessOutDelete( out ); } -/***************************************************************************** - * Demux: reads and demuxes data packets - ***************************************************************************** - * Returns -1 in case of error, 0 in case of EOF, 1 otherwise - *****************************************************************************/ +/** + * Copy data from input stream to dump file. + */ static int Demux( demux_t *p_demux ) { - demux_sys_t *p_sys = p_demux->p_sys; - - int i_data; + sout_access_out_t *out = (void *)p_demux->p_sys; - /* I'm pretty sure that stream_Peek,stream_Read( , NULL ) would be faster*/ - i_data = stream_Read( p_demux->s, p_sys->buffer, DUMP_BLOCKSIZE ); - if ( i_data <= 0 ) - return i_data; + block_t *block = block_Alloc( DUMP_BLOCKSIZE ); + if( unlikely(block == NULL) ) + return -1; - i_data = fwrite( p_sys->buffer, 1, i_data, p_sys->p_file ); + int rd = stream_Read( p_demux->s, block->p_buffer, DUMP_BLOCKSIZE ); + if ( rd <= 0 ) + { + block_Release( block ); + return rd; + } + block->i_buffer = rd; - if( i_data == 0 ) + size_t wr = sout_AccessOutWrite( out, block ); + if( wr != (size_t)rd ) { - msg_Err( p_demux, "failed to write data" ); + msg_Err( p_demux, "cannot write data" ); return -1; } -#if 0 - msg_Dbg( p_demux, "dumped %d bytes", i_data ); -#endif - - p_sys->i_write += i_data; - return 1; } -/***************************************************************************** - * Demux: reads and demuxes data packets - *****************************************************************************/ static int Control( demux_t *p_demux, int i_query, va_list args ) { return demux_vaControlHelper( p_demux->s, 0, -1, 0, 1, i_query, args ); } -