Changeset 4948


Ignore:
Timestamp:
Oct 17, 2014 12:47:31 AM (6 years ago)
Author:
ming
Message:

Fixed #1797: Clean up provisional media after re-invite/update

Location:
pjproject/trunk/pjsip
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r4944 r4948  
    143143    pjsua_call_media     media_prov[PJSUA_MAX_CALL_MEDIA]; 
    144144                                    /**< Array of provisional media.        */ 
     145    pj_bool_t            med_update_success; 
     146                                    /**< Is media update successful?        */ 
    145147 
    146148    int                  audio_idx; /**< First active audio media.          */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r4934 r4948  
    4949}; 
    5050 
     51/* UPDATE method */ 
     52static const pjsip_method pjsip_update_method = 
     53{ 
     54    PJSIP_OTHER_METHOD, 
     55    { "UPDATE", 6 } 
     56}; 
    5157 
    5258/* This callback receives notification from invite session when the 
     
    25092515 
    25102516    /* Send the request */ 
     2517    call->med_update_success = PJ_FALSE; 
    25112518    status = pjsip_inv_send_msg( call->inv, tdata); 
    25122519    if (status != PJ_SUCCESS) { 
     
    26172624 
    26182625    /* Send the request */ 
     2626    call->med_update_success = PJ_FALSE; 
    26192627    status = pjsip_inv_send_msg( call->inv, tdata); 
    26202628    if (status != PJ_SUCCESS) { 
     
    38153823    } 
    38163824 
     3825    call->med_update_success = (status == PJ_SUCCESS); 
     3826 
    38173827    /* Update remote's NAT type */ 
    38183828    if (pjsua_var.ua_cfg.nat_type_in_sdp) { 
     
    46824692        } 
    46834693    } else if (tsx->role == PJSIP_ROLE_UAC && 
    4684                tsx->last_tx == (pjsip_tx_data*)call->hold_msg && 
    4685                tsx->state >= PJSIP_TSX_STATE_COMPLETED) 
     4694               pjsip_method_cmp(&tsx->method, &pjsip_invite_method)==0 && 
     4695               tsx->state >= PJSIP_TSX_STATE_COMPLETED && 
     4696               (tsx->status_code!=401 && tsx->status_code!=407)) 
    46864697    { 
    4687         /* Monitor the status of call hold request */ 
    4688         call->hold_msg = NULL; 
    4689         if (tsx->status_code/100 != 2) { 
    4690             /* Outgoing call hold failed */ 
    4691             call->local_hold = PJ_FALSE; 
    4692             PJ_LOG(3,(THIS_FILE, "Error putting call %d on hold (reason=%d)", 
    4693                       call->index, tsx->status_code)); 
    4694         } 
     4698        if (tsx->status_code/100 != 2) { 
     4699            /* Monitor the status of call hold/unhold request */ 
     4700            if (tsx->last_tx == (pjsip_tx_data*)call->hold_msg) { 
     4701                /* Outgoing call hold failed */ 
     4702                call->local_hold = PJ_FALSE; 
     4703                PJ_LOG(3,(THIS_FILE, "Error putting call %d on hold " 
     4704                          "(reason=%d)", call->index, tsx->status_code)); 
     4705            } else if (call->opt.flag & PJSUA_CALL_UNHOLD) { 
     4706                /* Call unhold failed */ 
     4707                call->local_hold = PJ_TRUE; 
     4708                PJ_LOG(3,(THIS_FILE, "Error releasing hold on call %d " 
     4709                          "(reason=%d)", call->index, tsx->status_code)); 
     4710            }    
     4711        } 
     4712         
     4713        if (tsx->last_tx == (pjsip_tx_data*)call->hold_msg) { 
     4714            call->hold_msg = NULL; 
     4715        } 
     4716         
     4717        if (tsx->status_code/100 != 2 || 
     4718            ((call->opt.flag & PJSUA_CALL_NO_SDP_OFFER) == 0 && 
     4719             !call->med_update_success)) 
     4720        { 
     4721            /* Either we get non-2xx or media update failed, 
     4722             * clean up provisional media. 
     4723             */ 
     4724            pjsua_media_prov_clean_up(call->index); 
     4725        } 
    46954726    } else if (tsx->role == PJSIP_ROLE_UAC && 
    4696                (call->opt.flag & PJSUA_CALL_UNHOLD) && 
    4697                tsx->state >= PJSIP_TSX_STATE_COMPLETED) 
     4727               pjsip_method_cmp(&tsx->method, &pjsip_update_method)==0 && 
     4728               tsx->state >= PJSIP_TSX_STATE_COMPLETED && 
     4729               (tsx->status_code!=401 && tsx->status_code!=407)) 
    46984730    { 
    4699         /* Monitor the status of call unhold request */ 
    4700         if (tsx->status_code/100 != 2 && 
    4701             (tsx->status_code!=401 && tsx->status_code!=407)) 
     4731        if (tsx->status_code/100 != 2 || 
     4732            ((call->opt.flag & PJSUA_CALL_NO_SDP_OFFER) == 0 && 
     4733             !call->med_update_success)) 
    47024734        { 
    4703             /* Call unhold failed */ 
    4704             call->local_hold = PJ_TRUE; 
    4705             PJ_LOG(3,(THIS_FILE, "Error releasing hold on call %d (reason=%d)", 
    4706                       call->index, tsx->status_code)); 
     4735            /* Either we get non-2xx or media update failed, 
     4736             * clean up provisional media. 
     4737             */ 
     4738            pjsua_media_prov_clean_up(call->index); 
    47074739        } 
    47084740    } else if (tsx->role==PJSIP_ROLE_UAS && 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r4860 r4948  
    15301530    unsigned i; 
    15311531 
     1532    if (call->med_prov_cnt > call->med_cnt) { 
     1533        PJ_LOG(4,(THIS_FILE, "Call %d: cleaning up provisional media, " 
     1534                             "prov_med_cnt=%d, med_cnt=%d", 
     1535                             call_id, call->med_prov_cnt, call->med_cnt)); 
     1536    } 
     1537 
    15321538    for (i = idx; i < call->med_prov_cnt; ++i) { 
    15331539        pjsua_call_media *call_med = &call->media_prov[i]; 
     
    15551561        } 
    15561562    } 
     1563     
     1564    call->med_prov_cnt = 0; 
    15571565} 
    15581566 
Note: See TracChangeset for help on using the changeset viewer.