diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-04-03 22:32:49 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-04-03 22:32:49 +0000 |
commit | bd69f33ce0b49e8d973c8ea3ca43ca91228c01a5 (patch) | |
tree | cde486b75da333ac6d90dc8c3560f8be54fd2021 /pjmedia | |
parent | 185dff07f5d4fdb42fa21c9c90b40b518afdfcf9 (diff) |
Moved private create session info from SDP to public API
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@374 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia/session.h | 21 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/session.c | 83 |
2 files changed, 80 insertions, 24 deletions
diff --git a/pjmedia/include/pjmedia/session.h b/pjmedia/include/pjmedia/session.h index 1335bd5f..898744d4 100644 --- a/pjmedia/include/pjmedia/session.h +++ b/pjmedia/include/pjmedia/session.h @@ -67,6 +67,27 @@ struct pjmedia_session_info /** + * Initialize stream info from SDP media lines. + * + * @param si Stream info structure to be initialized. + * @param pool Pool. + * @param endpt Pjmedia endpoint. + * @param local Local SDP session descriptor. + * @param remote Remote SDP session descriptor. + * @param stream_idx Media stream index in the session descriptor. + * + * @return PJ_SUCCESS if stream info is successfully initialized. + */ +PJ_DECL(pj_status_t) pjmedia_stream_info_from_sdp( + pjmedia_stream_info *si, + pj_pool_t *pool, + pjmedia_endpt *endpt, + const pjmedia_sdp_session *local, + const pjmedia_sdp_session *remote, + unsigned stream_idx); + + +/** * Create media session based on the local and remote SDP. * The session will start immediately. * diff --git a/pjmedia/src/pjmedia/session.c b/pjmedia/src/pjmedia/session.c index 958cd105..5f00df53 100644 --- a/pjmedia/src/pjmedia/session.c +++ b/pjmedia/src/pjmedia/session.c @@ -59,24 +59,42 @@ 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, - const pjmedia_sdp_media *local_m, - const pjmedia_sdp_media *rem_m) +PJ_DEF(pj_status_t) pjmedia_stream_info_from_sdp( + pjmedia_stream_info *si, + pj_pool_t *pool, + pjmedia_endpt *endpt, + const pjmedia_sdp_session *local, + const pjmedia_sdp_session *remote, + unsigned stream_idx) { const pjmedia_sdp_attr *attr; + const pjmedia_sdp_media *local_m; + const pjmedia_sdp_media *rem_m; + const pjmedia_sdp_conn *local_conn; + const pjmedia_sdp_conn *rem_conn; pjmedia_sdp_rtpmap *rtpmap; unsigned i, pt; pj_status_t status; + /* Validate arguments: */ + PJ_ASSERT_RETURN(pool && si && local && remote, PJ_EINVAL); + PJ_ASSERT_RETURN(stream_idx < local->media_count, PJ_EINVAL); + PJ_ASSERT_RETURN(stream_idx < remote->media_count, PJ_EINVAL); + + + local_m = local->media[stream_idx]; + rem_m = remote->media[stream_idx]; + + local_conn = local_m->conn ? local_m->conn : local->conn; + if (local_conn == NULL) + return PJMEDIA_SDP_EMISSINGCONN; + + rem_conn = rem_m->conn ? rem_m->conn : remote->conn; + if (rem_conn == NULL) + return PJMEDIA_SDP_EMISSINGCONN; - PJ_ASSERT_RETURN(pool && si && local_conn && rem_conn && - local_m && rem_m, PJ_EINVAL); /* Reset: */ @@ -155,14 +173,38 @@ static pj_status_t create_stream_info_from_sdp(pj_pool_t *pool, * For dynamic payload types, MUST get the rtpmap. */ if (pt < 96) { - - pjmedia_codec_mgr *mgr; + pj_bool_t has_rtpmap; - mgr = pjmedia_endpt_get_codec_mgr(endpt); + rtpmap = NULL; + has_rtpmap = PJ_TRUE; - status = pjmedia_codec_mgr_get_codec_info( mgr, pt, &si->fmt); - if (status != PJ_SUCCESS) - return status; + attr = pjmedia_sdp_media_find_attr(local_m, &ID_RTPMAP, + &local_m->desc.fmt[0]); + if (attr == NULL) { + has_rtpmap = PJ_FALSE; + } + if (attr != NULL) { + status = pjmedia_sdp_attr_to_rtpmap(pool, attr, &rtpmap); + if (status != PJ_SUCCESS) + has_rtpmap = PJ_FALSE; + } + + /* Build codec format info: */ + if (has_rtpmap) { + 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; + + } else { + pjmedia_codec_mgr *mgr; + + mgr = pjmedia_endpt_get_codec_mgr(endpt); + + status = pjmedia_codec_mgr_get_codec_info( mgr, pt, &si->fmt); + if (status != PJ_SUCCESS) + return status; + } /* For static payload type, pt's are symetric */ si->tx_pt = pt; @@ -303,17 +345,10 @@ PJ_DEF(pj_status_t) pjmedia_session_create( pjmedia_endpt *endpt, for (i=0; i<(int)stream_cnt; ++i) { pjmedia_stream_info *si = &session->stream_info[i]; - const pjmedia_sdp_media *local_m = local_sdp->media[i]; - const pjmedia_sdp_media *rem_m = rem_sdp->media[i]; - pjmedia_sdp_conn *local_conn, *rem_conn; /* Build stream info based on media line in local SDP */ - 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, endpt, si, - local_conn, rem_conn, - local_m, rem_m); + status = pjmedia_stream_info_from_sdp(si, session->pool, endpt, + local_sdp, rem_sdp, i); if (status != PJ_SUCCESS) return status; |