summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-07-31 15:19:36 +0000
committerBenny Prijono <bennylp@teluu.com>2006-07-31 15:19:36 +0000
commitce9088d8978fdd457158ec0ea4c8e11e10b2960f (patch)
tree956aa5ec9405841bd1b2a12627591eaa37549235 /pjsip
parent38d6c045a1d0ebb665a4c7213897330a6b8af7de (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.h29
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c5
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c2
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c37
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;
}
-
-