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);