diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-07-31 15:19:36 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-07-31 15:19:36 +0000 |
commit | ce9088d8978fdd457158ec0ea4c8e11e10b2960f (patch) | |
tree | 956aa5ec9405841bd1b2a12627591eaa37549235 /pjsip | |
parent | 38d6c045a1d0ebb665a4c7213897330a6b8af7de (diff) |
- Added iLBC codec (experimental) with the following features:
- configurable default decoder mode (20 or 30),
- encoder mode follows the mode specified in SDP fmtp from
the remote's SDP,
- silence detector uses pjmedia's,
- PLC uses iLBC's PLC,
- perceptual enhancement (penh) is configurable via codec
param, as usual.
- iLBC mode is configurable in pjsua with --ilbc-mode option.
- Added packet lost simulation in pjmedia's UDP transport and
in pjsua (with --rx-drop-pct and --tx-drop-pct options).
- Increase default buffer count in DirectSound to 32 frames
to make it more resilient to CPU disruption.
- Specify and parse fmtp mode in SDP for codecs that need it.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@637 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 29 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 5 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 2 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 37 |
4 files changed, 64 insertions, 9 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 6958bc4f..fe1b1a70 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -2087,7 +2087,7 @@ struct pjsua_media_config * The media quality also sets speex codec quality/complexity to the * number. * - * Default: 5. + * Default: 6. */ unsigned quality; @@ -2104,6 +2104,30 @@ struct pjsua_media_config * Default: 0 (no (meaning VAD is enabled)) */ pj_bool_t no_vad; + + /** + * iLBC mode (20 or 30). + * + * Default: 20 + */ + unsigned ilbc_mode; + + /** + * Percentage of RTP packet to drop in TX direction + * (to simulate packet lost). + * + * Default: 0 + */ + unsigned tx_drop_pct; + + /** + * Percentage of RTP packet to drop in RX direction + * (to simulate packet lost). + * + * Default: 0 + */ + unsigned rx_drop_pct; + }; @@ -2120,7 +2144,8 @@ 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 = 5; + cfg->quality = 6; + cfg->ilbc_mode = 20; } diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index d5b021fc..31d7f6c0 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -941,6 +941,7 @@ PJ_DEF(pj_status_t) pjsua_call_reinvite( pjsua_call_id call_id, } /* Create SDP */ + PJ_UNUSED_ARG(unhold); PJ_TODO(create_active_inactive_sdp_based_on_unhold_arg); status = pjmedia_endpt_create_sdp( pjsua_var.med_endpt, call->inv->pool, 1, &call->skinfo, &sdp); @@ -1853,8 +1854,8 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv, /* Override ptime, if this option is specified. */ if (pjsua_var.media_cfg.ptime != 0) { - sess_info.stream_info[0].param->setting.frm_per_pkt = - pjsua_var.media_cfg.ptime / sess_info.stream_info[0].param->info.frm_ptime; + sess_info.stream_info[0].param->setting.frm_per_pkt = (pj_uint8_t) + (pjsua_var.media_cfg.ptime / sess_info.stream_info[0].param->info.frm_ptime); if (sess_info.stream_info[0].param->setting.frm_per_pkt == 0) sess_info.stream_info[0].param->setting.frm_per_pkt = 1; } diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 930543ea..faafe2bd 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -1114,7 +1114,7 @@ PJ_DEF(pj_status_t) pjsua_transport_close( pjsua_transport_id id, /* To be done!! */ - + PJ_UNUSED_ARG(force); PJ_TODO(pjsua_transport_close); diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index c8c20490..d92d0cb9 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -85,6 +85,17 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg) } #endif /* PJMEDIA_HAS_SPEEX_CODEC */ +#if PJMEDIA_HAS_ILBC_CODEC + /* Register iLBC. */ + status = pjmedia_codec_ilbc_init( pjsua_var.med_endpt, + pjsua_var.media_cfg.ilbc_mode); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "Error initializing iLBC codec", + status); + return status; + } +#endif /* PJMEDIA_HAS_ILBC_CODEC */ + #if PJMEDIA_HAS_GSM_CODEC /* Register GSM */ status = pjmedia_codec_gsm_init(pjsua_var.med_endpt); @@ -484,6 +495,15 @@ pjsua_media_transports_create(const pjsua_transport_config *app_cfg) status); goto on_error; } + + pjmedia_transport_udp_simulate_lost(pjsua_var.calls[i].med_tp, + PJMEDIA_DIR_ENCODING, + pjsua_var.media_cfg.tx_drop_pct); + + pjmedia_transport_udp_simulate_lost(pjsua_var.calls[i].med_tp, + PJMEDIA_DIR_DECODING, + pjsua_var.media_cfg.rx_drop_pct); + } PJSUA_UNLOCK(); @@ -660,7 +680,7 @@ PJ_DEF(pj_status_t) pjsua_player_create( const pj_str_t *filename, status = pjmedia_wav_player_port_create(pjsua_var.pool, path, pjsua_var.mconf_cfg.samples_per_frame * 1000 / pjsua_var.media_cfg.clock_rate, - 0, 0, &port); + options, 0, &port); if (status != PJ_SUCCESS) { PJSUA_UNLOCK(); pjsua_perror(THIS_FILE, "Unable to open file for playback", status); @@ -758,6 +778,15 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename, pjmedia_port *port; pj_status_t status; + /* Don't support max_size at present */ + PJ_ASSERT_RETURN(max_size == 0, PJ_EINVAL); + + /* Don't support file format at present */ + PJ_ASSERT_RETURN(file_format == 0, PJ_EINVAL); + + /* Don't support encoding at present */ + PJ_ASSERT_RETURN(encoding == NULL, PJ_EINVAL); + if (pjsua_var.rec_cnt >= PJ_ARRAY_SIZE(pjsua_var.recorder)) return PJ_ETOOMANY; @@ -782,7 +811,7 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename, pjsua_var.mconf_cfg.channel_count, pjsua_var.mconf_cfg.samples_per_frame, pjsua_var.mconf_cfg.bits_per_sample, - 0, 0, &port); + options, 0, &port); if (status != PJ_SUCCESS) { PJSUA_UNLOCK(); pjsua_perror(THIS_FILE, "Unable to open file for recording", status); @@ -1092,8 +1121,8 @@ PJ_DEF(pj_status_t) pjsua_codec_get_param( const pj_str_t *codec_id, PJ_DEF(pj_status_t) pjsua_codec_set_param( const pj_str_t *id, const pjmedia_codec_param *param) { + PJ_UNUSED_ARG(id); + PJ_UNUSED_ARG(param); PJ_TODO(set_codec_param); return PJ_SUCCESS; } - - |