Skip to content

Commit

Permalink
Fixed issues when adding new media and deinitializing media (pjsip#3821)
Browse files Browse the repository at this point in the history
  • Loading branch information
sauwming authored and dshamaev-intermedia committed Apr 4, 2024
1 parent 84c9d83 commit 3e77b79
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 25 deletions.
1 change: 1 addition & 0 deletions pjsip/include/pjsua-lib/pjsua_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,7 @@ void pjsua_ice_check_start_trickling(pjsua_call *call,
pj_bool_t pjsua_call_media_is_changing(pjsua_call *call);
pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjmedia_type type,
const pjmedia_sdp_session *rem_sdp,
const pjsua_transport_config *tcfg,
int security_level,
int *sip_err_code,
Expand Down
16 changes: 8 additions & 8 deletions pjsip/src/pjsua-lib/pjsua_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1930,14 +1930,14 @@ PJ_DEF(pj_status_t) pjsua_destroy2(unsigned flags)
/* Terminate all calls. */
if ((flags & PJSUA_DESTROY_NO_TX_MSG) == 0) {
pjsua_call_hangup_all();
}

/* Deinit media channel of all calls (see #1717) */
for (i=0; i<(int)pjsua_var.ua_cfg.max_calls; ++i) {
/* TODO: check if we're not allowed to send to network in the
* "flags", and if so do not do TURN allocation...
*/
pjsua_media_channel_deinit(i);
} else {
/* Deinit media channel of all calls (see #1717) */
for (i=0; i<(int)pjsua_var.ua_cfg.max_calls; ++i) {
/* TODO: check if we're not allowed to send to network in the
* "flags", and if so do not do TURN allocation...
*/
pjsua_media_channel_deinit(i);
}
}

/* Set all accounts to offline */
Expand Down
38 changes: 23 additions & 15 deletions pjsip/src/pjsua-lib/pjsua_media.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,9 +246,9 @@ pj_status_t pjsua_media_subsys_destroy(unsigned flags)
return PJ_SUCCESS;
}

static int get_media_ip_version(pjsua_call_media *call_med)
static int get_media_ip_version(pjsua_call_media *call_med,
const pjmedia_sdp_session *rem_sdp)
{
pjmedia_sdp_session *rem_sdp = call_med->call->async_call.rem_sdp;
pjsua_ipv6_use ipv6_use;

ipv6_use = pjsua_var.acc[call_med->call->acc_id].cfg.ipv6_media_use;
Expand Down Expand Up @@ -287,7 +287,8 @@ static int get_media_ip_version(pjsua_call_media *call_med)
*/
static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
const pjsua_transport_config *cfg,
pjmedia_sock_info *skinfo)
pjmedia_sock_info *skinfo,
const pjmedia_sdp_session *rem_sdp)
{
enum {
RTP_RETRY = 100
Expand All @@ -302,7 +303,7 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id];
pj_sock_t sock[2];

use_ipv6 = (get_media_ip_version(call_med) == 6);
use_ipv6 = (get_media_ip_version(call_med, rem_sdp) == 6);
use_nat64 = (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED);
af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET();

Expand Down Expand Up @@ -705,12 +706,13 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,

/* Create normal UDP media transports */
static pj_status_t create_udp_media_transport(const pjsua_transport_config *cfg,
pjsua_call_media *call_med)
pjsua_call_media *call_med,
const pjmedia_sdp_session *rem_sdp)
{
pjmedia_sock_info skinfo;
pj_status_t status;

status = create_rtp_rtcp_sock(call_med, cfg, &skinfo);
status = create_rtp_rtcp_sock(call_med, cfg, &skinfo, rem_sdp);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Unable to create RTP/RTCP socket",
status);
Expand Down Expand Up @@ -745,15 +747,16 @@ static pj_status_t create_udp_media_transport(const pjsua_transport_config *cfg,
/* Create loop media transport */
static pj_status_t create_loop_media_transport(
const pjsua_transport_config *cfg,
pjsua_call_media *call_med)
pjsua_call_media *call_med,
const pjmedia_sdp_session *rem_sdp)
{
pj_status_t status;
pjmedia_loop_tp_setting opt;
pj_bool_t use_ipv6, use_nat64;
int af;
pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id];

use_ipv6 = (get_media_ip_version(call_med) == 6);
use_ipv6 = (get_media_ip_version(call_med, rem_sdp) == 6);
use_nat64 = (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED);
af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET();

Expand Down Expand Up @@ -1022,6 +1025,7 @@ static pj_status_t parse_host_port(const pj_str_t *host_port,
static pj_status_t create_ice_media_transport(
const pjsua_transport_config *cfg,
pjsua_call_media *call_med,
const pjmedia_sdp_session *remote_sdp,
pj_bool_t async)
{
char stunip[PJ_INET6_ADDRSTRLEN];
Expand All @@ -1036,7 +1040,7 @@ static pj_status_t create_ice_media_transport(
pjmedia_sdp_session *rem_sdp;

acc_cfg = &pjsua_var.acc[call_med->call->acc_id].cfg;
use_ipv6 = (get_media_ip_version(call_med) == 6);
use_ipv6 = (get_media_ip_version(call_med, remote_sdp) == 6);
use_nat64 = (acc_cfg->nat64_opt != PJSUA_NAT64_DISABLED);

/* Make sure STUN server resolution has completed */
Expand Down Expand Up @@ -2006,6 +2010,7 @@ pj_bool_t pjsua_call_media_is_changing(pjsua_call *call)
/* Initialize the media line */
pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjmedia_type type,
const pjmedia_sdp_session *rem_sdp,
const pjsua_transport_config *tcfg,
int security_level,
int *sip_err_code,
Expand Down Expand Up @@ -2049,9 +2054,10 @@ pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjsua_set_media_tp_state(call_med, PJSUA_MED_TP_CREATING);

if (acc->cfg.use_loop_med_tp) {
status = create_loop_media_transport(tcfg, call_med);
status = create_loop_media_transport(tcfg, call_med, rem_sdp);
} else if (acc->cfg.ice_cfg.enable_ice) {
status = create_ice_media_transport(tcfg, call_med, async);
status = create_ice_media_transport(tcfg, call_med, rem_sdp,
async);
if (async && status == PJ_EPENDING) {
/* We will resume call media initialization in the
* on_ice_complete() callback.
Expand All @@ -2062,7 +2068,7 @@ pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
return PJ_EPENDING;
}
} else {
status = create_udp_media_transport(tcfg, call_med);
status = create_udp_media_transport(tcfg, call_med, rem_sdp);
}

if (status != PJ_SUCCESS) {
Expand Down Expand Up @@ -2538,15 +2544,17 @@ pj_status_t pjsua_media_channel_init(pjsua_call_id call_id,
PJ_LOG(4,(THIS_FILE, "Call %d: setting media direction "
"#%d to %d.", call_id, mi,
call_med->def_dir));
} else if (!reinit) {
/* Initialize default initial media direction as bidirectional */
} else if (!reinit || mi >= call->med_cnt) {
/* Initialize default media direction as bidirectional,
* for initial media or newly added media.
*/
call_med->def_dir = PJMEDIA_DIR_ENCODING_DECODING;
}

if (enabled) {
call_med->enable_rtcp_mux = acc->cfg.enable_rtcp_mux;

status = pjsua_call_media_init(call_med, media_type,
status = pjsua_call_media_init(call_med, media_type, rem_sdp,
&acc->cfg.rtp_cfg,
security_level, sip_err_code,
async,
Expand Down
5 changes: 3 additions & 2 deletions pjsip/src/pjsua-lib/pjsua_vid.c
Original file line number Diff line number Diff line change
Expand Up @@ -2092,7 +2092,7 @@ static pj_status_t call_add_video(pjsua_call *call,

/* Initialize call media */
call_med = &call->media_prov[call->med_prov_cnt++];
status = pjsua_call_media_init(call_med, PJMEDIA_TYPE_VIDEO,
status = pjsua_call_media_init(call_med, PJMEDIA_TYPE_VIDEO, NULL,
&acc_cfg->rtp_cfg, call->secure_level,
NULL, PJ_FALSE, NULL);
if (status != PJ_SUCCESS)
Expand Down Expand Up @@ -2138,6 +2138,7 @@ static pj_status_t call_add_video(pjsua_call *call,

pjmedia_sdp_media_add_attr(sdp_m, a);
}
call_med->def_dir = dir;

/* Update SDP media line by media transport */
status = pjmedia_transport_encode_sdp(call_med->tp, pool,
Expand Down Expand Up @@ -2241,7 +2242,7 @@ static pj_status_t call_modify_video(pjsua_call *call,
call->opt.vid_cnt++;
}

status = pjsua_call_media_init(call_med, PJMEDIA_TYPE_VIDEO,
status = pjsua_call_media_init(call_med, PJMEDIA_TYPE_VIDEO, NULL,
&acc_cfg->rtp_cfg, call->secure_level,
NULL, PJ_FALSE, NULL);
if (status != PJ_SUCCESS)
Expand Down

0 comments on commit 3e77b79

Please sign in to comment.