Ignore:
Timestamp:
Jun 19, 2008 2:10:28 PM (16 years ago)
Author:
bennylp
Message:

Ticket #549: major modification in media transport API to support more offer/answer scenarios

File:
1 edited

Legend:

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

    r2027 r2032  
    653653    switch (op) { 
    654654    case PJ_ICE_STRANS_OP_INIT: 
    655         pjsua_var.calls[id].med_tp_st = result; 
     655        pjsua_var.calls[id].med_tp_ready = result; 
    656656        break; 
    657657    case PJ_ICE_STRANS_OP_NEGOTIATION: 
     
    753753        ice_cb.on_ice_complete = &on_ice_complete; 
    754754        pj_ansi_snprintf(name, sizeof(name), "icetp%02d", i); 
    755         pjsua_var.calls[i].med_tp_st = PJ_EPENDING; 
     755        pjsua_var.calls[i].med_tp_ready = PJ_EPENDING; 
    756756 
    757757        comp_cnt = 1; 
     
    770770        /* Wait until transport is initialized, or time out */ 
    771771        PJSUA_UNLOCK(); 
    772         while (pjsua_var.calls[i].med_tp_st == PJ_EPENDING) { 
     772        while (pjsua_var.calls[i].med_tp_ready == PJ_EPENDING) { 
    773773            pjsua_handle_events(100); 
    774774        } 
    775775        PJSUA_LOCK(); 
    776         if (pjsua_var.calls[i].med_tp_st != PJ_SUCCESS) { 
     776        if (pjsua_var.calls[i].med_tp_ready != PJ_SUCCESS) { 
    777777            pjsua_perror(THIS_FILE, "Error initializing ICE media transport", 
    778                          pjsua_var.calls[i].med_tp_st); 
    779             status = pjsua_var.calls[i].med_tp_st; 
     778                         pjsua_var.calls[i].med_tp_ready); 
     779            status = pjsua_var.calls[i].med_tp_ready; 
    780780            goto on_error; 
    781781        } 
     
    848848                                     pjsip_role_e role, 
    849849                                     int security_level, 
     850                                     pj_pool_t *tmp_pool, 
     851                                     const pjmedia_sdp_session *rem_sdp, 
    850852                                     int *sip_err_code) 
    851853{ 
     854    enum { MEDIA_IDX = 0 }; 
    852855    pjsua_call *call = &pjsua_var.calls[call_id]; 
     856    pj_status_t status; 
    853857 
    854858#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0) 
     
    856860    pjmedia_srtp_setting srtp_opt; 
    857861    pjmedia_transport *srtp; 
    858     pj_status_t status; 
    859862#endif 
    860863 
     
    905908#endif 
    906909 
     910    /* Create the media transport */ 
     911    status = pjmedia_transport_media_create(call->med_tp, tmp_pool, 0, 
     912                                            rem_sdp, MEDIA_IDX); 
     913    if (status != PJ_SUCCESS) { 
     914        if (sip_err_code) *sip_err_code = PJSIP_SC_NOT_ACCEPTABLE; 
     915        pjsua_media_channel_deinit(call_id); 
     916        return status; 
     917    } 
     918 
     919    call->med_tp_st = PJSUA_MED_TP_INIT; 
    907920    return PJ_SUCCESS; 
    908921} 
     
    927940    } 
    928941 
     942    /* Create media if it's not created. This could happen when call is 
     943     * currently on-hold 
     944     */ 
     945    if (call->med_tp_st == PJSUA_MED_TP_IDLE) { 
     946        pjsip_role_e role; 
     947        role = (rem_sdp ? PJSIP_ROLE_UAS : PJSIP_ROLE_UAC); 
     948        status = pjsua_media_channel_init(call_id, role, call->secure_level,  
     949                                          pool, rem_sdp, sip_status_code); 
     950        if (status != PJ_SUCCESS) 
     951            return status; 
     952    } 
     953 
    929954    /* Get media socket info */ 
    930955    pjmedia_transport_info_init(&tpinfo); 
     
    936961    if (status != PJ_SUCCESS) { 
    937962        if (sip_status_code) *sip_status_code = 500; 
    938         goto on_error; 
     963        return status; 
    939964    } 
    940965 
     
    964989 
    965990    /* Give the SDP to media transport */ 
    966     status = pjmedia_transport_media_create(call->med_tp, pool, 0, 
    967                                             sdp, rem_sdp, MEDIA_IDX); 
     991    status = pjmedia_transport_encode_sdp(call->med_tp, pool, sdp, rem_sdp,  
     992                                          MEDIA_IDX); 
    968993    if (status != PJ_SUCCESS) { 
    969994        if (sip_status_code) *sip_status_code = PJSIP_SC_NOT_ACCEPTABLE; 
    970         goto on_error; 
     995        return status; 
    971996    } 
    972997 
    973998    *p_sdp = sdp; 
    974999    return PJ_SUCCESS; 
    975  
    976 on_error: 
    977     pjsua_media_channel_deinit(call_id); 
    978     return status; 
    979  
    9801000} 
    9811001 
     
    9841004{ 
    9851005    pjsua_call *call = &pjsua_var.calls[call_id]; 
    986  
    987     //see ticket #525 
    988     //pjmedia_transport_media_stop(call->med_tp); 
    9891006 
    9901007    if (call->conf_slot != PJSUA_INVALID_ID) { 
     
    10171034    stop_media_session(call_id); 
    10181035 
    1019     pjmedia_transport_media_stop(call->med_tp); 
     1036    if (call->med_tp_st != PJSUA_MED_TP_IDLE) { 
     1037        pjmedia_transport_media_stop(call->med_tp); 
     1038        call->med_tp_st = PJSUA_MED_TP_IDLE; 
     1039    } 
    10201040 
    10211041    if (call->med_orig && call->med_tp != call->med_orig) { 
     
    10491069 
    10501070pj_status_t pjsua_media_channel_update(pjsua_call_id call_id, 
    1051                                        pjmedia_sdp_session *local_sdp, 
     1071                                       const pjmedia_sdp_session *local_sdp, 
    10521072                                       const pjmedia_sdp_session *remote_sdp) 
    10531073{ 
     
    11131133        /* Shutdown transport's session */ 
    11141134        pjmedia_transport_media_stop(call->med_tp); 
     1135        call->med_tp_st = PJSUA_MED_TP_IDLE; 
    11151136 
    11161137        /* No need because we need keepalive? */ 
     
    11231144 
    11241145    } else { 
    1125         /* Start media transport */ 
     1146        /* Start/restart media transport */ 
    11261147        status = pjmedia_transport_media_start(call->med_tp,  
    11271148                                               call->inv->pool, 
     
    11291150        if (status != PJ_SUCCESS) 
    11301151            return status; 
     1152 
     1153        call->med_tp_st = PJSUA_MED_TP_RUNNING; 
    11311154 
    11321155        /* Override ptime, if this option is specified. */ 
Note: See TracChangeset for help on using the changeset viewer.