summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-codec/speex_codec.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia-codec/speex_codec.c')
-rw-r--r--pjmedia/src/pjmedia-codec/speex_codec.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/pjmedia/src/pjmedia-codec/speex_codec.c b/pjmedia/src/pjmedia-codec/speex_codec.c
index 8625e72b..6c8a1602 100644
--- a/pjmedia/src/pjmedia-codec/speex_codec.c
+++ b/pjmedia/src/pjmedia-codec/speex_codec.c
@@ -59,8 +59,10 @@ static pj_status_t spx_dealloc_codec( pjmedia_codec_factory *factory,
static pj_status_t spx_codec_init( pjmedia_codec *codec,
pj_pool_t *pool );
static pj_status_t spx_codec_open( pjmedia_codec *codec,
- pjmedia_codec_param *attr );
+ const pjmedia_codec_param *attr );
static pj_status_t spx_codec_close( pjmedia_codec *codec );
+static pj_status_t spx_codec_modify(pjmedia_codec *codec,
+ const pjmedia_codec_param *attr );
static pj_status_t spx_codec_parse( pjmedia_codec *codec,
void *pkt,
pj_size_t pkt_size,
@@ -85,6 +87,7 @@ static pjmedia_codec_op spx_op =
&spx_codec_init,
&spx_codec_open,
&spx_codec_close,
+ &spx_codec_modify,
&spx_codec_parse,
&spx_codec_encode,
&spx_codec_decode,
@@ -544,7 +547,7 @@ static pj_status_t spx_codec_init( pjmedia_codec *codec,
* Open codec.
*/
static pj_status_t spx_codec_open( pjmedia_codec *codec,
- pjmedia_codec_param *attr )
+ const pjmedia_codec_param *attr )
{
struct spx_private *spx;
int id, tmp;
@@ -552,6 +555,9 @@ static pj_status_t spx_codec_open( pjmedia_codec *codec,
spx = (struct spx_private*) codec->codec_data;
id = spx->param_id;
+ /* Only supports one frame per packet */
+ PJ_ASSERT_RETURN(attr->setting.frm_per_pkt==1, PJ_EINVAL);
+
/*
* Create and initialize encoder.
*/
@@ -631,6 +637,33 @@ static pj_status_t spx_codec_close( pjmedia_codec *codec )
/*
+ * Modify codec settings.
+ */
+static pj_status_t spx_codec_modify(pjmedia_codec *codec,
+ const pjmedia_codec_param *attr )
+{
+ struct spx_private *spx;
+ int tmp;
+
+ spx = (struct spx_private*) codec->codec_data;
+
+ /* Only supports one frame per packet */
+ PJ_ASSERT_RETURN(attr->setting.frm_per_pkt==1, PJ_EINVAL);
+
+ /* VAD */
+ tmp = (attr->setting.vad != 0);
+ speex_encoder_ctl(spx->enc, SPEEX_SET_VAD, &tmp);
+ speex_encoder_ctl(spx->enc, SPEEX_SET_DTX, &tmp);
+
+ /* PENH */
+ tmp = attr->setting.penh;
+ speex_decoder_ctl(spx->dec, SPEEX_SET_ENH, &tmp);
+
+ return PJ_SUCCESS;
+}
+
+
+/*
* Get frames in the packet.
*/
static pj_status_t spx_codec_parse( pjmedia_codec *codec,