+#include <speex/speex.h>
+#include <speex/speex_header.h>
+#include <speex/speex_stereo.h>
+#include <speex/speex_callbacks.h>
+
+#include <assert.h>
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+static int OpenDecoder ( vlc_object_t * );
+static int OpenPacketizer( vlc_object_t * );
+static void CloseDecoder ( vlc_object_t * );
+static int OpenEncoder ( vlc_object_t * );
+static void CloseEncoder ( vlc_object_t * );
+
+#define ENC_CFG_PREFIX "sout-speex-"
+
+#define ENC_MODE_TEXT N_("Mode" )
+#define ENC_MODE_LONGTEXT N_( \
+ "Enforce the mode of the encoder." )
+
+#define ENC_QUALITY_TEXT N_("Encoding quality")
+#define ENC_QUALITY_LONGTEXT N_( \
+ "Enforce a quality between 0 (low) and 10 (high)." )
+
+#define ENC_COMPLEXITY_TEXT N_("Encoding complexity" )
+#define ENC_COMPLEXITY_LONGTEXT N_( \
+ "Enforce the complexity of the encoder." )
+
+#define ENC_MAXBITRATE_TEXT N_( "Maximal bitrate" )
+#define ENC_MAXBITRATE_LONGTEXT N_( \
+ "Enforce the maximal VBR bitrate" )
+
+#define ENC_CBR_TEXT N_( "CBR encoding" )
+#define ENC_CBR_LONGTEXT N_( \
+ "Enforce a constant bitrate encoding (CBR) instead of default " \
+ "variable bitrate encoding (VBR)." )
+
+#define ENC_VAD_TEXT N_( "Voice activity detection" )
+#define ENC_VAD_LONGTEXT N_( \
+ "Enable voice activity detection (VAD). It is automatically " \
+ "activated in VBR mode." )
+
+#define ENC_DTX_TEXT N_( "Discontinuous Transmission" )
+#define ENC_DTX_LONGTEXT N_( \
+ "Enable discontinuous transmission (DTX)." )
+
+static const int pi_enc_mode_values[] = { 0, 1, 2 };
+static const char * const ppsz_enc_mode_descriptions[] = {
+ N_("Narrow-band (8kHz)"), N_("Wide-band (16kHz)"), N_("Ultra-wideband (32kHz)"), NULL
+};
+
+vlc_module_begin ()
+ set_category( CAT_INPUT )
+ set_subcategory( SUBCAT_INPUT_ACODEC )
+
+ set_description( N_("Speex audio decoder") )
+ set_capability( "decoder", 100 )
+ set_shortname( N_("Speex") )
+ set_callbacks( OpenDecoder, CloseDecoder )
+
+ add_submodule ()
+ set_description( N_("Speex audio packetizer") )
+ set_capability( "packetizer", 100 )
+ set_callbacks( OpenPacketizer, CloseDecoder )
+
+ add_submodule ()
+ set_description( N_("Speex audio encoder") )
+ set_capability( "encoder", 100 )
+ set_callbacks( OpenEncoder, CloseEncoder )
+
+ add_integer( ENC_CFG_PREFIX "mode", 0, ENC_MODE_TEXT,
+ ENC_MODE_LONGTEXT, false )
+ change_integer_list( pi_enc_mode_values, ppsz_enc_mode_descriptions )
+
+ add_integer( ENC_CFG_PREFIX "complexity", 3, ENC_COMPLEXITY_TEXT,
+ ENC_COMPLEXITY_LONGTEXT, false )
+ change_integer_range( 1, 10 )
+
+ add_bool( ENC_CFG_PREFIX "cbr", false, ENC_CBR_TEXT,
+ ENC_CBR_LONGTEXT, false )
+
+ add_float( ENC_CFG_PREFIX "quality", 8.0, ENC_QUALITY_TEXT,
+ ENC_QUALITY_LONGTEXT, false )
+ change_float_range( 0.0, 10.0 )
+
+ add_integer( ENC_CFG_PREFIX "max-bitrate", 0, ENC_MAXBITRATE_TEXT,
+ ENC_MAXBITRATE_LONGTEXT, false )
+
+ add_bool( ENC_CFG_PREFIX "vad", true, ENC_VAD_TEXT,
+ ENC_VAD_LONGTEXT, false )
+
+ add_bool( ENC_CFG_PREFIX "dtx", false, ENC_DTX_TEXT,
+ ENC_DTX_LONGTEXT, false )
+
+ /* TODO agc, noise suppression, */
+
+vlc_module_end ()
+
+static const char *const ppsz_enc_options[] = {
+ "mode", "complexity", "cbr", "quality", "max-bitrate", "vad", "dtx", NULL
+};