[vlc-devel] commit: Improved speex encoder configuration. (Laurent Aimar )
git version control
git at videolan.org
Mon Sep 8 19:36:31 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Mon Sep 8 19:39:01 2008 +0200| [ecd28675c2d6c79f9de8a327c8a75a437f09f74a] | committer: Laurent Aimar
Improved speex encoder configuration.
(As request by http://forum.videolan.org/viewtopic.php?f=7&t=40558)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ecd28675c2d6c79f9de8a327c8a75a437f09f74a
---
modules/codec/speex.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 116 insertions(+), 5 deletions(-)
diff --git a/modules/codec/speex.c b/modules/codec/speex.c
index bbafd50..05e64a5 100644
--- a/modules/codec/speex.c
+++ b/modules/codec/speex.c
@@ -51,6 +51,43 @@ 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 );
@@ -68,8 +105,38 @@ vlc_module_begin();
set_description( N_("Speex audio encoder") );
set_capability( "encoder", 100 );
set_callbacks( OpenEncoder, CloseEncoder );
+
+ add_integer( ENC_CFG_PREFIX "mode", 0, NULL, ENC_MODE_TEXT,
+ ENC_MODE_LONGTEXT, false );
+ change_integer_list( pi_enc_mode_values, ppsz_enc_mode_descriptions, NULL );
+
+ add_integer( ENC_CFG_PREFIX "complexity", 3, NULL, ENC_COMPLEXITY_TEXT,
+ ENC_COMPLEXITY_LONGTEXT, false );
+ change_integer_range( 1, 10 );
+
+ add_bool( ENC_CFG_PREFIX "cbr", false, NULL, ENC_CBR_TEXT,
+ ENC_CBR_LONGTEXT, false );
+
+ add_float( ENC_CFG_PREFIX "quality", 8.0, NULL, ENC_QUALITY_TEXT,
+ ENC_QUALITY_LONGTEXT, false );
+ change_float_range( 0.0, 10.0 );
+
+ add_integer( ENC_CFG_PREFIX "max-bitrate", 0, NULL, ENC_MAXBITRATE_TEXT,
+ ENC_MAXBITRATE_LONGTEXT, false );
+
+ add_bool( ENC_CFG_PREFIX "vad", true, NULL, ENC_VAD_TEXT,
+ ENC_VAD_LONGTEXT, false );
+
+ add_bool( ENC_CFG_PREFIX "dtx", false, NULL, 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
+};
/*****************************************************************************
* decoder_sys_t : speex decoder descriptor
@@ -851,7 +918,7 @@ static int OpenEncoder( vlc_object_t *p_this )
encoder_t *p_enc = (encoder_t *)p_this;
encoder_sys_t *p_sys;
const SpeexMode *p_speex_mode = &speex_nb_mode;
- int i_quality, i;
+ int i_tmp, i;
const char *pp_header[2];
int pi_header[2];
uint8_t *p_extra;
@@ -862,6 +929,23 @@ static int OpenEncoder( vlc_object_t *p_this )
return VLC_EGENERIC;
}
+ config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
+ switch( var_GetInteger( p_enc, ENC_CFG_PREFIX "mode" ) )
+ {
+ case 1:
+ msg_Dbg( p_enc, "Using wideband" );
+ p_speex_mode = &speex_wb_mode;
+ break;
+ case 2:
+ msg_Dbg( p_enc, "Using ultra-wideband" );
+ p_speex_mode = &speex_uwb_mode;
+ break;
+ default:
+ msg_Dbg( p_enc, "Using narrowband" );
+ p_speex_mode = &speex_nb_mode;
+ break;
+ }
+
/* Allocate the memory needed to store the decoder's structure */
if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
return VLC_ENOMEM;
@@ -874,15 +958,42 @@ static int OpenEncoder( vlc_object_t *p_this )
1, p_speex_mode );
p_sys->header.frames_per_packet = 1;
- p_sys->header.vbr = 1;
+ p_sys->header.vbr = var_GetBool( p_enc, ENC_CFG_PREFIX "cbr" ) ? 0 : 1;
p_sys->header.nb_channels = p_enc->fmt_in.audio.i_channels;
/* Create a new encoder state in narrowband mode */
p_sys->p_state = speex_encoder_init( p_speex_mode );
- /* Set the quality to 8 (15 kbps) */
- i_quality = 8;
- speex_encoder_ctl( p_sys->p_state, SPEEX_SET_QUALITY, &i_quality );
+ /* Parameters */
+ i_tmp = var_GetInteger( p_enc, ENC_CFG_PREFIX "complexity" );
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_COMPLEXITY, &i_tmp );
+
+ i_tmp = var_GetBool( p_enc, ENC_CFG_PREFIX "cbr" ) ? 0 : 1;
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_VBR, &i_tmp );
+
+ if( i_tmp == 0 ) /* CBR */
+ {
+ i_tmp = var_GetFloat( p_enc, ENC_CFG_PREFIX "quality" );
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_QUALITY, &i_tmp );
+
+ i_tmp = var_GetBool( p_enc, ENC_CFG_PREFIX "vad" ) ? 1 : 0;
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_VAD, &i_tmp );
+ }
+ else
+ {
+ float f_tmp;
+
+ f_tmp = var_GetFloat( p_enc, ENC_CFG_PREFIX "quality" );
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_VBR_QUALITY, &f_tmp );
+
+ i_tmp = var_GetInteger( p_enc, ENC_CFG_PREFIX "max-bitrate" );
+ if( i_tmp > 0 )
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_VBR_MAX_BITRATE, &i_tmp );
+ }
+
+ i_tmp = var_GetBool( p_enc, ENC_CFG_PREFIX "dtx" ) ? 1 : 0;
+ speex_encoder_ctl( p_sys->p_state, SPEEX_SET_DTX, &i_tmp );
+
/*Initialization of the structure that holds the bits*/
speex_bits_init( &p_sys->bits );
More information about the vlc-devel
mailing list