Use the right declaration for threaded functions.
[vlc.git] / modules / mux / dummy.c
1 /*****************************************************************************
2  * dummy.c: dummy muxer module for vlc
3  *****************************************************************************
4  * Copyright (C) 2001, 2002 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Eric Petit <titer@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28
29 #ifdef HAVE_CONFIG_H
30 # include "config.h"
31 #endif
32
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_sout.h>
36 #include <vlc_block.h>
37
38 /*****************************************************************************
39  * Module descriptor
40  *****************************************************************************/
41 static int  Open   ( vlc_object_t * );
42 static void Close  ( vlc_object_t * );
43
44 vlc_module_begin();
45     set_description( N_("Dummy/Raw muxer") );
46     set_capability( "sout mux", 5 );
47     set_category( CAT_SOUT );
48     set_subcategory( SUBCAT_SOUT_MUX );
49     add_shortcut( "dummy" );
50     add_shortcut( "raw" );
51     add_shortcut( "es" );
52     set_callbacks( Open, Close );
53 vlc_module_end();
54
55 /*****************************************************************************
56  * Exported prototypes
57  *****************************************************************************/
58 static int Control( sout_mux_t *, int, va_list );
59 static int AddStream( sout_mux_t *, sout_input_t * );
60 static int DelStream( sout_mux_t *, sout_input_t * );
61 static int Mux      ( sout_mux_t * );
62
63 struct sout_mux_sys_t
64 {
65     /* Some streams have special initialization data, we'll output this
66      * data as an header in the stream. */
67     bool b_header;
68 };
69
70 /*****************************************************************************
71  * Open:
72  *****************************************************************************/
73 static int Open( vlc_object_t *p_this )
74 {
75     sout_mux_t *p_mux = (sout_mux_t*)p_this;
76     sout_mux_sys_t  *p_sys;
77
78     msg_Dbg( p_mux, "Dummy/Raw muxer opened" );
79     msg_Info( p_mux, "Open" );
80
81     p_mux->pf_control   = Control;
82     p_mux->pf_addstream = AddStream;
83     p_mux->pf_delstream = DelStream;
84     p_mux->pf_mux       = Mux;
85
86     p_mux->p_sys = p_sys = malloc( sizeof( sout_mux_sys_t ) );
87     p_sys->b_header      = true;
88
89     return VLC_SUCCESS;
90 }
91
92 /*****************************************************************************
93  * Close:
94  *****************************************************************************/
95
96 static void Close( vlc_object_t * p_this )
97 {
98     sout_mux_t *p_mux = (sout_mux_t*)p_this;
99     sout_mux_sys_t *p_sys = p_mux->p_sys;
100
101     msg_Dbg( p_mux, "Dummy/Raw muxer closed" );
102     free( p_sys );
103 }
104
105 static int Control( sout_mux_t *p_mux, int i_query, va_list args )
106 {
107     VLC_UNUSED(p_mux);
108     bool *pb_bool;
109
110     switch( i_query )
111     {
112         case MUX_CAN_ADD_STREAM_WHILE_MUXING:
113             pb_bool = (bool*)va_arg( args, bool * );
114             *pb_bool = true;
115             return VLC_SUCCESS;
116
117         case MUX_GET_ADD_STREAM_WAIT:
118             pb_bool = (bool*)va_arg( args, bool * );
119             *pb_bool = false;
120             return VLC_SUCCESS;
121
122         case MUX_GET_MIME:   /* Unknown */
123         default:
124             return VLC_EGENERIC;
125    }
126 }
127
128 static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
129 {
130     VLC_UNUSED(p_input);
131     msg_Dbg( p_mux, "adding input" );
132     return VLC_SUCCESS;
133 }
134
135 static int DelStream( sout_mux_t *p_mux, sout_input_t *p_input )
136 {
137     VLC_UNUSED(p_input);
138     msg_Dbg( p_mux, "removing input" );
139     return VLC_SUCCESS;
140 }
141
142 static int Mux( sout_mux_t *p_mux )
143 {
144     sout_mux_sys_t *p_sys = p_mux->p_sys;
145     int i;
146
147     for( i = 0; i < p_mux->i_nb_inputs; i++ )
148     {
149         block_fifo_t *p_fifo;
150         int i_count;
151
152         if( p_sys->b_header && p_mux->pp_inputs[i]->p_fmt->i_extra )
153         {
154             /* Write header data */
155             block_t *p_data;
156             p_data = block_New( p_mux, p_mux->pp_inputs[i]->p_fmt->i_extra );
157
158             memcpy( p_data->p_buffer, p_mux->pp_inputs[i]->p_fmt->p_extra,
159                     p_mux->pp_inputs[i]->p_fmt->i_extra );
160
161             msg_Dbg( p_mux, "writing header data" );
162             sout_AccessOutWrite( p_mux->p_access, p_data );
163         }
164
165         p_fifo = p_mux->pp_inputs[i]->p_fifo;
166         i_count = block_FifoCount( p_fifo );
167         while( i_count > 0 )
168         {
169             block_t *p_data = block_FifoGet( p_fifo );
170
171             sout_AccessOutWrite( p_mux->p_access, p_data );
172
173             i_count--;
174         }
175     }
176     p_sys->b_header = false;
177
178     return VLC_SUCCESS;
179 }