📄 pjsua_app.c
字号:
cfg->log_cfg.level = c;
pj_log_set_level( c );
break;
case OPT_APP_LOG_LEVEL:
cfg->log_cfg.console_level = pj_strtoul(pj_cstr(&tmp, pj_optarg));
if (cfg->log_cfg.console_level < 0 || cfg->log_cfg.console_level > 6) {
PJ_LOG(1,(THIS_FILE,
"Error: expecting integer value 0-6 "
"for --app-log-level"));
return PJ_EINVAL;
}
break;
case OPT_HELP:
usage();
return PJ_EINVAL;
case OPT_VERSION: /* version */
pj_dump_config();
return PJ_EINVAL;
case OPT_NULL_AUDIO:
cfg->null_audio = PJ_TRUE;
break;
case OPT_CLOCK_RATE:
lval = pj_strtoul(pj_cstr(&tmp, pj_optarg));
if (lval < 8000 || lval > 48000) {
PJ_LOG(1,(THIS_FILE, "Error: expecting value between "
"8000-48000 for clock rate"));
return PJ_EINVAL;
}
cfg->media_cfg.clock_rate = lval;
break;
case OPT_LOCAL_PORT: /* local-port */
lval = pj_strtoul(pj_cstr(&tmp, pj_optarg));
if (lval < 0 || lval > 65535) {
PJ_LOG(1,(THIS_FILE,
"Error: expecting integer value for "
"--local-port"));
return PJ_EINVAL;
}
cfg->udp_cfg.port = (pj_uint16_t)lval;
break;
case OPT_IP_ADDR: /* ip-addr */
cfg->udp_cfg.public_addr = pj_str(pj_optarg);
cfg->rtp_cfg.public_addr = pj_str(pj_optarg);
break;
case OPT_NO_UDP: /* no-udp */
if (cfg->no_tcp) {
PJ_LOG(1,(THIS_FILE,"Error: can not disable both TCP and UDP"));
return PJ_EINVAL;
}
cfg->no_udp = PJ_TRUE;
break;
case OPT_NOREFERSUB: /* norefersub */
cfg->no_refersub = PJ_TRUE;
break;
case OPT_NO_TCP: /* no-tcp */
if (cfg->no_udp) {
PJ_LOG(1,(THIS_FILE,"Error: can not disable both TCP and UDP"));
return PJ_EINVAL;
}
cfg->no_tcp = PJ_TRUE;
break;
case OPT_PROXY: /* proxy */
if (pjsua_verify_sip_url(pj_optarg) != 0) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid SIP URL '%s' "
"in proxy argument", pj_optarg));
return PJ_EINVAL;
}
cur_acc->proxy[cur_acc->proxy_cnt++] = pj_str(pj_optarg);
break;
case OPT_OUTBOUND_PROXY: /* outbound proxy */
if (pjsua_verify_sip_url(pj_optarg) != 0) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid SIP URL '%s' "
"in outbound proxy argument", pj_optarg));
return PJ_EINVAL;
}
cfg->cfg.outbound_proxy[cfg->cfg.outbound_proxy_cnt++] = pj_str(pj_optarg);
break;
case OPT_REGISTRAR: /* registrar */
if (pjsua_verify_sip_url(pj_optarg) != 0) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid SIP URL '%s' in "
"registrar argument", pj_optarg));
return PJ_EINVAL;
}
cur_acc->reg_uri = pj_str(pj_optarg);
break;
case OPT_REG_TIMEOUT: /* reg-timeout */
cur_acc->reg_timeout = pj_strtoul(pj_cstr(&tmp,pj_optarg));
if (cur_acc->reg_timeout < 1 || cur_acc->reg_timeout > 3600) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid value for --reg-timeout "
"(expecting 1-3600)"));
return PJ_EINVAL;
}
break;
case OPT_PUBLISH: /* publish */
cur_acc->publish_enabled = PJ_TRUE;
break;
case OPT_ID: /* id */
if (pjsua_verify_sip_url(pj_optarg) != 0) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid SIP URL '%s' "
"in local id argument", pj_optarg));
return PJ_EINVAL;
}
cur_acc->id = pj_str(pj_optarg);
break;
case OPT_CONTACT: /* contact */
if (pjsua_verify_sip_url(pj_optarg) != 0) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid SIP URL '%s' "
"in contact argument", pj_optarg));
return PJ_EINVAL;
}
cur_acc->force_contact = pj_str(pj_optarg);
break;
case OPT_NEXT_ACCOUNT: /* Add more account. */
cfg->acc_cnt++;
cur_acc = &cfg->acc_cfg[cfg->acc_cnt];
break;
case OPT_USERNAME: /* Default authentication user */
cur_acc->cred_info[cur_acc->cred_count].username = pj_str(pj_optarg);
cur_acc->cred_info[cur_acc->cred_count].scheme = pj_str("digest");
break;
case OPT_REALM: /* Default authentication realm. */
cur_acc->cred_info[cur_acc->cred_count].realm = pj_str(pj_optarg);
break;
case OPT_PASSWORD: /* authentication password */
cur_acc->cred_info[cur_acc->cred_count].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
cur_acc->cred_info[cur_acc->cred_count].data = pj_str(pj_optarg);
break;
case OPT_NEXT_CRED: /* next credential */
cur_acc->cred_count++;
break;
case OPT_NAMESERVER: /* nameserver */
cfg->cfg.nameserver[cfg->cfg.nameserver_count++] = pj_str(pj_optarg);
if (cfg->cfg.nameserver_count > PJ_ARRAY_SIZE(cfg->cfg.nameserver)) {
PJ_LOG(1,(THIS_FILE, "Error: too many nameservers"));
return PJ_ETOOMANY;
}
break;
case OPT_STUN_DOMAIN: /* STUN domain */
cfg->cfg.stun_domain = pj_str(pj_optarg);
break;
case OPT_STUN_SRV: /* STUN server */
cfg->cfg.stun_host = pj_str(pj_optarg);
break;
case OPT_ADD_BUDDY: /* Add to buddy list. */
if (pjsua_verify_sip_url(pj_optarg) != 0) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid URL '%s' in "
"--add-buddy option", pj_optarg));
return -1;
}
if (cfg->buddy_cnt == PJ_ARRAY_SIZE(cfg->buddy_cfg)) {
PJ_LOG(1,(THIS_FILE,
"Error: too many buddies in buddy list."));
return -1;
}
cfg->buddy_cfg[cfg->buddy_cnt].uri = pj_str(pj_optarg);
cfg->buddy_cnt++;
break;
case OPT_AUTO_PLAY:
cfg->auto_play = 1;
break;
case OPT_AUTO_REC:
cfg->auto_rec = 1;
break;
case OPT_AUTO_LOOP:
cfg->auto_loop = 1;
break;
case OPT_AUTO_CONF:
cfg->auto_conf = 1;
break;
case OPT_PLAY_FILE:
cfg->wav_files[cfg->wav_count++] = pj_str(pj_optarg);
break;
case OPT_PLAY_TONE:
{
int f1, f2, on, off;
int n;
n = sscanf(pj_optarg, "%d,%d,%d,%d", &f1, &f2, &on, &off);
if (n != 4) {
puts("Expecting f1,f2,on,off in --play-tone");
return -1;
}
cfg->tones[cfg->tone_count].freq1 = (short)f1;
cfg->tones[cfg->tone_count].freq2 = (short)f2;
cfg->tones[cfg->tone_count].on_msec = (short)on;
cfg->tones[cfg->tone_count].off_msec = (short)off;
++cfg->tone_count;
}
break;
case OPT_REC_FILE:
cfg->rec_file = pj_str(pj_optarg);
break;
case OPT_USE_ICE:
cfg->media_cfg.enable_ice = PJ_TRUE;
break;
case OPT_RTP_PORT:
cfg->rtp_cfg.port = my_atoi(pj_optarg);
if (cfg->rtp_cfg.port < 1 || cfg->rtp_cfg.port > 65535) {
PJ_LOG(1,(THIS_FILE,
"Error: rtp-port argument value "
"(expecting 1-65535"));
return -1;
}
break;
case OPT_ADD_CODEC:
cfg->codec_arg[cfg->codec_cnt++] = pj_str(pj_optarg);
break;
/* These options were no longer valid after new pjsua */
/*
case OPT_COMPLEXITY:
cfg->complexity = my_atoi(pj_optarg);
if (cfg->complexity < 0 || cfg->complexity > 10) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --complexity (expecting 0-10"));
return -1;
}
break;
*/
case OPT_DURATION:
cfg->duration = my_atoi(pj_optarg);
break;
case OPT_THREAD_CNT:
cfg->cfg.thread_cnt = my_atoi(pj_optarg);
if (cfg->cfg.thread_cnt > 128) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --thread-cnt option"));
return -1;
}
break;
case OPT_PTIME:
cfg->media_cfg.ptime = my_atoi(pj_optarg);
if (cfg->media_cfg.ptime < 10 || cfg->media_cfg.ptime > 1000) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --ptime option"));
return -1;
}
break;
case OPT_NO_VAD:
cfg->media_cfg.no_vad = PJ_TRUE;
break;
case OPT_EC_TAIL:
cfg->media_cfg.ec_tail_len = my_atoi(pj_optarg);
if (cfg->media_cfg.ec_tail_len > 1000) {
PJ_LOG(1,(THIS_FILE, "I think the ec-tail length setting "
"is too big"));
return -1;
}
break;
case OPT_QUALITY:
cfg->media_cfg.quality = my_atoi(pj_optarg);
if (cfg->media_cfg.quality < 0 || cfg->media_cfg.quality > 10) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --quality (expecting 0-10"));
return -1;
}
break;
case OPT_ILBC_MODE:
cfg->media_cfg.ilbc_mode = my_atoi(pj_optarg);
if (cfg->media_cfg.ilbc_mode!=20 && cfg->media_cfg.ilbc_mode!=30) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --ilbc-mode (expecting 20 or 30"));
return -1;
}
break;
case OPT_RX_DROP_PCT:
cfg->media_cfg.rx_drop_pct = my_atoi(pj_optarg);
if (cfg->media_cfg.rx_drop_pct > 100) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --rx-drop-pct (expecting <= 100"));
return -1;
}
break;
case OPT_TX_DROP_PCT:
cfg->media_cfg.tx_drop_pct = my_atoi(pj_optarg);
if (cfg->media_cfg.tx_drop_pct > 100) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid --tx-drop-pct (expecting <= 100"));
return -1;
}
break;
case OPT_AUTO_ANSWER:
cfg->auto_answer = my_atoi(pj_optarg);
if (cfg->auto_answer < 100 || cfg->auto_answer > 699) {
PJ_LOG(1,(THIS_FILE,
"Error: invalid code in --auto-answer "
"(expecting 100-699"));
return -1;
}
break;
case OPT_MAX_CALLS:
cfg->cfg.max_calls = my_atoi(pj_optarg);
if (cfg->cfg.max_calls < 1 || cfg->cfg.max_calls > PJSUA_MAX_CALLS) {
PJ_LOG(1,(THIS_FILE,"Error: maximum call setting exceeds "
"compile time limit (PJSUA_MAX_CALLS=%d)",
PJSUA_MAX_CALLS));
return -1;
}
break;
case OPT_USE_TLS:
cfg->use_tls = PJ_TRUE;
#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0
PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured"));
return -1;
#endif
break;
case OPT_TLS_CA_FILE:
cfg->udp_cfg.tls_setting.ca_list_file = pj_str(pj_optarg);
#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0
PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured"));
return -1;
#endif
break;
case OPT_TLS_CERT_FILE:
cfg->udp_cfg.tls_setting.cert_file = pj_str(pj_optarg);
#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0
PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured"));
return -1;
#endif
break;
case OPT_TLS_PRIV_FILE:
cfg->udp_cfg.tls_setting.privkey_file = pj_str(pj_optarg);
break;
case OPT_TLS_PASSWORD:
cfg->udp_cfg.tls_setting.password = pj_str(pj_optarg);
#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0
PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured"));
return -1;
#endif
break;
case OPT_TLS_VERIFY_SERVER:
cfg->udp_cfg.tls_setting.verify_server = PJ_TRUE;
break;
case OPT_TLS_VERIFY_CLIENT:
cfg->udp_cfg.tls_setting.verify_client = PJ_TRUE;
break;
case OPT_TLS_NEG_TIMEOUT:
cfg->udp_cfg.tls_setting.timeout.sec = atoi(pj_optarg);
break;
case OPT_CAPTURE_DEV:
cfg->capture_dev = atoi(pj_optarg);
break;
case OPT_PLAYBACK_DEV:
cfg->playback_dev = atoi(pj_optarg);
break;
default:
PJ_LOG(1,(THIS_FILE,
"Argument \"%s\" is not valid. Use --help to see help",
argv[pj_optind-1]));
return -1;
}
}
if (pj_optind != argc) {
pj_str_t uri_arg;
if (pjsua_verify_sip_url(argv[pj_optind]) != PJ_SUCCESS) {
PJ_LOG(1,(THIS_FILE, "Invalid SIP URI %s", argv[pj_optind]));
return -1;
}
uri_arg = pj_str(argv[pj_optind]);
if (uri_to_call)
*uri_to_call = uri_arg;
pj_optind++;
/* Add URI to call to buddy list if it's not already there */
for (i=0; i<cfg->buddy_cnt; ++i) {
if (pj_stricmp(&cfg->buddy_cfg[i].uri, &uri_arg)==0)
break;
}
if (i == cfg->buddy_cnt && cfg->buddy_cnt < PJSUA_MAX_BUDDIES) {
cfg->buddy_cfg[cfg->buddy_cnt++].uri = uri_arg;
}
} else {
if (uri_to_call)
uri_to_call->slen = 0;
}
if (pj_optind != argc) {
PJ_LOG(1,(THIS_FILE, "Error: unknown options %s", argv[pj_optind]));
return PJ_EINVAL;
}
if (cfg->acc_cfg[cfg->acc_cnt].id.slen)
cfg->acc_cnt++;
for (i=0; i<cfg->acc_cnt; ++i) {
if (cfg->acc_cfg[i].cred_info[cfg->acc_cfg[i].cred_count].username.slen)
{
cfg->acc_cfg[i].cred_count++;
}
}
return PJ_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -