Changeset 1098 for pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c
- Timestamp:
- Mar 23, 2007 4:34:20 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c
r974 r1098 61 61 62 62 63 /* Destroy the call's media */64 static pj_status_t call_destroy_media(int call_id);65 63 66 64 /* Create inactive SDP for call hold. */ … … 303 301 } 304 302 305 /* Get media capability from media endpoint: */ 306 307 status = pjmedia_endpt_create_sdp( pjsua_var.med_endpt, dlg->pool, 1, 308 &call->skinfo, &offer); 303 /* Init media channel */ 304 status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC); 305 if (status != PJ_SUCCESS) { 306 pjsua_perror(THIS_FILE, "Error initializing media channel", status); 307 goto on_error; 308 } 309 310 /* Create SDP offer */ 311 status = pjsua_media_channel_create_sdp(call->index, dlg->pool, &offer); 309 312 if (status != PJ_SUCCESS) { 310 313 pjsua_perror(THIS_FILE, "pjmedia unable to create SDP", status); … … 404 407 if (call_id != -1) { 405 408 reset_call(call_id); 409 pjsua_media_channel_deinit(call_id); 406 410 } 407 411 … … 527 531 528 532 529 /* Get media capability from media endpoint: */ 530 status = pjmedia_endpt_create_sdp( pjsua_var.med_endpt, 531 rdata->tp_info.pool, 1, 532 &call->skinfo, &answer ); 533 /* Init media channel */ 534 status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAS); 533 535 if (status != PJ_SUCCESS) { 534 536 pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, … … 539 541 540 542 543 /* Get media capability from media endpoint: */ 544 status = pjsua_media_channel_create_sdp(call->index, rdata->tp_info.pool, &answer); 545 if (status != PJ_SUCCESS) { 546 pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 547 NULL, NULL); 548 pjsua_media_channel_deinit(call->index); 549 PJSUA_UNLOCK(); 550 return PJ_TRUE; 551 } 552 553 541 554 /* Verify that we can handle the request. */ 542 555 status = pjsip_inv_verify_request(rdata, &options, answer, NULL, … … 562 575 } 563 576 577 pjsua_media_channel_deinit(call->index); 564 578 PJSUA_UNLOCK(); 565 579 return PJ_TRUE; … … 581 595 pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 582 596 NULL, NULL); 597 pjsua_media_channel_deinit(call->index); 583 598 PJSUA_UNLOCK(); 584 599 return PJ_TRUE; … … 591 606 pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 592 607 NULL, NULL); 608 pjsua_media_channel_deinit(call->index); 593 609 PJSUA_UNLOCK(); 594 610 return PJ_TRUE; … … 619 635 pjsip_dlg_terminate(dlg); 620 636 */ 637 pjsua_media_channel_deinit(call->index); 621 638 PJSUA_UNLOCK(); 622 639 return PJ_TRUE; … … 650 667 pjsip_dlg_respond(dlg, rdata, 500, NULL, NULL, NULL); 651 668 pjsip_inv_terminate(inv, 500, PJ_FALSE); 669 pjsua_media_channel_deinit(call->index); 652 670 PJSUA_UNLOCK(); 653 671 return PJ_TRUE; … … 655 673 } else { 656 674 status = pjsip_inv_send_msg(inv, response); 657 if (status != PJ_SUCCESS) 675 if (status != PJ_SUCCESS) { 658 676 pjsua_perror(THIS_FILE, "Unable to send 100 response", status); 677 } 659 678 } 660 679 … … 1192 1211 PJ_UNUSED_ARG(unhold); 1193 1212 PJ_TODO(create_active_inactive_sdp_based_on_unhold_arg); 1194 status = pjmedia_endpt_create_sdp( pjsua_var.med_endpt, call->inv->pool, 1195 1, &call->skinfo, &sdp); 1213 status = pjsua_media_channel_create_sdp(call->index, call->inv->pool, &sdp); 1196 1214 if (status != PJ_SUCCESS) { 1197 1215 pjsua_perror(THIS_FILE, "Unable to get SDP from media endpoint", … … 1886 1904 1887 1905 /* 1888 * Destroy the call's media1889 */1890 static pj_status_t call_destroy_media(int call_id)1891 {1892 pjsua_call *call = &pjsua_var.calls[call_id];1893 1894 if (call->conf_slot != PJSUA_INVALID_ID) {1895 pjmedia_conf_remove_port(pjsua_var.mconf, call->conf_slot);1896 call->conf_slot = PJSUA_INVALID_ID;1897 }1898 1899 if (call->session) {1900 /* Destroy session (this will also close RTP/RTCP sockets). */1901 pjmedia_session_destroy(call->session);1902 call->session = NULL;1903 1904 PJ_LOG(4,(THIS_FILE, "Media session for call %d is destroyed",1905 call_id));1906 1907 }1908 1909 call->media_st = PJSUA_CALL_MEDIA_NONE;1910 1911 return PJ_SUCCESS;1912 }1913 1914 1915 /*1916 1906 * This callback receives notification from invite session when the 1917 1907 * session state has changed. … … 2035 2025 2036 2026 if (call) 2037 call_destroy_media(call->index);2027 pjsua_media_channel_deinit(call->index); 2038 2028 2039 2029 /* Free call */ … … 2078 2068 2079 2069 /* 2080 * DTMF callback from the stream.2081 */2082 static void dtmf_callback(pjmedia_stream *strm, void *user_data,2083 int digit)2084 {2085 PJ_UNUSED_ARG(strm);2086 2087 if (pjsua_var.ua_cfg.cb.on_dtmf_digit) {2088 pjsua_call_id call_id;2089 2090 call_id = (pjsua_call_id)user_data;2091 pjsua_var.ua_cfg.cb.on_dtmf_digit(call_id, digit);2092 }2093 }2094 2095 /*2096 2070 * Callback to be called when SDP offer/answer negotiation has just completed 2097 2071 * in the session. This function will start/update media if negotiation … … 2101 2075 pj_status_t status) 2102 2076 { 2103 int prev_media_st = 0;2104 2077 pjsua_call *call; 2105 pjmedia_session_info sess_info; 2106 const pjmedia_sdp_session *local_sdp; 2107 const pjmedia_sdp_session *remote_sdp; 2108 pjmedia_port *media_port; 2109 pj_str_t port_name; 2110 char tmp[PJSIP_MAX_URL_SIZE]; 2078 pjmedia_sdp_session *local_sdp; 2079 pjmedia_sdp_session *remote_sdp; 2111 2080 2112 2081 PJSUA_LOCK(); … … 2119 2088 2120 2089 /* Stop/destroy media, if any */ 2121 call_destroy_media(call->index);2090 pjsua_media_channel_deinit(call->index); 2122 2091 2123 2092 /* Disconnect call if we're not in the middle of initializing an … … 2134 2103 } 2135 2104 2136 /* Destroy existing media session, if any. */2137 2138 if (call) {2139 prev_media_st = call->media_st;2140 call_destroy_media(call->index);2141 }2142 2105 2143 2106 /* Get local and remote SDP */ 2144 2145 2107 status = pjmedia_sdp_neg_get_active_local(call->inv->neg, &local_sdp); 2146 2108 if (status != PJ_SUCCESS) { … … 2164 2126 } 2165 2127 2166 /* Create media session info based on SDP parameters. 2167 * We only support one stream per session at the moment 2168 */ 2169 status = pjmedia_session_info_from_sdp( call->inv->dlg->pool, 2170 pjsua_var.med_endpt, 2171 1,&sess_info, 2172 local_sdp, remote_sdp); 2128 status = pjsua_media_channel_update(call->index, local_sdp, remote_sdp); 2173 2129 if (status != PJ_SUCCESS) { 2174 2130 pjsua_perror(THIS_FILE, "Unable to create media session", 2175 2131 status); 2176 2132 call_disconnect(inv, PJSIP_SC_UNSUPPORTED_MEDIA_TYPE); 2133 pjsua_media_channel_deinit(call->index); 2177 2134 PJSUA_UNLOCK(); 2178 2135 return; 2179 2136 } 2180 2137 2181 /* Check if media is put on-hold */2182 if (sess_info.stream_cnt == 0 ||2183 sess_info.stream_info[0].dir == PJMEDIA_DIR_NONE)2184 {2185 2186 /* Determine who puts the call on-hold */2187 if (prev_media_st == PJSUA_CALL_MEDIA_ACTIVE) {2188 if (pjmedia_sdp_neg_was_answer_remote(call->inv->neg)) {2189 /* It was local who offer hold */2190 call->media_st = PJSUA_CALL_MEDIA_LOCAL_HOLD;2191 } else {2192 call->media_st = PJSUA_CALL_MEDIA_REMOTE_HOLD;2193 }2194 }2195 2196 call->media_dir = PJMEDIA_DIR_NONE;2197 2198 } else {2199 2200 /* Override ptime, if this option is specified. */2201 if (pjsua_var.media_cfg.ptime != 0) {2202 sess_info.stream_info[0].param->setting.frm_per_pkt = (pj_uint8_t)2203 (pjsua_var.media_cfg.ptime / sess_info.stream_info[0].param->info.frm_ptime);2204 if (sess_info.stream_info[0].param->setting.frm_per_pkt == 0)2205 sess_info.stream_info[0].param->setting.frm_per_pkt = 1;2206 }2207 2208 /* Disable VAD, if this option is specified. */2209 if (pjsua_var.media_cfg.no_vad) {2210 sess_info.stream_info[0].param->setting.vad = 0;2211 }2212 2213 2214 /* Optionally, application may modify other stream settings here2215 * (such as jitter buffer parameters, codec ptime, etc.)2216 */2217 sess_info.stream_info[0].jb_init = pjsua_var.media_cfg.jb_init;2218 sess_info.stream_info[0].jb_min_pre = pjsua_var.media_cfg.jb_min_pre;2219 sess_info.stream_info[0].jb_max_pre = pjsua_var.media_cfg.jb_max_pre;2220 sess_info.stream_info[0].jb_max = pjsua_var.media_cfg.jb_max;2221 2222 /* Create session based on session info. */2223 status = pjmedia_session_create( pjsua_var.med_endpt, &sess_info,2224 &call->med_tp,2225 call, &call->session );2226 if (status != PJ_SUCCESS) {2227 pjsua_perror(THIS_FILE, "Unable to create media session",2228 status);2229 //call_disconnect(inv, PJSIP_SC_UNSUPPORTED_MEDIA_TYPE);2230 PJSUA_UNLOCK();2231 return;2232 }2233 2234 /* If DTMF callback is installed by application, install our2235 * callback to the session.2236 */2237 if (pjsua_var.ua_cfg.cb.on_dtmf_digit) {2238 pjmedia_session_set_dtmf_callback(call->session, 0,2239 &dtmf_callback,2240 (void*)(call->index));2241 }2242 2243 /* Get the port interface of the first stream in the session.2244 * We need the port interface to add to the conference bridge.2245 */2246 pjmedia_session_get_port(call->session, 0, &media_port);2247 2248 2249 /*2250 * Add the call to conference bridge.2251 */2252 port_name.ptr = tmp;2253 port_name.slen = pjsip_uri_print(PJSIP_URI_IN_REQ_URI,2254 call->inv->dlg->remote.info->uri,2255 tmp, sizeof(tmp));2256 if (port_name.slen < 1) {2257 port_name = pj_str("call");2258 }2259 status = pjmedia_conf_add_port( pjsua_var.mconf, call->inv->pool,2260 media_port,2261 &port_name,2262 (unsigned*)&call->conf_slot);2263 if (status != PJ_SUCCESS) {2264 pjsua_perror(THIS_FILE, "Unable to create conference slot",2265 status);2266 call_destroy_media(call->index);2267 //call_disconnect(inv, PJSIP_SC_INTERNAL_SERVER_ERROR);2268 PJSUA_UNLOCK();2269 return;2270 }2271 2272 /* Call's media state is active */2273 call->media_st = PJSUA_CALL_MEDIA_ACTIVE;2274 call->media_dir = sess_info.stream_info[0].dir;2275 }2276 2277 /* Print info. */2278 {2279 char info[80];2280 int info_len = 0;2281 unsigned i;2282 2283 for (i=0; i<sess_info.stream_cnt; ++i) {2284 int len;2285 const char *dir;2286 pjmedia_stream_info *strm_info = &sess_info.stream_info[i];2287 2288 switch (strm_info->dir) {2289 case PJMEDIA_DIR_NONE:2290 dir = "inactive";2291 break;2292 case PJMEDIA_DIR_ENCODING:2293 dir = "sendonly";2294 break;2295 case PJMEDIA_DIR_DECODING:2296 dir = "recvonly";2297 break;2298 case PJMEDIA_DIR_ENCODING_DECODING:2299 dir = "sendrecv";2300 break;2301 default:2302 dir = "unknown";2303 break;2304 }2305 len = pj_ansi_sprintf( info+info_len,2306 ", stream #%d: %.*s (%s)", i,2307 (int)strm_info->fmt.encoding_name.slen,2308 strm_info->fmt.encoding_name.ptr,2309 dir);2310 if (len > 0)2311 info_len += len;2312 }2313 PJ_LOG(4,(THIS_FILE,"Media updates%s", info));2314 }2315 2138 2316 2139 /* Call application callback, if any */ … … 2414 2237 PJ_LOG(4,(THIS_FILE, "Call %d: received updated media offer", 2415 2238 call->index)); 2416 status = pjmedia_endpt_create_sdp( pjsua_var.med_endpt, 2417 call->inv->pool, 1, 2418 &call->skinfo, &answer); 2239 status = pjsua_media_channel_create_sdp(call->index, call->inv->pool, &answer); 2419 2240 } 2420 2241
Note: See TracChangeset
for help on using the changeset viewer.