7df04deb2fdec08b21a973f38e2ede43e920c2a9
[vlc.git] / modules / codec / ddummy.c
1 /*****************************************************************************
2  * ddummy.c: dummy decoder plugin for vlc.
3  *****************************************************************************
4  * Copyright (C) 2002 VLC authors and VideoLAN
5  *
6  * Authors: Samuel Hocevar <sam@zoy.org>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22
23 /*****************************************************************************
24  * Preamble
25  *****************************************************************************/
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <vlc_common.h>
31 #include <vlc_plugin.h>
32 #include <vlc_codec.h>
33 #include <vlc_fs.h>
34
35 #define SAVE_TEXT N_("Save raw codec data")
36 #define SAVE_LONGTEXT N_( \
37     "Save the raw codec data if you have selected/forced the dummy " \
38     "decoder in the main options." )
39
40 static int OpenDecoder( vlc_object_t * );
41 static int OpenDecoderDump( vlc_object_t * );
42 static void CloseDecoder( vlc_object_t * );
43
44 vlc_module_begin ()
45     set_shortname( N_("Dummy") )
46     set_description( N_("Dummy decoder") )
47     set_capability( "spu decoder", 0 )
48     set_callbacks( OpenDecoder, CloseDecoder )
49     set_category( CAT_INPUT )
50     set_subcategory( SUBCAT_INPUT_SCODEC )
51     add_bool( "dummy-save-es", false, SAVE_TEXT, SAVE_LONGTEXT, true )
52     add_shortcut( "dummy" )
53     add_submodule()
54     add_shortcut( "dummy" )
55     set_capability( "video decoder", 0 )
56     set_callbacks( OpenDecoder, CloseDecoder )
57     add_submodule()
58     add_shortcut( "dummy" )
59     set_capability( "audio decoder", 0 )
60     set_callbacks( OpenDecoder, CloseDecoder )
61
62     add_submodule ()
63     set_section( N_( "Dump decoder" ), NULL )
64     set_description( N_("Dump decoder") )
65     set_capability( "spu decoder", -1 )
66     set_callbacks( OpenDecoderDump, CloseDecoder )
67     add_shortcut( "dump" )
68     add_submodule()
69     add_shortcut( "dump")
70     set_capability( "video decoder", 0 )
71     set_callbacks( OpenDecoderDump, CloseDecoder )
72     add_submodule()
73     add_shortcut( "dump")
74     set_capability( "audio decoder", 0 )
75     set_callbacks( OpenDecoderDump, CloseDecoder )
76 vlc_module_end ()
77
78
79 /*****************************************************************************
80  * Local prototypes
81  *****************************************************************************/
82 static int DecodeBlock( decoder_t *p_dec, block_t *p_block );
83
84 /*****************************************************************************
85  * OpenDecoder: Open the decoder
86  *****************************************************************************/
87 static int OpenDecoderCommon( vlc_object_t *p_this, bool b_force_dump )
88 {
89     decoder_t *p_dec = (decoder_t*)p_this;
90     char psz_file[10 + 3 * sizeof (p_dec)];
91
92     snprintf( psz_file, sizeof( psz_file), "stream.%p", (void *)p_dec );
93
94     if( !b_force_dump )
95         b_force_dump = var_InheritBool( p_dec, "dummy-save-es" );
96     if( b_force_dump )
97     {
98         FILE *stream = vlc_fopen( psz_file, "wb" );
99         if( stream == NULL )
100         {
101             msg_Err( p_dec, "cannot create `%s'", psz_file );
102             return VLC_EGENERIC;
103         }
104         msg_Dbg( p_dec, "dumping stream to file `%s'", psz_file );
105         p_dec->p_sys = (void *)stream;
106     }
107     else
108         p_dec->p_sys = NULL;
109
110     /* Set callbacks */
111     p_dec->pf_decode = DecodeBlock;
112
113     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
114
115     return VLC_SUCCESS;
116 }
117
118 static int OpenDecoder( vlc_object_t *p_this )
119 {
120     return OpenDecoderCommon( p_this, false );
121 }
122
123 static int  OpenDecoderDump( vlc_object_t *p_this )
124 {
125     return OpenDecoderCommon( p_this, true );
126 }
127
128 /****************************************************************************
129  * RunDecoder: the whole thing
130  ****************************************************************************
131  * This function must be fed with ogg packets.
132  ****************************************************************************/
133 static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
134 {
135     FILE *stream = (void *)p_dec->p_sys;
136
137     if( !p_block ) return VLCDEC_SUCCESS;
138
139     if( stream != NULL
140      && p_block->i_buffer > 0
141      && !(p_block->i_flags & (BLOCK_FLAG_CORRUPTED)) )
142     {
143         fwrite( p_block->p_buffer, 1, p_block->i_buffer, stream );
144         msg_Dbg( p_dec, "dumped %zu bytes", p_block->i_buffer );
145     }
146     block_Release( p_block );
147
148     return VLCDEC_SUCCESS;
149 }
150
151 /*****************************************************************************
152  * CloseDecoder: decoder destruction
153  *****************************************************************************/
154 static void CloseDecoder( vlc_object_t *p_this )
155 {
156     decoder_t *p_dec = (decoder_t *)p_this;
157     FILE *stream = (void *)p_dec->p_sys;
158
159     if( stream != NULL )
160         fclose( stream );
161 }