Ignore:
Timestamp:
Feb 6, 2013 1:48:45 PM (8 years ago)
Author:
nanang
Message:

Close #1242: Single re-INVITE/UPDATE for both lock codec and ICE negotiation updates.

File:
1 edited

Legend:

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

    r4336 r4342  
    586586} 
    587587 
    588 static void med_tp_nego_timer_cb(void *user_data) 
    589 { 
    590     pjsua_call *call; 
    591     unsigned med_idx = (unsigned)(((long)user_data) & 0xFFFF); 
    592     pjsua_call_media *call_med; 
    593     pjmedia_transport *tp; 
    594     pjmedia_transport_info tpinfo; 
    595     pjmedia_ice_transport_info *ii = NULL; 
    596     unsigned i; 
    597     pjsip_dialog *dlg = NULL; 
    598  
    599     if ((acquire_call("med_tp_nego_timer_cb", ((long)user_data) >> 16, 
    600                      &call, &dlg) != PJ_SUCCESS) || 
    601         (med_idx >= call->med_cnt)) 
    602     { 
    603         /* Call have been terminated or media has been removed */ 
    604         return; 
    605     } 
    606  
    607     call_med = &call->media[med_idx]; 
    608     tp = call_med->tp; 
    609  
    610     if (!tp) 
    611         return; 
    612  
    613     /* Send UPDATE if default transport address is different than 
    614      * what was advertised (ticket #881) 
    615      */ 
    616  
    617     pjmedia_transport_info_init(&tpinfo); 
    618     pjmedia_transport_get_info(tp, &tpinfo); 
    619     for (i=0; i<tpinfo.specific_info_cnt; ++i) { 
    620         if (tpinfo.spc_info[i].type==PJMEDIA_TRANSPORT_TYPE_ICE) { 
    621             ii = (pjmedia_ice_transport_info*) 
    622             tpinfo.spc_info[i].buffer; 
    623             break; 
    624         } 
    625     } 
    626  
    627     if (ii && ii->role==PJ_ICE_SESS_ROLE_CONTROLLING && 
    628         pj_sockaddr_cmp(&tpinfo.sock_info.rtp_addr_name, 
    629                         &call_med->rtp_addr)) 
    630     { 
    631         pj_bool_t use_update; 
    632         const pj_str_t STR_UPDATE = { "UPDATE", 6 }; 
    633         pjsip_dialog_cap_status support_update; 
    634         pjsip_dialog *dlg; 
    635  
    636         dlg = call_med->call->inv->dlg; 
    637         support_update = pjsip_dlg_remote_has_cap(dlg, PJSIP_H_ALLOW, 
    638                                                   NULL, &STR_UPDATE); 
    639         use_update = (support_update == PJSIP_DIALOG_CAP_SUPPORTED); 
    640  
    641         PJ_LOG(4,(THIS_FILE,  
    642                   "ICE default transport address has changed for " 
    643                   "call %d, sending %s", 
    644                   call_med->call->index, 
    645                   (use_update ? "UPDATE" : "re-INVITE"))); 
    646  
    647         if (use_update) 
    648             pjsua_call_update(call_med->call->index, 0, NULL); 
    649         else 
    650             pjsua_call_reinvite(call_med->call->index, 0, NULL); 
    651     } 
    652  
    653     if (dlg) 
    654         pjsip_dlg_dec_lock(dlg); 
    655 } 
    656  
    657588 
    658589/* This callback is called when ICE negotiation completes */ 
     
    662593{ 
    663594    pjsua_call_media *call_med = (pjsua_call_media*)tp->user_data; 
     595    pjsua_call *call; 
    664596 
    665597    if (!call_med) 
    666598        return; 
    667599 
     600    call = call_med->call; 
     601     
    668602    switch (op) { 
    669603    case PJ_ICE_STRANS_OP_INIT: 
     
    672606        break; 
    673607    case PJ_ICE_STRANS_OP_NEGOTIATION: 
    674         if (result != PJ_SUCCESS) { 
     608        if (result == PJ_SUCCESS) { 
     609            /* Update RTP address */ 
     610            pjmedia_transport_info tpinfo; 
     611            pjmedia_transport_info_init(&tpinfo); 
     612            pjmedia_transport_get_info(call_med->tp, &tpinfo); 
     613            pj_sockaddr_cp(&call_med->rtp_addr, &tpinfo.sock_info.rtp_addr_name); 
     614        } else { 
    675615            call_med->state = PJSUA_CALL_MEDIA_ERROR; 
    676616            call_med->dir = PJMEDIA_DIR_NONE; 
    677  
    678             if (call_med->call && pjsua_var.ua_cfg.cb.on_call_media_state) { 
    679                 pjsua_var.ua_cfg.cb.on_call_media_state(call_med->call->index); 
    680             } 
    681         } else if (call_med->call) { 
    682             void *data = (void*)(long)( (call_med->call->index<<16) | 
    683                                         (call_med->idx & 0xFFFF) ); 
    684             pjsua_schedule_timer2(&med_tp_nego_timer_cb, data, 1); 
     617            if (call && pjsua_var.ua_cfg.cb.on_call_media_state) { 
     618                pjsua_var.ua_cfg.cb.on_call_media_state(call->index); 
     619            } 
    685620        } 
     621        /* Check if default ICE transport address is changed */ 
     622        call->reinv_ice_sent = PJ_FALSE; 
     623        pjsua_call_schedule_reinvite_check(call, 0); 
    686624        break; 
    687625    case PJ_ICE_STRANS_OP_KEEP_ALIVE: 
     
    689627            PJ_PERROR(4,(THIS_FILE, result, 
    690628                         "ICE keep alive failure for transport %d:%d", 
    691                          call_med->call->index, call_med->idx)); 
     629                         call->index, call_med->idx)); 
    692630        } 
    693631        if (pjsua_var.ua_cfg.cb.on_call_media_transport_state) { 
     
    700638            info.ext_info = &op; 
    701639            (*pjsua_var.ua_cfg.cb.on_call_media_transport_state)( 
    702                 call_med->call->index, &info); 
     640                call->index, &info); 
    703641        } 
    704642        if (pjsua_var.ua_cfg.cb.on_ice_transport_error) { 
    705             pjsua_call_id id = call_med->call->index; 
     643            pjsua_call_id id = call->index; 
    706644            (*pjsua_var.ua_cfg.cb.on_ice_transport_error)(id, op, result, 
    707645                                                          NULL); 
     
    856794    pjmedia_transport_simulate_lost(call_med->tp, PJMEDIA_DIR_DECODING, 
    857795                                    pjsua_var.media_cfg.rx_drop_pct); 
    858  
     796     
    859797    return PJ_SUCCESS; 
    860798 
     
    13401278                call_med->med_create_cb = &call_media_init_cb; 
    13411279                call_med->med_init_cb = cb; 
    1342  
     1280                 
    13431281                return PJ_EPENDING; 
    13441282            } 
Note: See TracChangeset for help on using the changeset viewer.