Changeset 4342 for pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c
- Timestamp:
- Feb 6, 2013 1:48:45 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c
r4336 r4342 586 586 } 587 587 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 than614 * 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 else650 pjsua_call_reinvite(call_med->call->index, 0, NULL);651 }652 653 if (dlg)654 pjsip_dlg_dec_lock(dlg);655 }656 657 588 658 589 /* This callback is called when ICE negotiation completes */ … … 662 593 { 663 594 pjsua_call_media *call_med = (pjsua_call_media*)tp->user_data; 595 pjsua_call *call; 664 596 665 597 if (!call_med) 666 598 return; 667 599 600 call = call_med->call; 601 668 602 switch (op) { 669 603 case PJ_ICE_STRANS_OP_INIT: … … 672 606 break; 673 607 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 { 675 615 call_med->state = PJSUA_CALL_MEDIA_ERROR; 676 616 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 } 685 620 } 621 /* Check if default ICE transport address is changed */ 622 call->reinv_ice_sent = PJ_FALSE; 623 pjsua_call_schedule_reinvite_check(call, 0); 686 624 break; 687 625 case PJ_ICE_STRANS_OP_KEEP_ALIVE: … … 689 627 PJ_PERROR(4,(THIS_FILE, result, 690 628 "ICE keep alive failure for transport %d:%d", 691 call _med->call->index, call_med->idx));629 call->index, call_med->idx)); 692 630 } 693 631 if (pjsua_var.ua_cfg.cb.on_call_media_transport_state) { … … 700 638 info.ext_info = &op; 701 639 (*pjsua_var.ua_cfg.cb.on_call_media_transport_state)( 702 call _med->call->index, &info);640 call->index, &info); 703 641 } 704 642 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; 706 644 (*pjsua_var.ua_cfg.cb.on_ice_transport_error)(id, op, result, 707 645 NULL); … … 856 794 pjmedia_transport_simulate_lost(call_med->tp, PJMEDIA_DIR_DECODING, 857 795 pjsua_var.media_cfg.rx_drop_pct); 858 796 859 797 return PJ_SUCCESS; 860 798 … … 1340 1278 call_med->med_create_cb = &call_media_init_cb; 1341 1279 call_med->med_init_cb = cb; 1342 1280 1343 1281 return PJ_EPENDING; 1344 1282 }
Note: See TracChangeset
for help on using the changeset viewer.