From 47d417ed5eb941ec7bdde985a05340ae184d6fc7 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 26 Dec 2006 21:18:11 +0000 Subject: Ticket #54: added ability to modify some codec parameters on the fly git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@867 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia-codec/speex_codec.c | 37 +++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'pjmedia/src/pjmedia-codec/speex_codec.c') 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. */ @@ -630,6 +636,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. */ -- cgit v1.2.3