From b572c1c64cab8d78d606b97ac5b95ee9c210ecd7 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Fri, 3 Mar 2006 10:43:08 +0000 Subject: Support for missing rtpmap for static payload types git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@276 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/codec.h | 13 +++++++++++ pjmedia/src/pjmedia/codec.c | 21 +++++++++++++++++ pjmedia/src/pjmedia/session.c | 51 +++++++++++++++++++++++++++-------------- 3 files changed, 68 insertions(+), 17 deletions(-) (limited to 'pjmedia') 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 @@ -412,6 +412,19 @@ PJ_DECL(pj_status_t) pjmedia_codec_mgr_enum_codecs( pjmedia_codec_mgr *mgr, unsigned *count, 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. * 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 @@ -116,6 +116,27 @@ pjmedia_codec_mgr_enum_codecs(pjmedia_codec_mgr *mgr, return PJ_SUCCESS; } +/* + * 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; icodec_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. */ 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) -- cgit v1.2.3