diff options
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 41 | ||||
-rw-r--r-- | pjsip/build/Makefile | 2 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 13 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 21 |
4 files changed, 45 insertions, 32 deletions
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index 4a32ac8a..ded37e2e 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -43,7 +43,6 @@ static struct app_config unsigned codec_cnt; pj_str_t codec_arg[32]; - unsigned clock_rate; pj_bool_t null_audio; pj_str_t wav_file; pjsua_player_id wav_id; @@ -51,8 +50,6 @@ static struct app_config pj_bool_t auto_play; pj_bool_t auto_loop; unsigned ptime; - unsigned quality; - unsigned complexity; unsigned auto_answer; unsigned duration; } app_config; @@ -112,9 +109,8 @@ static void usage(void) puts (" --auto-play Automatically play the file (to incoming calls only)"); puts (" --auto-loop Automatically loop incoming RTP to outgoing RTP"); puts (" --rtp-port=N Base port to try for RTP (default=4000)"); + puts (" --quality=N Specify media quality (0-10, default=10)"); /* - puts (" --complexity=N Specify encoding complexity (0-10, default=none(-1))"); - puts (" --quality=N Specify encoding quality (0-10, default=4)"); puts (" --ptime=MSEC Override codec ptime to MSEC (default=specific)"); */ puts (""); @@ -561,15 +557,6 @@ static pj_status_t parse_args(int argc, char *argv[], } break; - case OPT_QUALITY: - cfg->quality = my_atoi(pj_optarg); - if (cfg->quality < 0 || cfg->quality > 10) { - PJ_LOG(1,(THIS_FILE, - "Error: invalid --quality (expecting 0-10")); - return -1; - } - break; - case OPT_DURATION: cfg->duration = my_atoi(pj_optarg); break; @@ -585,6 +572,15 @@ static pj_status_t parse_args(int argc, char *argv[], */ + 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_AUTO_ANSWER: cfg->auto_answer = my_atoi(pj_optarg); if (cfg->auto_answer < 100 || cfg->auto_answer > 699) { @@ -831,25 +827,18 @@ static int write_settings(const struct app_config *config, pj_strcat2(&cfg, line); } /* Media clock rate. */ - if (config->clock_rate) { + if (config->media_cfg.clock_rate) { pj_ansi_sprintf(line, "--clock-rate %d\n", - config->clock_rate); + config->media_cfg.clock_rate); pj_strcat2(&cfg, line); } - - - /* Encoding quality and complexity */ - if (config->quality > 0) { + if (config->media_cfg.quality != 10) { pj_ansi_sprintf(line, "--quality %d\n", - config->quality); - pj_strcat2(&cfg, line); - } - if (config->complexity > 0) { - pj_ansi_sprintf(line, "--complexity %d\n", - config->complexity); + config->media_cfg.quality); pj_strcat2(&cfg, line); } + /* ptime */ if (config->ptime) { pj_ansi_sprintf(line, "--ptime %d\n", diff --git a/pjsip/build/Makefile b/pjsip/build/Makefile index 1fd183aa..30e61e10 100644 --- a/pjsip/build/Makefile +++ b/pjsip/build/Makefile @@ -126,7 +126,7 @@ pjsua-lib: echo Making $@ $(MAKE) -f $(RULES_MAK) APP=PJSUA_LIB app=pjsua-lib $@ -clean depend realclean: +clean depend: $(MAKE) -f $(RULES_MAK) APP=PJSIP app=pjsip $@ $(MAKE) -f $(RULES_MAK) APP=PJSIP_UA app=pjsip-ua $@ $(MAKE) -f $(RULES_MAK) APP=PJSIP_SIMPLE app=pjsip-simple $@ diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 90ba0f42..466c3196 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -2037,7 +2037,17 @@ struct pjsua_media_config */ unsigned thread_cnt; - + /** + * Media quality, 0-10, according to this table: + * 8-10: resampling use large filter, + * 3-7: resampling use small filter, + * 1-2: resampling use linear. + * The media quality also sets speex codec quality/complexity to the + * number. + * + * Default: 10. + */ + unsigned quality; }; @@ -2054,6 +2064,7 @@ PJ_INLINE(void) pjsua_media_config_default(pjsua_media_config *cfg) cfg->max_media_ports = 32; cfg->has_ioqueue = PJ_TRUE; cfg->thread_cnt = 1; + cfg->quality = 10; } diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 2dddd634..730e3d89 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -37,6 +37,7 @@ static void close_snd_dev(void); pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg) { pj_str_t codec_id; + unsigned opt; pj_status_t status; /* Copy configuration */ @@ -75,7 +76,8 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg) /* Register speex. */ status = pjmedia_codec_speex_init(pjsua_var.med_endpt, PJMEDIA_SPEEX_NO_UWB, - -1, -1); + pjsua_var.media_cfg.quality, + pjsua_var.media_cfg.quality); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error initializing Speex codec", status); @@ -129,6 +131,18 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg) pjsua_var.mconf_cfg.channel_count = 1; pjsua_var.mconf_cfg.bits_per_sample = 16; + /* Init options for conference bridge. */ + opt = PJMEDIA_CONF_NO_DEVICE; + if (pjsua_var.media_cfg.quality >= 3 && + pjsua_var.media_cfg.quality <= 7) + { + opt |= PJMEDIA_CONF_SMALL_FILTER; + } + else if (pjsua_var.media_cfg.quality < 3) { + opt |= PJMEDIA_CONF_USE_LINEAR; + } + + /* Init conference bridge. */ status = pjmedia_conf_create(pjsua_var.pool, pjsua_var.media_cfg.max_media_ports, @@ -136,8 +150,7 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg) pjsua_var.mconf_cfg.channel_count, pjsua_var.mconf_cfg.samples_per_frame, pjsua_var.mconf_cfg.bits_per_sample, - PJMEDIA_CONF_NO_DEVICE, - &pjsua_var.mconf); + opt, &pjsua_var.mconf); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Media stack initialization has returned error", @@ -532,7 +545,7 @@ PJ_DEF(pj_status_t) pjsua_conf_get_port_info( pjsua_conf_port_id id, pjsua_conf_port_info *info) { pjmedia_conf_port_info cinfo; - unsigned i, count; + unsigned i; pj_status_t status; status = pjmedia_conf_get_port_info( pjsua_var.mconf, id, &cinfo); |