summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-03-03 10:43:08 +0000
committerBenny Prijono <bennylp@teluu.com>2006-03-03 10:43:08 +0000
commitb572c1c64cab8d78d606b97ac5b95ee9c210ecd7 (patch)
tree514358b971e6e2602148c020d73c75e763e7f240 /pjmedia
parentee9d7c0db3e81ea4aa1c1749a2bb72a3b57d0660 (diff)
Support for missing rtpmap for static payload types
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@276 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/codec.h13
-rw-r--r--pjmedia/src/pjmedia/codec.c21
-rw-r--r--pjmedia/src/pjmedia/session.c51
3 files changed, 68 insertions, 17 deletions
diff --git a/pjmedia/include/pjmedia/codec.h b/pjmedia/include/pjmedia/codec.h
index 7c118279..bab0018c 100644
--- a/pjmedia/include/pjmedia/codec.h
+++ b/pjmedia/include/pjmedia/codec.h
@@ -413,6 +413,19 @@ PJ_DECL(pj_status_t) pjmedia_codec_mgr_enum_codecs( pjmedia_codec_mgr *mgr,
pjmedia_codec_info info[]);
/**
+ * Get codec info for the specified static payload type.
+ *
+ * @param mgr The codec manager.
+ * @param pt Static payload type/number.
+ * @param inf Pointer to receive codec info.
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_codec_mgr_get_codec_info(pjmedia_codec_mgr *mgr,
+ unsigned pt,
+ pjmedia_codec_info *inf);
+
+/**
* Get default codec param for the specified codec info.
*
* @param mgr The codec manager.
diff --git a/pjmedia/src/pjmedia/codec.c b/pjmedia/src/pjmedia/codec.c
index 078ed4ee..6431a58e 100644
--- a/pjmedia/src/pjmedia/codec.c
+++ b/pjmedia/src/pjmedia/codec.c
@@ -117,6 +117,27 @@ pjmedia_codec_mgr_enum_codecs(pjmedia_codec_mgr *mgr,
}
/*
+ * Get codec info for static payload type.
+ */
+PJ_DEF(pj_status_t) pjmedia_codec_mgr_get_codec_info(pjmedia_codec_mgr *mgr,
+ unsigned pt,
+ pjmedia_codec_info *inf)
+{
+ unsigned i;
+
+ PJ_ASSERT_RETURN(mgr && inf && pt>=0 && pt < 96, PJ_EINVAL);
+
+ for (i=0; i<mgr->codec_cnt; ++i) {
+ if (mgr->codecs[i].pt == pt) {
+ pj_memcpy(inf, &mgr->codecs[i], sizeof(pjmedia_codec_info));
+ return PJ_SUCCESS;
+ }
+ }
+
+ return PJMEDIA_CODEC_EUNSUP;
+}
+
+/*
* Allocate one codec.
*/
PJ_DEF(pj_status_t) pjmedia_codec_mgr_alloc_codec(pjmedia_codec_mgr *mgr,
diff --git a/pjmedia/src/pjmedia/session.c b/pjmedia/src/pjmedia/session.c
index 7fe3aa75..6f37d3b0 100644
--- a/pjmedia/src/pjmedia/session.c
+++ b/pjmedia/src/pjmedia/session.c
@@ -60,6 +60,7 @@ static const pj_str_t STR_RECVONLY = { "recvonly", 8 };
* Create stream info from SDP media line.
*/
static pj_status_t create_stream_info_from_sdp(pj_pool_t *pool,
+ pjmedia_endpt *endpt,
pjmedia_stream_info *si,
const pjmedia_sdp_conn *local_conn,
const pjmedia_sdp_conn *rem_conn,
@@ -68,7 +69,7 @@ static pj_status_t create_stream_info_from_sdp(pj_pool_t *pool,
{
const pjmedia_sdp_attr *attr;
pjmedia_sdp_rtpmap *rtpmap;
- unsigned i;
+ unsigned i, pt;
pj_status_t status;
@@ -143,25 +144,41 @@ static pj_status_t create_stream_info_from_sdp(pj_pool_t *pool,
if (!pj_isdigit(*local_m->desc.fmt[0].ptr))
return PJMEDIA_EINVALIDPT;
- /* Find rtpmap for the first codec.
- * For this version of PJMEDIA, we do not support static payload
- * type without rtpmap.
+ /* Get the payload number. */
+ pt = pj_strtoul(&local_m->desc.fmt[0]);
+
+ /* Get codec info.
+ * For static payload types, get the info from codec manager.
+ * For dynamic payload types, MUST get the rtpmap.
*/
- attr = pjmedia_sdp_media_find_attr(local_m, &ID_RTPMAP,
- &local_m->desc.fmt[0]);
- if (attr == NULL)
- return PJMEDIA_EMISSINGRTPMAP;
+ if (pt < 96) {
+
+ pjmedia_codec_mgr *mgr;
- status = pjmedia_sdp_attr_to_rtpmap(pool, attr, &rtpmap);
- if (status != PJ_SUCCESS)
- return status;
+ mgr = pjmedia_endpt_get_codec_mgr(endpt);
- /* Build codec format info: */
+ status = pjmedia_codec_mgr_get_codec_info( mgr, pt, &si->fmt);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ } else {
- si->fmt.type = si->type;
- si->fmt.pt = pj_strtoul(&local_m->desc.fmt[0]);
- pj_strdup(pool, &si->fmt.encoding_name, &rtpmap->enc_name);
- si->fmt.sample_rate = rtpmap->clock_rate;
+ attr = pjmedia_sdp_media_find_attr(local_m, &ID_RTPMAP,
+ &local_m->desc.fmt[0]);
+ if (attr == NULL)
+ return PJMEDIA_EMISSINGRTPMAP;
+
+ status = pjmedia_sdp_attr_to_rtpmap(pool, attr, &rtpmap);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ /* Build codec format info: */
+
+ si->fmt.type = si->type;
+ si->fmt.pt = pj_strtoul(&local_m->desc.fmt[0]);
+ pj_strdup(pool, &si->fmt.encoding_name, &rtpmap->enc_name);
+ si->fmt.sample_rate = rtpmap->clock_rate;
+ }
/* Get local DTMF payload type */
si->tx_event_pt = -1;
@@ -254,7 +271,7 @@ PJ_DEF(pj_status_t) pjmedia_session_create( pjmedia_endpt *endpt,
local_conn = local_m->conn ? local_m->conn : local_sdp->conn;
rem_conn = rem_m->conn ? rem_m->conn : rem_sdp->conn;
- status = create_stream_info_from_sdp(session->pool, si,
+ status = create_stream_info_from_sdp(session->pool, endpt, si,
local_conn, rem_conn,
local_m, rem_m);
if (status != PJ_SUCCESS)