Changed build optimizations settings for Speex, pjmedia, and symbian_sound for Symbian. Speex/8000 now also runs on Symbian!
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1965 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/build.symbian/bld.inf b/build.symbian/bld.inf
index 8adc54c..bf971af 100644
--- a/build.symbian/bld.inf
+++ b/build.symbian/bld.inf
@@ -4,6 +4,8 @@
gcce
prj_mmpfiles
+
+// libraries
pjlib.mmp
pjlib_util.mmp
pjnath.mmp
@@ -15,8 +17,12 @@
pjsip_simple.mmp
pjsip_ua.mmp
pjsua_lib.mmp
-libgsmcodec.mmp
+// codecs
+libgsmcodec.mmp
+libspeexcodec.mmp
+
+// applications
pjlib_test.mmp
symbian_ua.mmp
symsndtest.mmp
diff --git a/build.symbian/pjmedia.mmp b/build.symbian/pjmedia.mmp
index 2979d55..6626647 100644
--- a/build.symbian/pjmedia.mmp
+++ b/build.symbian/pjmedia.mmp
@@ -22,6 +22,11 @@
//OPTION CW -lang c++
+//
+// GCCE optimization setting
+//
+OPTION GCCE -O2 -fno-unit-at-a-time
+
MACRO PJ_M_I386=1
MACRO PJ_SYMBIAN=1
diff --git a/build.symbian/symbian_audio.mmp b/build.symbian/symbian_audio.mmp
index deeb79f..571b4b0 100644
--- a/build.symbian/symbian_audio.mmp
+++ b/build.symbian/symbian_audio.mmp
@@ -25,6 +25,11 @@
OPTION CW -lang c++
+//
+// GCCE optimization setting
+//
+OPTION GCCE -O2 -fno-unit-at-a-time
+
MACRO PJ_M_I386=1
MACRO PJ_SYMBIAN=1
diff --git a/build.symbian/symbian_ua.mmp b/build.symbian/symbian_ua.mmp
index edd8b59..1a9363f 100644
--- a/build.symbian/symbian_ua.mmp
+++ b/build.symbian/symbian_ua.mmp
@@ -38,7 +38,7 @@
STATICLIBRARY pjsip_simple.lib pjsip.lib pjsdp.lib pjmedia.lib
STATICLIBRARY pjnath.lib pjlib_util.lib pjlib.lib
STATICLIBRARY symbian_audio.lib
- STATICLIBRARY libgsmcodec.lib
+ STATICLIBRARY libgsmcodec.lib libspeexcodec.lib
#endif
#ifdef WINSCW
diff --git a/pjlib/include/pj/config_site_sample.h b/pjlib/include/pj/config_site_sample.h
index 6be8594..63c9470 100644
--- a/pjlib/include/pj/config_site_sample.h
+++ b/pjlib/include/pj/config_site_sample.h
@@ -56,7 +56,7 @@
# define PJMEDIA_HAS_GSM_CODEC 1
# define PJMEDIA_HAS_L16_CODEC 0
# define PJMEDIA_HAS_ILBC_CODEC 0
-# define PJMEDIA_HAS_SPEEX_CODEC 0
+# define PJMEDIA_HAS_SPEEX_CODEC 1
# define PJMEDIA_HAS_G722_CODEC 0
/* Need larger sound buffers */
diff --git a/pjmedia/include/pjmedia-codec/config.h b/pjmedia/include/pjmedia-codec/config.h
index 13e2d9f..d52044f 100644
--- a/pjmedia/include/pjmedia-codec/config.h
+++ b/pjmedia/include/pjmedia-codec/config.h
@@ -51,6 +51,20 @@
# define PJMEDIA_HAS_SPEEX_CODEC 1
#endif
+/**
+ * Speex codec default complexity setting.
+ */
+#ifndef PJMEDIA_CODEC_SPEEX_DEFAULT_COMPLEXITY
+# define PJMEDIA_CODEC_SPEEX_DEFAULT_COMPLEXITY 2
+#endif
+
+/**
+ * Speex codec default quality setting.
+ */
+#ifndef PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY
+# define PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY 5
+#endif
+
/**
* Unless specified otherwise, iLBC codec is included by default.
diff --git a/pjmedia/include/pjmedia-codec/speex.h b/pjmedia/include/pjmedia-codec/speex.h
index 7cba3a0..550382d 100644
--- a/pjmedia/include/pjmedia-codec/speex.h
+++ b/pjmedia/include/pjmedia-codec/speex.h
@@ -61,9 +61,9 @@
* @param endpt The pjmedia endpoint.
* @param options Bitmask of pjmedia_speex_options (default=0).
* @param quality Specify encoding quality, or use -1 for default
- * (default=8).
+ * (@see PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY).
* @param complexity Specify encoding complexity , or use -1 for default
- * (default=8).
+ * (@see PJMEDIA_CODEC_SPEEX_DEFAULT_COMPLEXITY).
*
* @return PJ_SUCCESS on success.
*/
@@ -84,6 +84,21 @@
PJ_DECL(pj_status_t) pjmedia_codec_speex_init_default(pjmedia_endpt *endpt);
+/**
+ * Change the settings of Speex codec.
+ *
+ * @param clock_rate Clock rate of Speex mode to be set.
+ * @param quality Specify encoding quality, or use -1 for default
+ * (@see PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY).
+ * @param complexity Specify encoding complexity , or use -1 for default
+ * (@see PJMEDIA_CODEC_SPEEX_DEFAULT_COMPLEXITY).
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_codec_speex_set_param(unsigned clock_rate,
+ int quality,
+ int complexity);
+
/**
* Unregister Speex codec factory from pjmedia endpoint and deinitialize
diff --git a/pjmedia/src/pjmedia-codec/speex_codec.c b/pjmedia/src/pjmedia-codec/speex_codec.c
index a01ccb0..dc2c740 100644
--- a/pjmedia/src/pjmedia-codec/speex_codec.c
+++ b/pjmedia/src/pjmedia-codec/speex_codec.c
@@ -37,9 +37,6 @@
#define THIS_FILE "speex_codec.c"
-#define DEFAULT_QUALITY 10
-#define DEFAULT_COMPLEXITY 10
-
/* Prototypes for Speex factory */
static pj_status_t spx_test_alloc( pjmedia_codec_factory *factory,
const pjmedia_codec_info *id );
@@ -211,8 +208,12 @@
}
/* Get defaults */
- if (quality <= 0) quality = DEFAULT_QUALITY;
- if (complexity <= 0) complexity = DEFAULT_COMPLEXITY;
+ if (quality < 0) quality = PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY;
+ if (complexity < 0) complexity = PJMEDIA_CODEC_SPEEX_DEFAULT_COMPLEXITY;
+
+ /* Validate quality & complexity */
+ PJ_ASSERT_RETURN(quality >= 0 && quality <= 10, PJ_EINVAL);
+ PJ_ASSERT_RETURN(complexity >= 1 && complexity <= 10, PJ_EINVAL);
/* Create Speex codec factory. */
spx_factory.base.op = &spx_factory_op;
@@ -300,6 +301,46 @@
}
/*
+ * Change the settings of Speex codec.
+ */
+PJ_DEF(pj_status_t) pjmedia_codec_speex_set_param(unsigned clock_rate,
+ int quality,
+ int complexity)
+{
+ unsigned i;
+
+ /* Get defaults */
+ if (quality < 0) quality = PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY;
+ if (complexity < 0) complexity = PJMEDIA_CODEC_SPEEX_DEFAULT_COMPLEXITY;
+
+ /* Validate quality & complexity */
+ PJ_ASSERT_RETURN(quality >= 0 && quality <= 10, PJ_EINVAL);
+ PJ_ASSERT_RETURN(complexity >= 1 && complexity <= 10, PJ_EINVAL);
+
+ /* Apply the settings */
+ for (i=0; i<PJ_ARRAY_SIZE(spx_factory.speex_param); ++i) {
+ if (spx_factory.speex_param[i].clock_rate == clock_rate) {
+ pj_status_t status;
+
+ spx_factory.speex_param[i].quality = quality;
+ spx_factory.speex_param[i].complexity = complexity;
+
+ /* Somehow quality<=4 is broken in linux. */
+ if (i == PARAM_UWB && quality <= 4 && quality >= 0) {
+ PJ_LOG(5,(THIS_FILE, "Adjusting quality to 5 for uwb"));
+ spx_factory.speex_param[PARAM_UWB].quality = 5;
+ }
+
+ status = get_speex_info(&spx_factory.speex_param[i]);
+
+ return status;
+ }
+ }
+
+ return PJ_EINVAL;
+}
+
+/*
* Unregister Speex codec factory from pjmedia endpoint and deinitialize
* the Speex codec library.
*/
diff --git a/pjsip-apps/src/symbian_ua/ua.cpp b/pjsip-apps/src/symbian_ua/ua.cpp
index b80055f..7910bff 100644
--- a/pjsip-apps/src/symbian_ua/ua.cpp
+++ b/pjsip-apps/src/symbian_ua/ua.cpp
@@ -334,7 +334,25 @@
pjsua_destroy();
return status;
}
+
+ /* Adjust Speex priority and enable only the narrowband */
+ {
+ pj_str_t codec_id = pj_str("speex/8000");
+ pjmedia_codec_mgr_set_codec_priority(
+ pjmedia_endpt_get_codec_mgr(pjsua_var.med_endpt),
+ &codec_id, PJMEDIA_CODEC_PRIO_NORMAL+1);
+ codec_id = pj_str("speex/16000");
+ pjmedia_codec_mgr_set_codec_priority(
+ pjmedia_endpt_get_codec_mgr(pjsua_var.med_endpt),
+ &codec_id, PJMEDIA_CODEC_PRIO_DISABLED);
+
+ codec_id = pj_str("speex/32000");
+ pjmedia_codec_mgr_set_codec_priority(
+ pjmedia_endpt_get_codec_mgr(pjsua_var.med_endpt),
+ &codec_id, PJMEDIA_CODEC_PRIO_DISABLED);
+ }
+
/* Add UDP transport. */
pjsua_transport_config tcfg;
pjsua_transport_id tid;
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 2d6e224..2936066 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -82,10 +82,7 @@
/* Register all codecs */
#if PJMEDIA_HAS_SPEEX_CODEC
/* Register speex. */
- status = pjmedia_codec_speex_init(pjsua_var.med_endpt,
- 0,
- pjsua_var.media_cfg.quality,
- pjsua_var.media_cfg.quality);
+ status = pjmedia_codec_speex_init_default(pjsua_var.med_endpt);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Error initializing Speex codec",
status);