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_call.c

    r2027 r2032  
    213213 
    214214 
    215 #define LATE_SDP    0 
    216  
    217215/* Allocate one call id */ 
    218216static pjsua_call_id alloc_call_id(void) 
     
    288286} 
    289287 
     288/* 
    290289static int call_get_secure_level(pjsua_call *call) 
    291290{ 
     
    317316    return 0; 
    318317} 
     318*/ 
    319319 
    320320 
     
    450450    /* Init media channel */ 
    451451    status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC,  
    452                                       call->secure_level, NULL); 
     452                                      call->secure_level, dlg->pool, 
     453                                      NULL, NULL); 
    453454    if (status != PJ_SUCCESS) { 
    454455        pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
     
    456457    } 
    457458 
    458     /* Create SDP offer */ 
    459 #if LATE_SDP 
    460     offer = NULL; 
    461 #else 
    462     status = pjsua_media_channel_create_sdp(call->index, dlg->pool, NULL,  
     459    /* Create offer */ 
     460    status = pjsua_media_channel_create_sdp(call->index, dlg->pool, NULL, 
    463461                                            &offer, NULL); 
    464462    if (status != PJ_SUCCESS) { 
    465         pjsua_perror(THIS_FILE, "pjmedia unable to create SDP", status); 
     463        pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
    466464        goto on_error; 
    467465    } 
    468 #endif 
    469466 
    470467    /* Create the INVITE session: */ 
     
    719716        call->secure_level = 0; 
    720717 
    721     /* Init media channel */ 
    722     status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAS,  
    723                                       call->secure_level, &sip_err_code); 
    724     if (status != PJ_SUCCESS) { 
    725         pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
    726         pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata,  
    727                                       sip_err_code, NULL, 
    728                                       NULL, NULL); 
    729         PJSUA_UNLOCK(); 
    730         return PJ_TRUE; 
    731     } 
    732  
    733718    /* Parse SDP from incoming request */ 
    734719    if (rdata->msg_info.msg->body) { 
     
    740725            pjsua_perror(THIS_FILE, "Error parsing SDP in incoming INVITE",  
    741726                         status); 
    742             pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 400, &reason, 
    743                                           NULL, NULL); 
    744             pjsua_media_channel_deinit(call->index); 
     727            pjsip_endpt_respond(pjsua_var.endpt, NULL, rdata, 400,  
     728                                &reason, NULL, NULL, NULL); 
    745729            PJSUA_UNLOCK(); 
    746730            return PJ_TRUE; 
     
    762746    } 
    763747 
    764     /* Get media capability from media endpoint: */ 
     748    /* Init media channel */ 
     749    status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAS,  
     750                                      call->secure_level,  
     751                                      rdata->tp_info.pool, offer, 
     752                                      &sip_err_code); 
     753    if (status != PJ_SUCCESS) { 
     754        pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
     755        pjsip_endpt_respond(pjsua_var.endpt, NULL, rdata, 
     756                            sip_err_code, NULL, NULL, NULL, NULL); 
     757        PJSUA_UNLOCK(); 
     758        return PJ_TRUE; 
     759    } 
     760 
     761    /* Create answer */ 
    765762    status = pjsua_media_channel_create_sdp(call->index, rdata->tp_info.pool,  
    766763                                            offer, &answer, &sip_err_code); 
    767764    if (status != PJ_SUCCESS) { 
    768765        pjsua_perror(THIS_FILE, "Error creating SDP answer", status); 
    769         pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata,  
    770                                       sip_err_code, NULL, 
    771                                       NULL, NULL); 
    772         pjsua_media_channel_deinit(call->index); 
     766        pjsip_endpt_respond(pjsua_var.endpt, NULL, rdata, 
     767                            sip_err_code, NULL, NULL, NULL, NULL); 
    773768        PJSUA_UNLOCK(); 
    774769        return PJ_TRUE; 
    775770    } 
     771 
    776772 
    777773    /* Verify that we can handle the request. */ 
     
    795791 
    796792        } else { 
    797  
    798793            /* Respond with 500 (Internal Server Error) */ 
    799             pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, 
    800                                           NULL, NULL); 
     794            pjsip_endpt_respond(pjsua_var.endpt, NULL, rdata, 500, NULL, 
     795                                NULL, NULL, NULL); 
    801796        } 
    802797 
     
    14751470    } 
    14761471 
    1477     /* Update call secure level */ 
    1478     call->secure_level = call_get_secure_level(call); 
    1479  
    1480     /* Init media channel */ 
    1481     status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC, 
    1482                                       call->secure_level, NULL); 
    1483     if (status != PJ_SUCCESS) { 
    1484         pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
    1485         pjsip_dlg_dec_lock(dlg); 
    1486         return PJSIP_ESESSIONSTATE; 
    1487     } 
    1488  
    14891472    /* Create SDP */ 
    14901473    PJ_UNUSED_ARG(unhold); 
     
    15481531        return status; 
    15491532 
    1550     /* Update call's secure level */ 
    1551     call->secure_level = call_get_secure_level(call); 
    1552  
    1553     /* Init media channel */ 
    1554     status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC, 
    1555                                       call->secure_level, NULL); 
    1556     if (status != PJ_SUCCESS) { 
    1557         pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
    1558         pjsip_dlg_dec_lock(dlg); 
    1559         return PJSIP_ESESSIONSTATE; 
    1560     } 
    1561  
    15621533    /* Create SDP */ 
    15631534    status = pjsua_media_channel_create_sdp(call->index, call->inv->pool,  
     
    15701541    } 
    15711542 
    1572     /* Create re-INVITE with new offer */ 
     1543    update_sdp_version(call, sdp); 
     1544 
     1545    /* Create UPDATE with new offer */ 
    15731546    status = pjsip_inv_update(call->inv, NULL, sdp, &tdata); 
    15741547    if (status != PJ_SUCCESS) { 
     
    25382511{ 
    25392512    pjsua_call *call; 
    2540     const pjmedia_sdp_session *c_local; 
    2541     pjmedia_sdp_session *local_sdp; 
     2513    const pjmedia_sdp_session *local_sdp; 
    25422514    const pjmedia_sdp_session *remote_sdp; 
    25432515 
     
    25682540 
    25692541    /* Get local and remote SDP */ 
    2570     status = pjmedia_sdp_neg_get_active_local(call->inv->neg, &c_local); 
     2542    status = pjmedia_sdp_neg_get_active_local(call->inv->neg, &local_sdp); 
    25712543    if (status != PJ_SUCCESS) { 
    25722544        pjsua_perror(THIS_FILE,  
     
    25772549        return; 
    25782550    } 
    2579     local_sdp = (pjmedia_sdp_session*) c_local; 
    25802551 
    25812552    status = pjmedia_sdp_neg_get_active_remote(call->inv->neg, &remote_sdp); 
     
    27132684                  call->index)); 
    27142685 
    2715         /* Update call's secure level */ 
    2716         call->secure_level = call_get_secure_level(call); 
    2717  
    2718         /* Init media channel */ 
    2719         status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAS, 
    2720                                           call->secure_level, NULL); 
    2721         if (status != PJ_SUCCESS) { 
    2722             pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
    2723             PJSUA_UNLOCK(); 
    2724             return; 
    2725         } 
    2726  
    27272686        status = pjsua_media_channel_create_sdp(call->index, call->inv->pool,  
    27282687                                                offer, &answer, NULL); 
     
    27682727        PJ_LOG(4,(THIS_FILE, "Call %d: asked to send a new offer", 
    27692728                  call->index)); 
    2770  
    2771         /* Update call's secure level */ 
    2772         call->secure_level = call_get_secure_level(call); 
    2773  
    2774         /* Init media channel */ 
    2775         status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC, 
    2776                                           call->secure_level, NULL); 
    2777         if (status != PJ_SUCCESS) { 
    2778             pjsua_perror(THIS_FILE, "Error initializing media channel", status); 
    2779             PJSUA_UNLOCK(); 
    2780             return; 
    2781         } 
    27822729 
    27832730        status = pjsua_media_channel_create_sdp(call->index, call->inv->pool,  
Note: See TracChangeset for help on using the changeset viewer.