Ignore:
Timestamp:
Oct 24, 2011 9:28:13 AM (13 years ago)
Author:
ming
Message:

Re #1395: Backport of PJSIP 1.x branch into PJSIP 2.0 trunk

TODO: ticket #1268 (Option for automatic/manual sending of RTCP SDES/BYE for the stream) for video stream.

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

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

    r3796 r3841  
    397397 * Destroy pjsua media subsystem. 
    398398 */ 
    399 pj_status_t pjsua_media_subsys_destroy(void) 
     399pj_status_t pjsua_media_subsys_destroy(unsigned flags) 
    400400{ 
    401401    unsigned i; 
     
    442442            } 
    443443            if (call_med->tp && call_med->tp_auto_del) { 
     444                /* TODO: check if we're not allowed to send to network in the 
     445                 *       "flags", and if so do not do TURN allocation... 
     446                 */ 
     447                PJ_UNUSED_ARG(flags); 
    444448                pjmedia_transport_close(call_med->tp); 
    445449            } 
     
    12951299        set_media_tp_state(call_med, PJSUA_MED_TP_IDLE); 
    12961300 
     1301    if (!call_med->tp_orig && 
     1302        pjsua_var.ua_cfg.cb.on_create_media_transport) 
     1303    { 
     1304        call_med->use_custom_med_tp = PJ_TRUE; 
     1305    } else 
     1306        call_med->use_custom_med_tp = PJ_FALSE; 
     1307 
    12971308#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0) 
    12981309    /* This function may be called when SRTP transport already exists 
    12991310     * (e.g: in re-invite, update), don't need to destroy/re-create. 
    13001311     */ 
    1301     if (!call_med->tp_orig || call_med->tp == call_med->tp_orig) { 
     1312    if (!call_med->tp_orig) { 
    13021313        pjmedia_srtp_setting srtp_opt; 
    13031314        pjmedia_transport *srtp = NULL; 
     
    13151326        pjmedia_srtp_setting_default(&srtp_opt); 
    13161327        srtp_opt.close_member_tp = PJ_TRUE; 
    1317         /* If media session has been ever established, let's use remote's 
     1328        /* If media session has been ever established, let's use remote's  
    13181329         * preference in SRTP usage policy, especially when it is stricter. 
    13191330         */ 
     
    15201531            } 
    15211532 
    1522             status = pjmedia_transport_media_create( 
    1523                          call_med->tp, tmp_pool, 
    1524                          0, call->async_call.rem_sdp, mi); 
     1533            if (call_med->use_custom_med_tp) { 
     1534                unsigned custom_med_tp_flags = 0; 
     1535 
     1536                /* Use custom media transport returned by the application */ 
     1537                call_med->tp = 
     1538                    (*pjsua_var.ua_cfg.cb.on_create_media_transport) 
     1539                        (call_id, mi, call_med->tp, 
     1540                         custom_med_tp_flags); 
     1541                if (!call_med->tp) { 
     1542                    status = 
     1543                        PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_NOT_ACCEPTABLE); 
     1544                } 
     1545            } 
     1546 
     1547            if (call_med->tp) { 
     1548                status = pjmedia_transport_media_create( 
     1549                             call_med->tp, tmp_pool, 
     1550                             0, call->async_call.rem_sdp, mi); 
     1551            } 
    15251552            if (status != PJ_SUCCESS) { 
    15261553                call->med_ch_info.status = status; 
     
    21052132        PJ_LOG(4,(THIS_FILE, "Media session call%02d:%d is destroyed", 
    21062133                             call_id, mi)); 
     2134        call_med->prev_state = call_med->state; 
    21072135        call_med->state = PJSUA_CALL_MEDIA_NONE; 
    21082136    } 
     
    21342162    pj_log_push_indent(); 
    21352163 
    2136     stop_media_session(call_id); 
    2137  
    21382164    for (mi=0; mi<call->med_cnt; ++mi) { 
    21392165        pjsua_call_media *call_med = &call->media[mi]; 
    21402166 
    2141         if (call_med->tp_st > PJSUA_MED_TP_IDLE) { 
     2167        if (call_med->type == PJMEDIA_TYPE_AUDIO && call_med->strm.a.stream) 
     2168            pjmedia_stream_send_rtcp_bye(call_med->strm.a.stream); 
     2169    } 
     2170 
     2171    stop_media_session(call_id); 
     2172 
     2173    for (mi=0; mi<call->med_cnt; ++mi) { 
     2174        pjsua_call_media *call_med = &call->media[mi]; 
     2175 
     2176        if (call_med->tp_st > PJSUA_MED_TP_IDLE) { 
    21422177            pjmedia_transport_media_stop(call_med->tp); 
    21432178            set_media_tp_state(call_med, PJSUA_MED_TP_IDLE); 
     
    21542189            call_med->tp = call_med->tp_orig = NULL; 
    21552190        } 
     2191        call_med->tp_orig = NULL; 
    21562192    } 
    21572193 
     
    22062242    if (status != PJ_SUCCESS) 
    22072243        goto on_return; 
     2244 
     2245    si->rtcp_sdes_bye_disabled = PJ_TRUE; 
    22082246 
    22092247    /* Check if no media is active */ 
     
    22962334            goto on_return; 
    22972335        } 
     2336 
     2337        if (call_med->prev_state == PJSUA_CALL_MEDIA_NONE) 
     2338            pjmedia_stream_send_rtcp_sdes(call_med->strm.a.stream); 
    22982339 
    22992340        /* If DTMF callback is installed by application, install our 
Note: See TracChangeset for help on using the changeset viewer.