Ignore:
Timestamp:
Mar 23, 2007 4:34:20 PM (18 years ago)
Author:
bennylp
Message:

ICE (work in progress): integration with PJSUA

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r974 r1098  
    6161 
    6262 
    63 /* Destroy the call's media */ 
    64 static pj_status_t call_destroy_media(int call_id); 
    6563 
    6664/* Create inactive SDP for call hold. */ 
     
    303301    } 
    304302 
    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); 
    309312    if (status != PJ_SUCCESS) { 
    310313        pjsua_perror(THIS_FILE, "pjmedia unable to create SDP", status); 
     
    404407    if (call_id != -1) { 
    405408        reset_call(call_id); 
     409        pjsua_media_channel_deinit(call_id); 
    406410    } 
    407411 
     
    527531 
    528532 
    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); 
    533535    if (status != PJ_SUCCESS) { 
    534536        pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 
     
    539541 
    540542 
     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 
    541554    /* Verify that we can handle the request. */ 
    542555    status = pjsip_inv_verify_request(rdata, &options, answer, NULL, 
     
    562575        } 
    563576 
     577        pjsua_media_channel_deinit(call->index); 
    564578        PJSUA_UNLOCK(); 
    565579        return PJ_TRUE; 
     
    581595        pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 
    582596                                      NULL, NULL); 
     597        pjsua_media_channel_deinit(call->index); 
    583598        PJSUA_UNLOCK(); 
    584599        return PJ_TRUE; 
     
    591606        pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 
    592607                                      NULL, NULL); 
     608        pjsua_media_channel_deinit(call->index); 
    593609        PJSUA_UNLOCK(); 
    594610        return PJ_TRUE; 
     
    619635        pjsip_dlg_terminate(dlg); 
    620636         */ 
     637        pjsua_media_channel_deinit(call->index); 
    621638        PJSUA_UNLOCK(); 
    622639        return PJ_TRUE; 
     
    650667        pjsip_dlg_respond(dlg, rdata, 500, NULL, NULL, NULL); 
    651668        pjsip_inv_terminate(inv, 500, PJ_FALSE); 
     669        pjsua_media_channel_deinit(call->index); 
    652670        PJSUA_UNLOCK(); 
    653671        return PJ_TRUE; 
     
    655673    } else { 
    656674        status = pjsip_inv_send_msg(inv, response); 
    657         if (status != PJ_SUCCESS) 
     675        if (status != PJ_SUCCESS) { 
    658676            pjsua_perror(THIS_FILE, "Unable to send 100 response", status); 
     677        } 
    659678    } 
    660679 
     
    11921211    PJ_UNUSED_ARG(unhold); 
    11931212    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); 
    11961214    if (status != PJ_SUCCESS) { 
    11971215        pjsua_perror(THIS_FILE, "Unable to get SDP from media endpoint",  
     
    18861904 
    18871905/* 
    1888  * Destroy the call's media 
    1889  */ 
    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 /* 
    19161906 * This callback receives notification from invite session when the 
    19171907 * session state has changed. 
     
    20352025 
    20362026        if (call) 
    2037             call_destroy_media(call->index); 
     2027            pjsua_media_channel_deinit(call->index); 
    20382028 
    20392029        /* Free call */ 
     
    20782068 
    20792069/* 
    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 /* 
    20962070 * Callback to be called when SDP offer/answer negotiation has just completed 
    20972071 * in the session. This function will start/update media if negotiation 
     
    21012075                                       pj_status_t status) 
    21022076{ 
    2103     int prev_media_st = 0; 
    21042077    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; 
    21112080 
    21122081    PJSUA_LOCK(); 
     
    21192088 
    21202089        /* Stop/destroy media, if any */ 
    2121         call_destroy_media(call->index); 
     2090        pjsua_media_channel_deinit(call->index); 
    21222091 
    21232092        /* Disconnect call if we're not in the middle of initializing an 
     
    21342103    } 
    21352104 
    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     } 
    21422105 
    21432106    /* Get local and remote SDP */ 
    2144  
    21452107    status = pjmedia_sdp_neg_get_active_local(call->inv->neg, &local_sdp); 
    21462108    if (status != PJ_SUCCESS) { 
     
    21642126    } 
    21652127 
    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); 
    21732129    if (status != PJ_SUCCESS) { 
    21742130        pjsua_perror(THIS_FILE, "Unable to create media session",  
    21752131                     status); 
    21762132        call_disconnect(inv, PJSIP_SC_UNSUPPORTED_MEDIA_TYPE); 
     2133        pjsua_media_channel_deinit(call->index); 
    21772134        PJSUA_UNLOCK(); 
    21782135        return; 
    21792136    } 
    21802137 
    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 here 
    2215          * (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 our 
    2235          * 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     } 
    23152138 
    23162139    /* Call application callback, if any */ 
     
    24142237        PJ_LOG(4,(THIS_FILE, "Call %d: received updated media offer", 
    24152238                  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); 
    24192240    } 
    24202241 
Note: See TracChangeset for help on using the changeset viewer.