summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-09-14 04:06:29 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-09-14 04:06:29 +0000
commit69848a09610618abe49a4b5211af0a0d784a54a4 (patch)
tree37f34b87c58c073eaf47f8227ad2e3a583545010 /pjmedia
parentb5e8e2f6d6d2353c94181498299ce5c0ffbdc87b (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')
-rw-r--r--pjmedia/include/pjmedia/codec.h12
-rw-r--r--pjmedia/src/pjmedia/codec.c50
-rw-r--r--pjmedia/src/pjmedia/stream.c1
3 files changed, 49 insertions, 14 deletions
diff --git a/pjmedia/include/pjmedia/codec.h b/pjmedia/include/pjmedia/codec.h
index 8e2f23bc..94aff738 100644
--- a/pjmedia/include/pjmedia/codec.h
+++ b/pjmedia/include/pjmedia/codec.h
@@ -308,6 +308,18 @@ typedef struct pjmedia_codec_param
} pjmedia_codec_param;
+/**
+ * Duplicate codec parameter.
+ *
+ * @param pool The pool.
+ * @param src The codec parameter to be duplicated.
+ *
+ * @return Duplicated codec parameter.
+ */
+PJ_DECL(pjmedia_codec_param*) pjmedia_codec_param_clone(
+ pj_pool_t *pool,
+ const pjmedia_codec_param *src);
+
/*
* Forward declaration for pjmedia_codec.
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,
- &param->setting.dec_fmtp.param[i].name);
- pj_strdup(pool, &p->param->setting.dec_fmtp.param[i].val,
- &param->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,
- &param->setting.enc_fmtp.param[i].name);
- pj_strdup(pool, &p->param->setting.enc_fmtp.param[i].val,
- &param->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);