summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2013-01-23 02:57:30 +0000
committerNanang Izzuddin <nanang@teluu.com>2013-01-23 02:57:30 +0000
commit89e43bc5c1f286d4466d606fb96618cb87c4bf90 (patch)
tree7de5acf14dfd41ed719c4988005eba82448ea9da /pjmedia
parent5a9d4fd7b11151e1b21d627d7197ceafccd38343 (diff)
Re #1568: backported to 1.x branch.
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@4329 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/codec.h12
-rw-r--r--pjmedia/src/pjmedia/codec.c33
-rw-r--r--pjmedia/src/pjmedia/session.c19
3 files changed, 64 insertions, 0 deletions
diff --git a/pjmedia/include/pjmedia/codec.h b/pjmedia/include/pjmedia/codec.h
index 50f70297..ea3f71f9 100644
--- a/pjmedia/include/pjmedia/codec.h
+++ b/pjmedia/include/pjmedia/codec.h
@@ -309,6 +309,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 647b0b5d..35a90625 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,
diff --git a/pjmedia/src/pjmedia/session.c b/pjmedia/src/pjmedia/session.c
index 787cbb4c..ff195119 100644
--- a/pjmedia/src/pjmedia/session.c
+++ b/pjmedia/src/pjmedia/session.c
@@ -671,6 +671,25 @@ PJ_DEF(pj_status_t) pjmedia_session_create( pjmedia_endpt *endpt,
pj_memcpy(session->stream_info, si->stream_info,
si->stream_cnt * sizeof(pjmedia_stream_info));
+ /* Clone codec param */
+ for (i=0; i<(int)si->stream_cnt; ++i) {
+ if (session->stream_info[i].param) {
+ session->stream_info[i].param =
+ pjmedia_codec_param_clone(pool, si->stream_info[i].param);
+ } else {
+ pjmedia_codec_param cp;
+ status = pjmedia_codec_mgr_get_default_param(
+ pjmedia_endpt_get_codec_mgr(endpt),
+ &si->stream_info[i].fmt,
+ &cp);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ session->stream_info[i].param =
+ pjmedia_codec_param_clone(pool, &cp);
+ }
+ }
+
/*
* Now create and start the stream!
*/