diff options
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/src/pjmedia/codec.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/pjmedia/src/pjmedia/codec.c b/pjmedia/src/pjmedia/codec.c index 39d77834..323b0f59 100644 --- a/pjmedia/src/pjmedia/codec.c +++ b/pjmedia/src/pjmedia/codec.c @@ -535,7 +535,7 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_set_default_param( { unsigned i; pjmedia_codec_id codec_id; - pj_pool_t *pool; + pj_pool_t *pool, *old_pool = NULL; struct pjmedia_codec_desc *codec_desc = NULL; pjmedia_codec_default_param *p; @@ -560,10 +560,12 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_set_default_param( return PJMEDIA_CODEC_EUNSUP; } - /* If codec param is previously set, release codec param pool */ + /* If codec param is previously set, reset the codec param but release + * the codec param pool later after the new param is set (ticket #1171). + */ if (codec_desc->param) { pj_assert(codec_desc->param->pool); - pj_pool_release(codec_desc->param->pool); + old_pool = codec_desc->param->pool; codec_desc->param = NULL; } @@ -572,6 +574,8 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_set_default_param( */ if (NULL == param) { pj_mutex_unlock(mgr->mutex); + if (old_pool) + pj_pool_release(old_pool); return PJ_SUCCESS; } @@ -590,15 +594,18 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_set_default_param( pj_strdup(pool, &p->param->setting.dec_fmtp.param[i].val, ¶m->setting.dec_fmtp.param[i].val); } - for (i = 0; i < param->setting.dec_fmtp.cnt; ++i) { - pj_strdup(pool, &p->param->setting.dec_fmtp.param[i].name, - ¶m->setting.dec_fmtp.param[i].name); - pj_strdup(pool, &p->param->setting.dec_fmtp.param[i].val, - ¶m->setting.dec_fmtp.param[i].val); + for (i = 0; i < param->setting.enc_fmtp.cnt; ++i) { + pj_strdup(pool, &p->param->setting.enc_fmtp.param[i].name, + ¶m->setting.enc_fmtp.param[i].name); + pj_strdup(pool, &p->param->setting.enc_fmtp.param[i].val, + ¶m->setting.enc_fmtp.param[i].val); } pj_mutex_unlock(mgr->mutex); + if (old_pool) + pj_pool_release(old_pool); + return PJ_SUCCESS; } |