diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-12-26 21:18:11 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-12-26 21:18:11 +0000 |
commit | 47d417ed5eb941ec7bdde985a05340ae184d6fc7 (patch) | |
tree | 8ba9b4af43f4745f0f73ff36b4624689c0e08499 | |
parent | f9017cbd238e567ae0bea2c60611bd8fd8814e3e (diff) |
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
-rw-r--r-- | pjmedia/include/pjmedia/codec.h | 18 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/silencedet.h | 5 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-codec/gsm.c | 27 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-codec/ilbc.c | 49 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-codec/l16.c | 16 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-codec/speex_codec.c | 37 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/echo_suppress.c | 1 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/g711.c | 21 |
8 files changed, 144 insertions, 30 deletions
diff --git a/pjmedia/include/pjmedia/codec.h b/pjmedia/include/pjmedia/codec.h index dd611f2f..3838e8a7 100644 --- a/pjmedia/include/pjmedia/codec.h +++ b/pjmedia/include/pjmedia/codec.h @@ -314,7 +314,7 @@ typedef struct pjmedia_codec_op * @return PJ_SUCCESS on success. */ pj_status_t (*open)(pjmedia_codec *codec, - pjmedia_codec_param *param ); + const pjmedia_codec_param *param ); /** * Close and shutdown codec, releasing all resources allocated by @@ -326,6 +326,22 @@ typedef struct pjmedia_codec_op */ pj_status_t (*close)(pjmedia_codec *codec); + /** + * Modify the codec parameter after the codec is open. + * Note that not all codec parameters can be modified during run-time. + * When the parameter cannot be changed, this function will return + * non-PJ_SUCCESS, and the original parameters will not be changed. + * + * Application can expect changing trivial codec settings such as + * changing VAD setting to succeed. + * + * @param codec The codec instance. + * @param param The new codec parameter. + * + * @return PJ_SUCCESS on success. + */ + pj_status_t (*modify)(pjmedia_codec *codec, + const pjmedia_codec_param *param ); /** * Instruct the codec to inspect the specified payload/packet and diff --git a/pjmedia/include/pjmedia/silencedet.h b/pjmedia/include/pjmedia/silencedet.h index c4cfbaa8..0c0afd66 100644 --- a/pjmedia/include/pjmedia/silencedet.h +++ b/pjmedia/include/pjmedia/silencedet.h @@ -185,11 +185,6 @@ PJ_DECL(pj_bool_t) pjmedia_silence_det_apply( pjmedia_silence_det *sd, pj_uint32_t level); -/** - * Declaration linear2ulaw - */ -unsigned char linear2ulaw(int pcm_val); - PJ_END_DECL diff --git a/pjmedia/src/pjmedia-codec/gsm.c b/pjmedia/src/pjmedia-codec/gsm.c index 633ddc1b..00b7d3fd 100644 --- a/pjmedia/src/pjmedia-codec/gsm.c +++ b/pjmedia/src/pjmedia-codec/gsm.c @@ -54,8 +54,10 @@ static pj_status_t gsm_dealloc_codec( pjmedia_codec_factory *factory, static pj_status_t gsm_codec_init( pjmedia_codec *codec, pj_pool_t *pool ); static pj_status_t gsm_codec_open( pjmedia_codec *codec, - pjmedia_codec_param *attr ); + const pjmedia_codec_param *attr ); static pj_status_t gsm_codec_close( pjmedia_codec *codec ); +static pj_status_t gsm_codec_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ); static pj_status_t gsm_codec_parse( pjmedia_codec *codec, void *pkt, pj_size_t pkt_size, @@ -80,6 +82,7 @@ static pjmedia_codec_op gsm_op = &gsm_codec_init, &gsm_codec_open, &gsm_codec_close, + &gsm_codec_modify, &gsm_codec_parse, &gsm_codec_encode, &gsm_codec_decode, @@ -385,15 +388,13 @@ static pj_status_t gsm_codec_init( pjmedia_codec *codec, * Open codec. */ static pj_status_t gsm_codec_open( pjmedia_codec *codec, - pjmedia_codec_param *attr ) + const pjmedia_codec_param *attr ) { struct gsm_data *gsm_data = codec->codec_data; pj_assert(gsm_data != NULL); pj_assert(gsm_data->encoder == NULL && gsm_data->decoder == NULL); - PJ_UNUSED_ARG(attr); - gsm_data->encoder = gsm_create(); if (!gsm_data->encoder) return PJMEDIA_CODEC_EFAILED; @@ -431,6 +432,24 @@ static pj_status_t gsm_codec_close( pjmedia_codec *codec ) /* + * Modify codec settings. + */ +static pj_status_t gsm_codec_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ) +{ + struct gsm_data *gsm_data = codec->codec_data; + + pj_assert(gsm_data != NULL); + pj_assert(gsm_data->encoder == NULL && gsm_data->decoder == NULL); + + gsm_data->vad_enabled = (attr->setting.vad != 0); + gsm_data->plc_enabled = (attr->setting.plc != 0); + + return PJ_SUCCESS; +} + + +/* * Get frames in the packet. */ static pj_status_t gsm_codec_parse( pjmedia_codec *codec, diff --git a/pjmedia/src/pjmedia-codec/ilbc.c b/pjmedia/src/pjmedia-codec/ilbc.c index da4bcec0..a16ed1cf 100644 --- a/pjmedia/src/pjmedia-codec/ilbc.c +++ b/pjmedia/src/pjmedia-codec/ilbc.c @@ -63,8 +63,10 @@ static pj_status_t ilbc_dealloc_codec(pjmedia_codec_factory *factory, static pj_status_t ilbc_codec_init(pjmedia_codec *codec, pj_pool_t *pool ); static pj_status_t ilbc_codec_open(pjmedia_codec *codec, - pjmedia_codec_param *attr ); + const pjmedia_codec_param *attr ); static pj_status_t ilbc_codec_close(pjmedia_codec *codec ); +static pj_status_t ilbc_codec_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ); static pj_status_t ilbc_codec_parse(pjmedia_codec *codec, void *pkt, pj_size_t pkt_size, @@ -89,6 +91,7 @@ static pjmedia_codec_op ilbc_op = &ilbc_codec_init, &ilbc_codec_open, &ilbc_codec_close, + &ilbc_codec_modify, &ilbc_codec_parse, &ilbc_codec_encode, &ilbc_codec_decode, @@ -123,6 +126,7 @@ struct ilbc_codec pj_pool_t *pool; char obj_name[PJ_MAX_OBJ_NAME]; pjmedia_silence_det *vad; + pj_bool_t vad_enabled; pj_bool_t plc_enabled; pj_bool_t enc_ready; @@ -360,14 +364,20 @@ static pj_status_t ilbc_codec_init(pjmedia_codec *codec, * Open codec. */ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, - pjmedia_codec_param *attr ) + const pjmedia_codec_param *param_attr ) { struct ilbc_codec *ilbc_codec = (struct ilbc_codec*)codec; + pjmedia_codec_param attr_copy, *attr; + pj_status_t status; pj_assert(ilbc_codec != NULL); pj_assert(ilbc_codec->enc_ready == PJ_FALSE && ilbc_codec->dec_ready == PJ_FALSE); + /* Copy param to temporary location since we need to modify fmtp_mode */ + pj_memcpy(&attr_copy, param_attr, sizeof(*param_attr)); + attr = &attr_copy; + /* Decoder mode must be set */ PJ_ASSERT_RETURN(attr->setting.dec_fmtp_mode==20 || attr->setting.dec_fmtp_mode==30, PJMEDIA_CODEC_EINMODE); @@ -404,17 +414,15 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, ilbc_codec->dec_ready = PJ_TRUE; /* Save plc flags */ - ilbc_codec->plc_enabled = attr->setting.plc != 0; - - /* Create silence detector, if wanted. */ - if (attr->setting.vad != 0) { - pj_status_t status; - status = pjmedia_silence_det_create(ilbc_codec->pool, CLOCK_RATE, - ilbc_codec->enc_samples_per_frame, - &ilbc_codec->vad); - if (status != PJ_SUCCESS) - return status; - } + ilbc_codec->plc_enabled = (attr->setting.plc != 0); + + /* Create silence detector. */ + ilbc_codec->vad_enabled = (attr->setting.vad != 0); + status = pjmedia_silence_det_create(ilbc_codec->pool, CLOCK_RATE, + ilbc_codec->enc_samples_per_frame, + &ilbc_codec->vad); + if (status != PJ_SUCCESS) + return status; PJ_LOG(5,(ilbc_codec->obj_name, "iLBC codec opened, encoder mode=%d, decoder mode=%d", @@ -438,6 +446,19 @@ static pj_status_t ilbc_codec_close( pjmedia_codec *codec ) return PJ_SUCCESS; } +/* + * Modify codec settings. + */ +static pj_status_t ilbc_codec_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ) +{ + struct ilbc_codec *ilbc_codec = (struct ilbc_codec*)codec; + + ilbc_codec->plc_enabled = (attr->setting.plc != 0); + ilbc_codec->vad_enabled = (attr->setting.vad != 0); + + return PJ_SUCCESS; +} /* * Get frames in the packet. @@ -493,7 +514,7 @@ static pj_status_t ilbc_codec_encode(pjmedia_codec *codec, return PJMEDIA_CODEC_EPCMFRMINLEN; /* Detect silence */ - if (ilbc_codec->vad) { + if (ilbc_codec->vad_enabled) { pj_bool_t is_silence; is_silence = pjmedia_silence_det_detect(ilbc_codec->vad, diff --git a/pjmedia/src/pjmedia-codec/l16.c b/pjmedia/src/pjmedia-codec/l16.c index 462306ab..18b86708 100644 --- a/pjmedia/src/pjmedia-codec/l16.c +++ b/pjmedia/src/pjmedia-codec/l16.c @@ -59,8 +59,10 @@ static pj_status_t l16_dealloc_codec( pjmedia_codec_factory *factory, static pj_status_t l16_init( pjmedia_codec *codec, pj_pool_t *pool ); static pj_status_t l16_open( pjmedia_codec *codec, - pjmedia_codec_param *attr ); + const pjmedia_codec_param *attr ); static pj_status_t l16_close( pjmedia_codec *codec ); +static pj_status_t l16_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ); static pj_status_t l16_parse(pjmedia_codec *codec, void *pkt, pj_size_t pkt_size, @@ -82,6 +84,7 @@ static pjmedia_codec_op l16_op = &l16_init, &l16_open, &l16_close, + &l16_modify, &l16_parse, &l16_encode, &l16_decode @@ -486,7 +489,7 @@ static pj_status_t l16_init( pjmedia_codec *codec, pj_pool_t *pool ) } static pj_status_t l16_open(pjmedia_codec *codec, - pjmedia_codec_param *attr ) + const pjmedia_codec_param *attr ) { /* Nothing to do.. */ PJ_UNUSED_ARG(codec); @@ -501,6 +504,15 @@ static pj_status_t l16_close( pjmedia_codec *codec ) return PJ_SUCCESS; } +static pj_status_t l16_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ) +{ + /* Don't want to do anything. */ + PJ_UNUSED_ARG(codec); + PJ_UNUSED_ARG(attr); + return PJ_EINVALIDOP; +} + static pj_status_t l16_parse( pjmedia_codec *codec, void *pkt, pj_size_t pkt_size, 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, diff --git a/pjmedia/src/pjmedia/echo_suppress.c b/pjmedia/src/pjmedia/echo_suppress.c index 56b32505..42106b30 100644 --- a/pjmedia/src/pjmedia/echo_suppress.c +++ b/pjmedia/src/pjmedia/echo_suppress.c @@ -83,6 +83,7 @@ PJ_DEF(pj_status_t) echo_supp_create( pj_pool_t *pool, PJ_UNUSED_ARG(clock_rate); PJ_UNUSED_ARG(options); + PJ_UNUSED_ARG(latency_ms); ec = pj_pool_zalloc(pool, sizeof(struct echo_supp)); ec->samples_per_frame = samples_per_frame; diff --git a/pjmedia/src/pjmedia/g711.c b/pjmedia/src/pjmedia/g711.c index cf8a2a33..1e9c0973 100644 --- a/pjmedia/src/pjmedia/g711.c +++ b/pjmedia/src/pjmedia/g711.c @@ -62,8 +62,10 @@ static pj_status_t g711_dealloc_codec( pjmedia_codec_factory *factory, static pj_status_t g711_init( pjmedia_codec *codec, pj_pool_t *pool ); static pj_status_t g711_open( pjmedia_codec *codec, - pjmedia_codec_param *attr ); + const pjmedia_codec_param *attr ); static pj_status_t g711_close( pjmedia_codec *codec ); +static pj_status_t g711_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ); static pj_status_t g711_parse(pjmedia_codec *codec, void *pkt, pj_size_t pkt_size, @@ -88,6 +90,7 @@ static pjmedia_codec_op g711_op = &g711_init, &g711_open, &g711_close, + &g711_modify, &g711_parse, &g711_encode, &g711_decode, @@ -394,7 +397,7 @@ static pj_status_t g711_init( pjmedia_codec *codec, pj_pool_t *pool ) } static pj_status_t g711_open(pjmedia_codec *codec, - pjmedia_codec_param *attr ) + const pjmedia_codec_param *attr ) { struct g711_private *priv = codec->codec_data; priv->pt = attr->info.pt; @@ -410,6 +413,20 @@ static pj_status_t g711_close( pjmedia_codec *codec ) return PJ_SUCCESS; } +static pj_status_t g711_modify(pjmedia_codec *codec, + const pjmedia_codec_param *attr ) +{ + struct g711_private *priv = codec->codec_data; + + if (attr->info.pt != priv->pt) + return PJMEDIA_EINVALIDPT; + + priv->plc_enabled = (attr->setting.plc != 0); + priv->vad_enabled = (attr->setting.vad != 0); + + return PJ_SUCCESS; +} + static pj_status_t g711_parse( pjmedia_codec *codec, void *pkt, pj_size_t pkt_size, |