diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2012-09-14 04:06:29 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2012-09-14 04:06:29 +0000 |
commit | 69848a09610618abe49a4b5211af0a0d784a54a4 (patch) | |
tree | 37f34b87c58c073eaf47f8227ad2e3a583545010 /pjmedia/src | |
parent | b5e8e2f6d6d2353c94181498299ce5c0ffbdc87b (diff) |
Close #1568:
- Added media change detection based on SDP negotiation result and local codec param settings, the detection result will decide whether the media should be re-initialized after the SDP negotiation.
- Fixed stream to keep the duplicate of codec param for the stream info (was only copying the pointer).
- Introduced macro PJSUA_THIRD_PARTY_STREAM_HAS_GET_INFO & PJSUA_THIRD_PARTY_STREAM_HAS_GET_STAT.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4254 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r-- | pjmedia/src/pjmedia/codec.c | 50 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/stream.c | 1 |
2 files changed, 37 insertions, 14 deletions
diff --git a/pjmedia/src/pjmedia/codec.c b/pjmedia/src/pjmedia/codec.c index 111ad0c7..3c647670 100644 --- a/pjmedia/src/pjmedia/codec.c +++ b/pjmedia/src/pjmedia/codec.c @@ -41,6 +41,39 @@ static void sort_codecs(pjmedia_codec_mgr *mgr); /* + * Duplicate codec parameter. + */ +PJ_DEF(pjmedia_codec_param*) pjmedia_codec_param_clone( + pj_pool_t *pool, + const pjmedia_codec_param *src) +{ + pjmedia_codec_param *p; + unsigned i; + + PJ_ASSERT_RETURN(pool && src, NULL); + + p = PJ_POOL_ZALLOC_T(pool, pjmedia_codec_param); + + /* Update codec param */ + pj_memcpy(p, src, sizeof(pjmedia_codec_param)); + for (i = 0; i < src->setting.dec_fmtp.cnt; ++i) { + pj_strdup(pool, &p->setting.dec_fmtp.param[i].name, + &src->setting.dec_fmtp.param[i].name); + pj_strdup(pool, &p->setting.dec_fmtp.param[i].val, + &src->setting.dec_fmtp.param[i].val); + } + for (i = 0; i < src->setting.enc_fmtp.cnt; ++i) { + pj_strdup(pool, &p->setting.enc_fmtp.param[i].name, + &src->setting.enc_fmtp.param[i].name); + pj_strdup(pool, &p->setting.enc_fmtp.param[i].val, + &src->setting.enc_fmtp.param[i].val); + } + + return p; +} + + +/* * Initialize codec manager. */ PJ_DEF(pj_status_t) pjmedia_codec_mgr_init (pjmedia_codec_mgr *mgr, @@ -600,22 +633,11 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_set_default_param( codec_desc->param = PJ_POOL_ZALLOC_T(pool, pjmedia_codec_default_param); p = codec_desc->param; p->pool = pool; - p->param = PJ_POOL_ZALLOC_T(pool, pjmedia_codec_param); /* Update codec param */ - pj_memcpy(p->param, param, sizeof(pjmedia_codec_param)); - 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); - } + p->param = pjmedia_codec_param_clone(pool, param); + if (!p->param) + return PJ_EINVAL; pj_mutex_unlock(mgr->mutex); diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index 19b5523e..54dfb831 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -1989,6 +1989,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt, PJ_ASSERT_RETURN(stream != NULL, PJ_ENOMEM); stream->own_pool = own_pool; pj_memcpy(&stream->si, info, sizeof(*info)); + stream->si.param = pjmedia_codec_param_clone(pool, info->param); /* Init stream/port name */ name.ptr = (char*) pj_pool_alloc(pool, M); |