From a1fd7f6ddafccef9cf47bb8c291749aaa835e7fa Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 9 Feb 2006 14:01:40 +0000 Subject: Updated with new jitter buffer, and statistics in pjsua git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@169 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsua/main.c | 150 +++++++++++++++++++++++++++++++++++++++---- pjsip/src/pjsua/pjsua.h | 29 ++++++--- pjsip/src/pjsua/pjsua_core.c | 4 ++ pjsip/src/pjsua/pjsua_inv.c | 16 +++++ 4 files changed, 176 insertions(+), 23 deletions(-) (limited to 'pjsip/src/pjsua') diff --git a/pjsip/src/pjsua/main.c b/pjsip/src/pjsua/main.c index 287f5624..6b85bfaf 100644 --- a/pjsip/src/pjsua/main.c +++ b/pjsip/src/pjsua/main.c @@ -25,26 +25,27 @@ static pjsip_inv_session *inv_session; +static const char *inv_state_names[] = +{ + "NULL ", + "CALLING ", + "INCOMING ", + "EARLY ", + "CONNECTING", + "CONFIRMED ", + "DISCONNCTD", + "TERMINATED", +}; + /* * Notify UI when invite state has changed. */ void pjsua_ui_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e) { - const char *state_names[] = - { - "NULL", - "CALLING", - "INCOMING", - "EARLY", - "CONNECTING", - "CONFIRMED", - "DISCONNECTED", - "TERMINATED", - }; - PJ_UNUSED_ARG(e); - PJ_LOG(3,(THIS_FILE, "INVITE session state changed to %s", state_names[inv->state])); + PJ_LOG(3,(THIS_FILE, "INVITE session state changed to %s", + inv_state_names[inv->state])); if (inv->state == PJSIP_INV_STATE_DISCONNECTED) { if (inv == inv_session) @@ -57,11 +58,130 @@ void pjsua_ui_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e) } } + +static void print_invite_session(const char *title, + struct pjsua_inv_data *inv_data, + char *buf, pj_size_t size) +{ + int len; + pjsip_inv_session *inv = inv_data->inv; + pjsip_dialog *dlg = inv->dlg; + char userinfo[128]; + + /* Dump invite sesion info. */ + + len = pjsip_hdr_print_on(dlg->remote.info, userinfo, sizeof(userinfo)); + if (len < 1) + pj_native_strcpy(userinfo, "<--uri too long-->"); + else + userinfo[len] = '\0'; + + len = pj_snprintf(buf, size, "%s[%s] %s", + title, + inv_state_names[inv->state], + userinfo); + if (len < 1 || len >= (int)size) { + pj_native_strcpy(buf, "<--uri too long-->"); + len = 18; + } else + buf[len] = '\0'; +} + +static void dump_media_session(pjmedia_session *session) +{ + unsigned i; + pjmedia_session_info info; + + pjmedia_session_get_info(session, &info); + + for (i=0; isession) + dump_media_session(inv_data->session); + + inv_data = inv_data->next; + } + } + + pj_log_set_decor(log_decor); +} + + +/* + * Show a bit of help. + */ static void ui_help(void) { puts(""); puts("Console keys:"); puts(" m Make a call/another call"); + puts(" d Dump application states"); puts(" a Answer incoming call"); puts(" h Hangup current call"); puts(" q Quit"); @@ -122,6 +242,10 @@ static void ui_console_main(void) break; + case 'd': + pjsua_dump(); + break; + case 'a': if (inv_session == NULL || inv_session->role != PJSIP_ROLE_UAS || diff --git a/pjsip/src/pjsua/pjsua.h b/pjsip/src/pjsua/pjsua.h index 810c57b5..f882e873 100644 --- a/pjsip/src/pjsua/pjsua.h +++ b/pjsip/src/pjsua/pjsua.h @@ -37,6 +37,22 @@ PJ_BEGIN_DECL + +/** + * Structure to be attached to all dialog. + * Given a dialog "dlg", application can retrieve this structure + * by accessing dlg->mod_data[pjsua.mod.id]. + */ +struct pjsua_inv_data +{ + PJ_DECL_LIST_MEMBER(struct pjsua_inv_data); + + pjsip_inv_session *inv; + pjmedia_session *session; +}; + + + /* PJSUA application variables. */ struct pjsua { @@ -109,6 +125,9 @@ struct pjsua unsigned log_decor; /**< Log decoration. */ char *log_filename; /**< Log filename. */ + /* List of invite sessions: */ + + struct pjsua_inv_data inv_list; }; @@ -116,16 +135,6 @@ struct pjsua extern struct pjsua pjsua; -/** - * Structure to be attached to all dialog. - * Given a dialog "dlg", application can retrieve this structure - * by accessing dlg->mod_data[pjsua.mod.id]. - */ -struct pjsua_inv_data -{ - pjmedia_session *session; -}; - /***************************************************************************** * PJSUA API (defined in pjsua_core.c). diff --git a/pjsip/src/pjsua/pjsua_core.c b/pjsip/src/pjsua/pjsua_core.c index cc9ae86f..7eb414bc 100644 --- a/pjsip/src/pjsua/pjsua_core.c +++ b/pjsip/src/pjsua/pjsua_core.c @@ -75,6 +75,10 @@ void pjsua_default(void) /* Init route set list: */ pj_list_init(&pjsua.route_set); + + /* Init invite session list: */ + + pj_list_init(&pjsua.inv_list); } diff --git a/pjsip/src/pjsua/pjsua_inv.c b/pjsip/src/pjsua/pjsua_inv.c index 72272c32..7c6dbf26 100644 --- a/pjsip/src/pjsua/pjsua_inv.c +++ b/pjsip/src/pjsua/pjsua_inv.c @@ -78,6 +78,7 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, /* Create and associate our data in the session. */ inv_data = pj_pool_zalloc( dlg->pool, sizeof(struct pjsua_inv_data)); + inv_data->inv = inv; dlg->mod_data[pjsua.mod.id] = inv_data; @@ -110,6 +111,10 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, goto on_error; } + /* Add invite session to the list. */ + + pj_list_push_back(&pjsua.inv_list, inv_data); + /* Done. */ @@ -214,8 +219,11 @@ pj_bool_t pjsua_inv_on_incoming(pjsip_rx_data *rdata) /* Create and attach pjsua data to the dialog: */ inv_data = pj_pool_zalloc(dlg->pool, sizeof(struct pjsua_inv_data)); + inv_data->inv = inv; dlg->mod_data[pjsua.mod.id] = inv_data; + pj_list_push_back(&pjsua.inv_list, inv_data); + /* Answer with 100 (using the dialog, not invite): */ @@ -244,6 +252,9 @@ void pjsua_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e) struct pjsua_inv_data *inv_data; inv_data = inv->dlg->mod_data[pjsua.mod.id]; + + pj_assert(inv_data != NULL); + if (inv_data && inv_data->session) { pjmedia_session_destroy(inv_data->session); inv_data->session = NULL; @@ -251,6 +262,11 @@ void pjsua_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e) PJ_LOG(3,(THIS_FILE,"Media session is destroyed")); } + if (inv_data) { + + pj_list_erase(inv_data); + + } } pjsua_ui_inv_on_state_changed(inv, e); -- cgit v1.2.3