Changeset 162


Ignore:
Timestamp:
Feb 9, 2006 12:13:40 AM (18 years ago)
Author:
bennylp
Message:

Integration of pjmedia and pjsip error subsystem to pjlib

Location:
pjproject/trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia.h

    r129 r162  
    2424#include <pjmedia/codec.h> 
    2525#include <pjmedia/jbuf.h> 
    26 #include <pjmedia/mediamgr.h> 
     26#include <pjmedia/endpoint.h> 
    2727#include <pjmedia/rtcp.h> 
    2828#include <pjmedia/rtp.h> 
    29 //#include <pjmedia/session.h> 
     29#include <pjmedia/session.h> 
    3030#include <pjmedia/sound.h> 
    3131#include <pjmedia/sdp.h> 
  • pjproject/trunk/pjmedia/include/pjmedia/errno.h

    r159 r162  
    2626 
    2727/** 
    28  * Guidelines on error message length. 
    29  */ 
    30 #define PJMEDIA_ERR_MSG_SIZE  64 
    31  
    32 /** 
    33  * Get error message for the specified error code. 
    34  * 
    35  * @param status    The error code. 
    36  * @param buffer    The buffer where to put the error message. 
    37  * @param bufsize   Size of the buffer. 
    38  * 
    39  * @return          The error message as NULL terminated string, 
    40  *                  wrapped with pj_str_t. 
    41  */ 
    42 PJ_DECL(pj_str_t) pjmedia_strerror( pj_status_t status, char *buffer, 
    43                                     pj_size_t bufsize); 
    44  
    45  
    46 /** 
    4728 * Start of error code relative to PJ_ERRNO_START_USER. 
    4829 */ 
  • pjproject/trunk/pjmedia/include/pjmedia/session.h

    r159 r162  
    4141/** 
    4242 * Create new session offering based on the local and remote SDP. 
    43  * The session initially will be inactive. 
     43 * The session will start immediately. 
    4444 * 
    4545 * @param endpt         The PJMEDIA endpoint instance. 
  • pjproject/trunk/pjmedia/include/pjmedia/types.h

    r159 r162  
    134134 
    135135    pj_sock_t       rtp_sock; 
     136    pj_sockaddr_in  rtp_addr_name; 
    136137    pj_sock_t       rtcp_sock; 
    137     pj_sockaddr_in  rtp_addr_name; 
     138    pj_sockaddr_in  rtcp_addr_name; 
    138139 
    139140} pjmedia_sock_info; 
  • pjproject/trunk/pjmedia/src/pjmedia/endpoint.c

    r159 r162  
    4141PJ_DECL(pj_status_t) g711_deinit_factory (pjmedia_codec_factory *factory); 
    4242 
     43/* Flag to indicate whether pjmedia error subsystem has been registered 
     44 * to pjlib. 
     45 */ 
     46static int error_subsys_registered; 
     47 
     48 
     49/** 
     50 * Defined in pjmedia/errno.c 
     51 *  
     52 * Get error message for the specified error code. Note that this 
     53 * function is only able to decode PJMEDIA specific error code. 
     54 * Application should use pj_strerror(), which should be able to 
     55 * decode all error codes belonging to all subsystems (e.g. pjlib, 
     56 * pjmedia, pjsip, etc). 
     57 * 
     58 * @param status    The error code. 
     59 * @param buffer    The buffer where to put the error message. 
     60 * @param bufsize   Size of the buffer. 
     61 * 
     62 * @return          The error message as NULL terminated string, 
     63 *                  wrapped with pj_str_t. 
     64 */ 
     65PJ_DECL(pj_str_t) pjmedia_strerror( pj_status_t status, char *buffer, 
     66                                    pj_size_t bufsize); 
     67 
     68 
    4369 
    4470/** Concrete declaration of media endpoint. */ 
     
    6591    pjmedia_codec_factory *factory; 
    6692    pj_status_t status; 
     93 
     94    if (!error_subsys_registered) { 
     95        pj_register_strerror(PJMEDIA_ERRNO_START, PJ_ERRNO_SPACE_SIZE,  
     96                             &pjmedia_strerror); 
     97        error_subsys_registered = 1; 
     98    } 
    6799 
    68100    PJ_ASSERT_RETURN(pf && p_endpt, PJ_EINVAL); 
  • pjproject/trunk/pjmedia/src/pjmedia/errno.c

    r159 r162  
    133133            return errstr; 
    134134 
    135         } else { 
    136             /* Error not found. */ 
    137             errstr.ptr = buf; 
    138             errstr.slen = pj_snprintf(buf, bufsize,  
    139                                       "Unknown error %d", 
    140                                       statcode); 
    141  
    142             return errstr; 
    143         } 
    144     } 
    145     else { 
    146         /* Not our code. Give it to PJLIB. */ 
    147         return pj_strerror(statcode, buf, bufsize); 
     135        }  
    148136    } 
    149137 
     138    /* Error not found. */ 
     139    errstr.ptr = buf; 
     140    errstr.slen = pj_snprintf(buf, bufsize,  
     141                              "Unknown error %d", 
     142                              statcode); 
     143 
     144    return errstr; 
    150145} 
    151146 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp.c

    r140 r162  
    990990    PJ_CATCH(SYNTAX_ERROR) { 
    991991         
    992         char errmsg[PJMEDIA_ERR_MSG_SIZE]; 
    993         pjmedia_strerror(ctx.last_error, errmsg, sizeof(errmsg)); 
     992        char errmsg[PJ_ERR_MSG_SIZE]; 
     993        pj_strerror(ctx.last_error, errmsg, sizeof(errmsg)); 
    994994 
    995995        PJ_LOG(4, (THIS_FILE, "Error parsing SDP in line %d col %d: %s", 
  • pjproject/trunk/pjsip/include/pjsip/sip_errno.h

    r127 r162  
    2424PJ_BEGIN_DECL 
    2525 
    26 /** 
    27  * Guidelines on error message length. 
    28  */ 
    29 #define PJSIP_ERR_MSG_SIZE  64 
    30  
    3126/* 
    3227 * PJSIP error codes occupies 170000 - 219000, and mapped as follows: 
     
    3429 *  - 171000 - 171999: mapped to errors generated from PJSIP core. 
    3530 */ 
    36  
    37 /** 
    38  * Get error message for the specified error code. 
    39  * 
    40  * @param status    The error code. 
    41  * @param buffer    The buffer where to put the error message. 
    42  * @param bufsize   Size of the buffer. 
    43  * 
    44  * @return          The error message as NULL terminated string, 
    45  *                  wrapped with pj_str_t. 
    46  */ 
    47 PJ_DECL(pj_str_t) pjsip_strerror( pj_status_t status, char *buffer, 
    48                                   pj_size_t bufsize); 
    4931 
    5032/** 
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r160 r162  
    2424#include <pjmedia/sdp.h> 
    2525#include <pjmedia/sdp_neg.h> 
     26#include <pjmedia/errno.h> 
    2627#include <pj/string.h> 
    2728#include <pj/pool.h> 
     
    761762                                                      &inv->neg); 
    762763    } else { 
    763         pj_assert(!"UAS dialog without remote and local offer is not supported!"); 
    764         PJ_TODO(IMPLEMENT_DELAYED_UAS_OFFER); 
    765         status = PJ_ENOTSUP; 
     764        status = PJ_SUCCESS; 
    766765    } 
    767766 
     
    874873} 
    875874 
     875 
     876/* 
     877 * Negotiate SDP. 
     878 */ 
     879static pj_status_t inv_negotiate_sdp( pjsip_inv_session *inv ) 
     880{ 
     881    pj_status_t status; 
     882 
     883    PJ_ASSERT_RETURN(pjmedia_sdp_neg_get_state(inv->neg) == 
     884                     PJMEDIA_SDP_NEG_STATE_WAIT_NEGO,  
     885                     PJMEDIA_SDPNEG_EINSTATE); 
     886 
     887    status = pjmedia_sdp_neg_negotiate(inv->pool, inv->neg, 0); 
     888 
     889    if (mod_inv.cb.on_media_update) 
     890        (*mod_inv.cb.on_media_update)(inv, status); 
     891 
     892    return status; 
     893} 
    876894 
    877895/* 
     
    899917     * offer before.  
    900918     */ 
    901     PJ_ASSERT_RETURN(!local_sdp || 
    902                      (pjmedia_sdp_neg_get_state(inv->neg)==PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER), 
    903                      PJ_EINVALIDOP); 
    904919    if (local_sdp) { 
    905         status = pjmedia_sdp_neg_set_local_answer(inv->pool, inv->neg, 
    906                                                   local_sdp); 
     920 
     921        if (inv->neg == NULL) { 
     922            status = pjmedia_sdp_neg_create_w_local_offer(inv->pool, local_sdp, 
     923                                                          &inv->neg); 
     924        } else if (pjmedia_sdp_neg_get_state(inv->neg)== 
     925                   PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER) 
     926        { 
     927            status = pjmedia_sdp_neg_set_local_answer(inv->pool, inv->neg, 
     928                                                      local_sdp); 
     929        } else { 
     930 
     931            /* Can not specify local SDP at this state. */ 
     932            pj_assert(0); 
     933            status = PJMEDIA_SDPNEG_EINSTATE; 
     934        } 
     935 
    907936        if (status != PJ_SUCCESS) 
    908937            return status; 
     
    916945        return status; 
    917946 
    918     /* Include SDP for 18x and 2xx response. */ 
     947    /* Include SDP for 18x and 2xx response.  
     948     * Also if SDP negotiator is ready, start negotiation. 
     949     */ 
    919950    if (st_code/10 == 18 || st_code/10 == 20) { 
    920951        const pjmedia_sdp_session *local; 
     
    923954        if (status == PJ_SUCCESS) 
    924955            last_res->msg->body = create_sdp_body(last_res->pool, local); 
    925                                               ; 
    926     } 
    927  
    928     /* Do we need to increment tdata'inv reference counter? */ 
    929     PJ_TODO(INV_ANSWER_MAY_HAVE_TO_INCREMENT_REF_COUNTER); 
     956 
     957        /* Start negotiation, if ready. */ 
     958        if (pjmedia_sdp_neg_get_state(inv->neg) == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO) { 
     959            status = inv_negotiate_sdp(inv); 
     960            if (status != PJ_SUCCESS) { 
     961                pjsip_tx_data_dec_ref(last_res); 
     962                return status; 
     963            } 
     964        } 
     965    } 
     966 
    930967 
    931968    *p_tdata = last_res; 
  • pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c

    r145 r162  
    107107extern pjsip_module mod_stateful_util; 
    108108 
     109 
     110/* Specifies whether error subsystem has been registered to pjlib. */ 
     111static int error_subsys_initialized; 
     112 
     113/** 
     114 * Defined in sip_errno.c 
     115 * 
     116 * Get error message for the specified error code. This can only get 
     117 * PJSIP specific error message. To get all types of error message, 
     118 * use pj_strerror() instead. 
     119 * 
     120 * @param status    The error code. 
     121 * @param buffer    The buffer where to put the error message. 
     122 * @param bufsize   Size of the buffer. 
     123 * 
     124 * @return          The error message as NULL terminated string, 
     125 *                  wrapped with pj_str_t. 
     126 */ 
     127PJ_DECL(pj_str_t) pjsip_strerror( pj_status_t status, char *buffer, 
     128                                  pj_size_t bufsize); 
     129 
     130 
    109131/* 
    110132 * This is the global handler for memory allocation failure, for pools that 
     
    394416    pjsip_max_fwd_hdr *mf_hdr; 
    395417    pj_lock_t *lock = NULL; 
     418 
     419 
     420    if (!error_subsys_initialized) { 
     421        pj_register_strerror(PJSIP_ERRNO_START, PJ_ERRNO_SPACE_SIZE, 
     422                             &pjsip_strerror); 
     423        error_subsys_initialized = 1; 
     424    } 
    396425 
    397426    PJ_LOG(5, (THIS_FILE, "Creating endpoint instance...")); 
  • pjproject/trunk/pjsip/src/pjsip/sip_resolve.c

    r109 r162  
    130130 
    131131    if (status != PJ_SUCCESS) { 
    132         char errmsg[PJSIP_ERR_MSG_SIZE]; 
     132        char errmsg[PJ_ERR_MSG_SIZE]; 
    133133        PJ_LOG(4,(THIS_FILE, "Failed to resolve '%.*s'. Err=%d (%s)", 
    134134                             target->addr.host.slen, 
    135135                             target->addr.host.ptr, 
    136136                             status, 
    137                              pjsip_strerror(status,errmsg,sizeof(errmsg)).ptr)); 
     137                             pj_strerror(status,errmsg,sizeof(errmsg)).ptr)); 
    138138        (*cb)(status, token, &svr_addr); 
    139139        return; 
  • pjproject/trunk/pjsip/src/pjsip/sip_transaction.c

    r160 r162  
    14431443 
    14441444        if (!*cont) { 
    1445             char errmsg[PJSIP_ERR_MSG_SIZE]; 
     1445            char errmsg[PJ_ERR_MSG_SIZE]; 
    14461446 
    14471447            PJ_LOG(4,(tsx->obj_name,  
    14481448                      "Failed to send %s! err=%d (%s)", 
    14491449                      pjsip_tx_data_get_info(send_state->tdata), -sent, 
    1450                       pjsip_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
     1450                      pj_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
    14511451 
    14521452            /* Clear pending transport flag. */ 
     
    14661466 
    14671467        } else { 
    1468             char errmsg[PJSIP_ERR_MSG_SIZE]; 
     1468            char errmsg[PJ_ERR_MSG_SIZE]; 
    14691469 
    14701470            PJ_LOG(4,(tsx->obj_name,  
     
    14721472                      "will try next server. Err=%d (%s)", 
    14731473                      pjsip_tx_data_get_info(send_state->tdata), -sent, 
    1474                       pjsip_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
     1474                      pj_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
    14751475        } 
    14761476    } 
     
    14871487        pjsip_transaction *tsx = token; 
    14881488        struct tsx_lock_data lck; 
    1489         char errmsg[PJSIP_ERR_MSG_SIZE]; 
     1489        char errmsg[PJ_ERR_MSG_SIZE]; 
    14901490 
    14911491        PJ_LOG(4,(tsx->obj_name, "Transport failed to send %s! Err=%d (%s)", 
    14921492                  pjsip_tx_data_get_info(tdata), -sent, 
    1493                   pjsip_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
     1493                  pj_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
    14941494 
    14951495        lock_tsx(tsx, &lck); 
     
    15351535 
    15361536        if (status != PJ_SUCCESS) { 
    1537             char errmsg[PJSIP_ERR_MSG_SIZE]; 
     1537            char errmsg[PJ_ERR_MSG_SIZE]; 
    15381538 
    15391539            PJ_LOG(4,(tsx->obj_name,  
    15401540                      "Error sending %s: Err=%d (%s)", 
    15411541                      pjsip_tx_data_get_info(tdata), status,  
    1542                       pjsip_strerror(status, errmsg, sizeof(errmsg)).ptr)); 
     1542                      pj_strerror(status, errmsg, sizeof(errmsg)).ptr)); 
    15431543 
    15441544            /* On error, release transport to force using full transport 
     
    15691569    if (tsx->transport_flag & TSX_HAS_RESOLVED_SERVER) { 
    15701570         
    1571         char errmsg[PJSIP_ERR_MSG_SIZE]; 
     1571        char errmsg[PJ_ERR_MSG_SIZE]; 
    15721572 
    15731573        if (status == PJ_SUCCESS) { 
     
    15831583                  "Err=%d (%s)", 
    15841584                  status,  
    1585                   pjsip_strerror(status, errmsg, sizeof(errmsg)).ptr)); 
     1585                  pj_strerror(status, errmsg, sizeof(errmsg)).ptr)); 
    15861586 
    15871587        tsx->status_code = PJSIP_SC_TSX_TRANSPORT_ERROR; 
  • pjproject/trunk/pjsip/src/pjsua/pjsua.h

    r147 r162  
    3939 
    4040/* PJSUA application variables. */ 
    41 struct pjsua_t 
     41struct pjsua 
    4242{ 
    4343    /* Control: */ 
    4444 
    45     pj_caching_pool   cp;           /**< Global pool factory.           */ 
    46     pjsip_endpoint   *endpt;        /**< Global endpoint.               */ 
    47     pj_pool_t        *pool;         /**< pjsua's private pool.          */ 
    48     pjsip_module      mod;          /**< pjsua's PJSIP module.          */ 
     45    pj_caching_pool  cp;            /**< Global pool factory.           */ 
     46    pjsip_endpoint  *endpt;         /**< Global endpoint.               */ 
     47    pj_pool_t       *pool;          /**< pjsua's private pool.          */ 
     48    pjsip_module     mod;           /**< pjsua's PJSIP module.          */ 
    4949     
     50 
     51    /* Media:  */ 
     52 
     53    pjmedia_endpt   *med_endpt;    /**< Media endpoint.         */ 
     54    pj_bool_t        null_audio; 
     55    pjmedia_sock_info med_skinfo; 
    5056 
    5157    /* User info: */ 
     
    5864    pj_str_t         proxy; 
    5965    pj_str_t         outbound_proxy; 
     66    pjsip_route_hdr  route_set; 
     67 
    6068 
    6169    /* Registration: */ 
     
    8492    pj_sock_t        sip_sock;      /**< SIP UDP socket.                */ 
    8593    pj_sockaddr_in   sip_sock_name; /**< Public/STUN UDP socket addr.   */ 
    86     pj_sock_t        rtp_sock;      /**< RTP socket.                    */ 
    87     pj_sockaddr_in   rtp_sock_name; /**< Public/STUN UDP socket addr.   */ 
    88     pj_sock_t        rtcp_sock;     /**< RTCP socket.                   */ 
    89     pj_sockaddr_in   rtcp_sock_name;/**< Public/STUN UDP socket addr.   */ 
    9094 
    9195 
     
    97101    pj_str_t         stun_srv2; 
    98102    int              stun_port2; 
    99  
    100  
    101     /* Media stack: */ 
    102  
    103     pj_bool_t        null_audio; 
    104     pj_med_mgr_t    *mmgr; 
    105103 
    106104 
     
    114112}; 
    115113 
    116 extern struct pjsua_t pjsua; 
     114 
     115/** PJSUA instance. */ 
     116extern struct pjsua pjsua; 
     117 
     118 
     119/**  
     120 * Structure to be attached to all dialog.  
     121 * Given a dialog "dlg", application can retrieve this structure 
     122 * by accessing dlg->mod_data[pjsua.mod.id]. 
     123 */ 
     124struct pjsua_inv_data 
     125{ 
     126    pjmedia_session *session; 
     127}; 
     128 
    117129 
    118130/***************************************************************************** 
  • pjproject/trunk/pjsip/src/pjsua/pjsua_core.c

    r160 r162  
    2222#define THIS_FILE   "pjsua.c" 
    2323 
    24 struct pjsua_t pjsua; 
    25  
     24struct pjsua pjsua; 
     25 
     26/*  
     27 * Default local URI, if not specified in cmd-line  
     28 */ 
    2629#define PJSUA_LOCAL_URI     "<sip:user@127.0.0.1>" 
    2730 
    28 static char *PJSUA_DUMMY_SDP_OFFER =  
    29             "v=0\r\n" 
    30             "o=offer 2890844526 2890844526 IN IP4 127.0.0.1\r\n" 
    31             "s= \r\n" 
    32             "c=IN IP4 127.0.0.1\r\n" 
    33             "t=0 0\r\n" 
    34             "m=audio 49170 RTP/AVP 0\r\n" 
    35             "a=rtpmap:0 PCMU/8000\r\n"; 
    36  
    37 static char *PJSUA_DUMMY_SDP_ANSWER =  
    38             "v=0\r\n" 
    39             "o=answer 2890844730 2890844730 IN IP4 127.0.0.1\r\n" 
    40             "s= \r\n" 
    41             "c=IN IP4 127.0.0.1\r\n" 
    42             "t=0 0\r\n" 
    43             "m=audio 49920 RTP/AVP 0\r\n" 
    44             "a=rtpmap:0 PCMU/8000\r\n"; 
     31 
    4532 
    4633/* 
     
    7562 
    7663    pjsua.local_uri = pj_str(PJSUA_LOCAL_URI); 
     64 
     65    /* Init route set list: */ 
     66 
     67    pj_list_init(&pjsua.route_set); 
    7768} 
    7869 
     
    144135             */ 
    145136            pjsip_inv_session *inv; 
     137            struct pjsua_inv_data *inv_data; 
    146138            pjmedia_sdp_session *answer; 
    147139 
    148             /* Create dummy SDP answer: */ 
    149  
    150  
    151             status = pjmedia_sdp_parse(pjsua.pool, PJSUA_DUMMY_SDP_ANSWER, 
    152                                        pj_native_strlen(PJSUA_DUMMY_SDP_ANSWER), 
    153                                        &answer); 
     140 
     141            /* Get media capability from media endpoint: */ 
     142 
     143            status = pjmedia_endpt_create_sdp( pjsua.med_endpt, rdata->tp_info.pool, 
     144                                               1, &pjsua.med_skinfo, &answer ); 
    154145            if (status != PJ_SUCCESS) { 
    155146 
     
    181172 
    182173            } 
     174 
     175 
     176            /* Create and attach pjsua data to the dialog: */ 
     177 
     178            inv_data = pj_pool_zalloc(dlg->pool, sizeof(struct pjsua_inv_data)); 
     179            dlg->mod_data[pjsua.mod.id] = inv_data; 
     180 
    183181 
    184182            /* Answer with 100 (using the dialog, not invite): */ 
     
    223221static void pjsua_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e) 
    224222{ 
     223 
     224    /* Destroy media session when invite session is disconnected. */ 
     225    if (inv->state == PJSIP_INV_STATE_DISCONNECTED) { 
     226        struct pjsua_inv_data *inv_data; 
     227 
     228        inv_data = inv->dlg->mod_data[pjsua.mod.id]; 
     229        if (inv_data && inv_data->session) { 
     230            pjmedia_session_destroy(inv_data->session); 
     231            inv_data->session = NULL; 
     232        } 
     233 
     234    } 
     235 
    225236    pjsua_ui_inv_on_state_changed(inv, e); 
    226237} 
     
    237248 
    238249    PJ_TODO(HANDLE_FORKED_DIALOG); 
     250} 
     251 
     252/* 
     253 * 
     254 */ 
     255static void pjsua_inv_on_media_update(pjsip_inv_session *inv,  
     256                                      pj_status_t status) 
     257{ 
     258    struct pjsua_inv_data *inv_data; 
     259    const pjmedia_sdp_session *local_sdp; 
     260    const pjmedia_sdp_session *remote_sdp; 
     261 
     262    if (status != PJ_SUCCESS) { 
     263 
     264        pjsua_perror("SDP negotiation has failed", status); 
     265        return; 
     266 
     267    } 
     268 
     269    /* Destroy existing media session, if any. */ 
     270 
     271    inv_data = inv->dlg->mod_data[pjsua.mod.id]; 
     272    if (inv_data && inv_data->session) { 
     273        pjmedia_session_destroy(inv_data->session); 
     274        inv_data->session = NULL; 
     275    } 
     276 
     277    /* Get local and remote SDP */ 
     278 
     279    status = pjmedia_sdp_neg_get_active_local(inv->neg, &local_sdp); 
     280    if (status != PJ_SUCCESS) { 
     281        pjsua_perror("Unable to retrieve currently active local SDP", status); 
     282        return; 
     283    } 
     284 
     285 
     286    status = pjmedia_sdp_neg_get_active_remote(inv->neg, &remote_sdp); 
     287    if (status != PJ_SUCCESS) { 
     288        pjsua_perror("Unable to retrieve currently active remote SDP", status); 
     289        return; 
     290    } 
     291 
     292 
     293    /* Create new media session.  
     294     * The media session is active immediately. 
     295     */ 
     296 
     297    status = pjmedia_session_create( pjsua.med_endpt, 1, &pjsua.med_skinfo, 
     298                                     local_sdp, remote_sdp, &inv_data->session ); 
     299    if (status != PJ_SUCCESS) { 
     300        pjsua_perror("Unable to create media session", status); 
     301        return; 
     302    } 
     303 
    239304} 
    240305 
     
    364429    pjsua.sip_sock = sock[SIP_SOCK]; 
    365430    pj_memcpy(&pjsua.sip_sock_name, &mapped_addr[SIP_SOCK], sizeof(pj_sockaddr_in)); 
    366     pjsua.rtp_sock = sock[RTP_SOCK]; 
    367     pj_memcpy(&pjsua.rtp_sock_name, &mapped_addr[RTP_SOCK], sizeof(pj_sockaddr_in)); 
    368     pjsua.rtcp_sock = sock[RTCP_SOCK]; 
    369     pj_memcpy(&pjsua.rtcp_sock_name, &mapped_addr[RTCP_SOCK], sizeof(pj_sockaddr_in)); 
     431 
     432    pjsua.med_skinfo.rtp_sock = sock[RTP_SOCK]; 
     433    pj_memcpy(&pjsua.med_skinfo.rtp_addr_name,  
     434              &mapped_addr[RTP_SOCK], sizeof(pj_sockaddr_in)); 
     435 
     436    pjsua.med_skinfo.rtcp_sock = sock[RTCP_SOCK]; 
     437    pj_memcpy(&pjsua.med_skinfo.rtcp_addr_name,  
     438              &mapped_addr[RTCP_SOCK], sizeof(pj_sockaddr_in)); 
    370439 
    371440    PJ_LOG(4,(THIS_FILE, "SIP UDP socket reachable at %s:%d", 
     
    373442              pj_ntohs(pjsua.sip_sock_name.sin_port))); 
    374443    PJ_LOG(4,(THIS_FILE, "RTP socket reachable at %s:%d", 
    375               pj_inet_ntoa(pjsua.rtp_sock_name.sin_addr),  
    376               pj_ntohs(pjsua.rtp_sock_name.sin_port))); 
     444              pj_inet_ntoa(pjsua.med_skinfo.rtp_addr_name.sin_addr),  
     445              pj_ntohs(pjsua.med_skinfo.rtp_addr_name.sin_port))); 
    377446    PJ_LOG(4,(THIS_FILE, "RTCP UDP socket reachable at %s:%d", 
    378               pj_inet_ntoa(pjsua.rtcp_sock_name.sin_addr),  
    379               pj_ntohs(pjsua.rtcp_sock_name.sin_port))); 
     447              pj_inet_ntoa(pjsua.med_skinfo.rtcp_addr_name.sin_addr),  
     448              pj_ntohs(pjsua.med_skinfo.rtcp_addr_name.sin_port))); 
    380449 
    381450    return PJ_SUCCESS; 
     
    479548        inv_cb.on_state_changed = &pjsua_inv_on_state_changed; 
    480549        inv_cb.on_new_session = &pjsua_inv_on_new_session; 
     550        inv_cb.on_media_update = &pjsua_inv_on_media_update; 
    481551 
    482552        /* Initialize invite session module: */ 
     
    552622        pj_caching_pool_destroy(&pjsua.cp); 
    553623        pjsua_perror("Stack initialization has returned error", status); 
     624        return status; 
     625    } 
     626 
     627 
     628    /* Init media endpoint: */ 
     629 
     630    status = pjmedia_endpt_create(&pjsua.cp.factory, &pjsua.med_endpt); 
     631    if (status != PJ_SUCCESS) { 
     632        pj_caching_pool_destroy(&pjsua.cp); 
     633        pjsua_perror("Media stack initialization has returned error", status); 
    554634        return status; 
    555635    } 
     
    677757    } 
    678758 
    679     /* Initialize global route_set: */ 
    680  
    681     PJ_TODO(INIT_GLOBAL_ROUTE_SET); 
     759    /* If outbound_proxy is specified, put it in the route_set: */ 
     760 
     761    if (pjsua.outbound_proxy.slen) { 
     762 
     763        pjsip_route_hdr *route; 
     764        const pj_str_t hname = { "Route", 5 }; 
     765        int parsed_len; 
     766 
     767        route = pjsip_parse_hdr( pjsua.pool, &hname,  
     768                                 pjsua.outbound_proxy.ptr,  
     769                                 pjsua.outbound_proxy.slen, 
     770                                   &parsed_len); 
     771        if (route == NULL) { 
     772            pjsua_perror("Invalid outbound proxy URL", PJSIP_EINVALIDURI); 
     773            return PJSIP_EINVALIDURI; 
     774        } 
     775 
     776        pj_list_push_back(&pjsua.route_set, route); 
     777    } 
    682778 
    683779 
     
    770866    pjmedia_sdp_session *offer; 
    771867    pjsip_inv_session *inv; 
     868    struct pjsua_inv_data *inv_data; 
    772869    pjsip_tx_data *tdata; 
    773870    pj_status_t status; 
     
    787884    } 
    788885 
    789     /* Create dummy SDP for offer: */ 
    790  
    791     status = pjmedia_sdp_parse(dlg->pool, PJSUA_DUMMY_SDP_OFFER, 
    792                                pj_native_strlen(PJSUA_DUMMY_SDP_OFFER), 
    793                                &offer); 
    794     if (status != PJ_SUCCESS) { 
    795         pjsua_perror("Dummy SDP offer parsing failed", status); 
     886    /* Get media capability from media endpoint: */ 
     887 
     888    status = pjmedia_endpt_create_sdp( pjsua.med_endpt, dlg->pool, 
     889                                       1, &pjsua.med_skinfo, &offer); 
     890    if (status != PJ_SUCCESS) { 
     891        pjsua_perror("pjmedia unable to create SDP", status); 
    796892        goto on_error; 
    797893    } 
     
    806902 
    807903 
     904    /* Create and associate our data in the session. */ 
     905 
     906    inv_data = pj_pool_zalloc( dlg->pool, sizeof(struct pjsua_inv_data)); 
     907    dlg->mod_data[pjsua.mod.id] = inv_data; 
     908 
     909 
    808910    /* Set dialog Route-Set: */ 
    809911 
    810     PJ_TODO(INIT_DIALOG_ROUTE_SET); 
     912    if (!pj_list_empty(&pjsua.route_set)) 
     913        pjsip_dlg_set_route_set(dlg, &pjsua.route_set); 
     914 
    811915 
    812916    /* Set credentials: */ 
Note: See TracChangeset for help on using the changeset viewer.