summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-12-26 21:18:11 +0000
committerBenny Prijono <bennylp@teluu.com>2006-12-26 21:18:11 +0000
commit47d417ed5eb941ec7bdde985a05340ae184d6fc7 (patch)
tree8ba9b4af43f4745f0f73ff36b4624689c0e08499 /pjmedia
parentf9017cbd238e567ae0bea2c60611bd8fd8814e3e (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
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/codec.h18
-rw-r--r--pjmedia/include/pjmedia/silencedet.h5
-rw-r--r--pjmedia/src/pjmedia-codec/gsm.c27
-rw-r--r--pjmedia/src/pjmedia-codec/ilbc.c49
-rw-r--r--pjmedia/src/pjmedia-codec/l16.c16
-rw-r--r--pjmedia/src/pjmedia-codec/speex_codec.c37
-rw-r--r--pjmedia/src/pjmedia/echo_suppress.c1
-rw-r--r--pjmedia/src/pjmedia/g711.c21
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,