Fixed issues when adding new media and deinitializing media (#3821)

This commit is contained in:
sauwming 2024-01-12 15:26:29 +08:00 committed by GitHub
parent 19c018affd
commit f2055ef7a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 25 deletions

View File

@ -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_bool_t pjsua_call_media_is_changing(pjsua_call *call);
pj_status_t pjsua_call_media_init(pjsua_call_media *call_med, pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjmedia_type type, pjmedia_type type,
const pjmedia_sdp_session *rem_sdp,
const pjsua_transport_config *tcfg, const pjsua_transport_config *tcfg,
int security_level, int security_level,
int *sip_err_code, int *sip_err_code,

View File

@ -1929,14 +1929,14 @@ PJ_DEF(pj_status_t) pjsua_destroy2(unsigned flags)
/* Terminate all calls. */ /* Terminate all calls. */
if ((flags & PJSUA_DESTROY_NO_TX_MSG) == 0) { if ((flags & PJSUA_DESTROY_NO_TX_MSG) == 0) {
pjsua_call_hangup_all(); pjsua_call_hangup_all();
} } else {
/* Deinit media channel of all calls (see #1717) */
/* Deinit media channel of all calls (see #1717) */ for (i=0; i<(int)pjsua_var.ua_cfg.max_calls; ++i) {
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
/* TODO: check if we're not allowed to send to network in the * "flags", and if so do not do TURN allocation...
* "flags", and if so do not do TURN allocation... */
*/ pjsua_media_channel_deinit(i);
pjsua_media_channel_deinit(i); }
} }
/* Set all accounts to offline */ /* Set all accounts to offline */

View File

@ -246,9 +246,9 @@ pj_status_t pjsua_media_subsys_destroy(unsigned flags)
return PJ_SUCCESS; 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; pjsua_ipv6_use ipv6_use;
ipv6_use = pjsua_var.acc[call_med->call->acc_id].cfg.ipv6_media_use; ipv6_use = pjsua_var.acc[call_med->call->acc_id].cfg.ipv6_media_use;
@ -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, static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
const pjsua_transport_config *cfg, const pjsua_transport_config *cfg,
pjmedia_sock_info *skinfo) pjmedia_sock_info *skinfo,
const pjmedia_sdp_session *rem_sdp)
{ {
enum { enum {
RTP_RETRY = 100 RTP_RETRY = 100
@ -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]; pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id];
pj_sock_t sock[2]; 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); use_nat64 = (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED);
af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET(); af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET();
@ -705,12 +706,13 @@ on_error:
/* Create normal UDP media transports */ /* Create normal UDP media transports */
static pj_status_t create_udp_media_transport(const pjsua_transport_config *cfg, 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; pjmedia_sock_info skinfo;
pj_status_t status; 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) { if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Unable to create RTP/RTCP socket", pjsua_perror(THIS_FILE, "Unable to create RTP/RTCP socket",
status); status);
@ -745,7 +747,8 @@ on_error:
/* Create loop media transport */ /* Create loop media transport */
static pj_status_t create_loop_media_transport( static pj_status_t create_loop_media_transport(
const pjsua_transport_config *cfg, 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; pj_status_t status;
pjmedia_loop_tp_setting opt; pjmedia_loop_tp_setting opt;
@ -753,7 +756,7 @@ static pj_status_t create_loop_media_transport(
int af; int af;
pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id]; 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); use_nat64 = (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED);
af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET(); af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET();
@ -996,6 +999,7 @@ static void on_ice_complete(pjmedia_transport *tp,
static pj_status_t create_ice_media_transport( static pj_status_t create_ice_media_transport(
const pjsua_transport_config *cfg, const pjsua_transport_config *cfg,
pjsua_call_media *call_med, pjsua_call_media *call_med,
const pjmedia_sdp_session *remote_sdp,
pj_bool_t async) pj_bool_t async)
{ {
char stunip[PJ_INET6_ADDRSTRLEN]; char stunip[PJ_INET6_ADDRSTRLEN];
@ -1010,7 +1014,7 @@ static pj_status_t create_ice_media_transport(
pjmedia_sdp_session *rem_sdp; pjmedia_sdp_session *rem_sdp;
acc_cfg = &pjsua_var.acc[call_med->call->acc_id].cfg; 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); use_nat64 = (acc_cfg->nat64_opt != PJSUA_NAT64_DISABLED);
/* Make sure STUN server resolution has completed */ /* Make sure STUN server resolution has completed */
@ -1984,6 +1988,7 @@ pj_bool_t pjsua_call_media_is_changing(pjsua_call *call)
/* Initialize the media line */ /* Initialize the media line */
pj_status_t pjsua_call_media_init(pjsua_call_media *call_med, pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjmedia_type type, pjmedia_type type,
const pjmedia_sdp_session *rem_sdp,
const pjsua_transport_config *tcfg, const pjsua_transport_config *tcfg,
int security_level, int security_level,
int *sip_err_code, int *sip_err_code,
@ -2027,9 +2032,10 @@ pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjsua_set_media_tp_state(call_med, PJSUA_MED_TP_CREATING); pjsua_set_media_tp_state(call_med, PJSUA_MED_TP_CREATING);
if (acc->cfg.use_loop_med_tp) { 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) { } 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) { if (async && status == PJ_EPENDING) {
/* We will resume call media initialization in the /* We will resume call media initialization in the
* on_ice_complete() callback. * on_ice_complete() callback.
@ -2040,7 +2046,7 @@ pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
return PJ_EPENDING; return PJ_EPENDING;
} }
} else { } else {
status = create_udp_media_transport(tcfg, call_med); status = create_udp_media_transport(tcfg, call_med, rem_sdp);
} }
if (status != PJ_SUCCESS) { if (status != PJ_SUCCESS) {
@ -2516,15 +2522,17 @@ pj_status_t pjsua_media_channel_init(pjsua_call_id call_id,
PJ_LOG(4,(THIS_FILE, "Call %d: setting media direction " PJ_LOG(4,(THIS_FILE, "Call %d: setting media direction "
"#%d to %d.", call_id, mi, "#%d to %d.", call_id, mi,
call_med->def_dir)); call_med->def_dir));
} else if (!reinit) { } else if (!reinit || mi >= call->med_cnt) {
/* Initialize default initial media direction as bidirectional */ /* Initialize default media direction as bidirectional,
* for initial media or newly added media.
*/
call_med->def_dir = PJMEDIA_DIR_ENCODING_DECODING; call_med->def_dir = PJMEDIA_DIR_ENCODING_DECODING;
} }
if (enabled) { if (enabled) {
call_med->enable_rtcp_mux = acc->cfg.enable_rtcp_mux; 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, &acc->cfg.rtp_cfg,
security_level, sip_err_code, security_level, sip_err_code,
async, async,

View File

@ -2088,7 +2088,7 @@ static pj_status_t call_add_video(pjsua_call *call,
/* Initialize call media */ /* Initialize call media */
call_med = &call->media_prov[call->med_prov_cnt++]; 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, &acc_cfg->rtp_cfg, call->secure_level,
NULL, PJ_FALSE, NULL); NULL, PJ_FALSE, NULL);
if (status != PJ_SUCCESS) if (status != PJ_SUCCESS)
@ -2134,6 +2134,7 @@ static pj_status_t call_add_video(pjsua_call *call,
pjmedia_sdp_media_add_attr(sdp_m, a); pjmedia_sdp_media_add_attr(sdp_m, a);
} }
call_med->def_dir = dir;
/* Update SDP media line by media transport */ /* Update SDP media line by media transport */
status = pjmedia_transport_encode_sdp(call_med->tp, pool, status = pjmedia_transport_encode_sdp(call_med->tp, pool,
@ -2237,7 +2238,7 @@ static pj_status_t call_modify_video(pjsua_call *call,
call->opt.vid_cnt++; 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, &acc_cfg->rtp_cfg, call->secure_level,
NULL, PJ_FALSE, NULL); NULL, PJ_FALSE, NULL);
if (status != PJ_SUCCESS) if (status != PJ_SUCCESS)