diff --git a/build/next-release.txt b/build/next-release.txt
index 27f9cd322b..a8fdfda1c7 100644
--- a/build/next-release.txt
+++ b/build/next-release.txt
@@ -1 +1 @@
-1.8.0
+1.8.1
diff --git a/cluecon.tmpl b/cluecon.tmpl
index f6624beb24..28c4d51d56 100644
--- a/cluecon.tmpl
+++ b/cluecon.tmpl
@@ -1,26 +1,20 @@
.=======================================================================================================.
-| ____ _ ____ |
-| / ___| |_ _ ___ / ___|___ _ __ |
-| | | | | | | |/ _ \ | / _ \| '_ \ |
-| | |___| | |_| | __/ |__| (_) | | | | |
-| \____|_|\__,_|\___|\____\___/|_| |_| |
+| _ _ ____ _ ____ |
+| / \ _ __ _ __ _ _ __ _| | / ___| |_ _ ___ / ___|___ _ __ |
+| / _ \ | '_ \| '_ \| | | |/ _` | | | | | | | | |/ _ \ | / _ \| '_ \ |
+| / ___ \| | | | | | | |_| | (_| | | | |___| | |_| | __/ |__| (_) | | | | |
+| /_/ \_\_| |_|_| |_|\__,_|\__,_|_| \____|_|\__,_|\___|\____\___/|_| |_| |
| |
-| _____ _ _ ____ __ |
-| |_ _|__| | ___ _ __ | |__ ___ _ __ _ _ / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |
-| | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ |
-| | | __/ | __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |
-| |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, | \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| |
-| |_| |___/ |
-| _____ _ _ |
-| | ____|_ _____ _ __ _ _ / \ _ _ __ _ _ _ ___| |_ |
-| | _| \ \ / / _ \ '__| | | | / _ \| | | |/ _` | | | / __| __| |
-| | |___ \ V / __/ | | |_| | / ___ \ |_| | (_| | |_| \__ \ |_ |
-| |_____| \_/ \___|_| \__, | /_/ \_\__,_|\__, |\__,_|___/\__| |
-| |___/ |___/ |
-| ____ _ ____ |
-| __ ____ ____ __ / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |
-| \ \ /\ / /\ \ /\ / /\ \ /\ / / | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ |
-| \ V V / \ V V / \ V V / _ | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |
-| \_/\_/ \_/\_/ \_/\_/ (_) \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| |
+| ____ _____ ____ ____ __ |
+| | _ \_ _/ ___| / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |
+| | |_) || || | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ |
+| | _ < | || |___ | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |
+| |_| \_\|_| \____| \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| |
+| |
+| ____ _ ____ |
+| / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |
+| | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ |
+| | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |
+| \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| |
| |
.=======================================================================================================.
diff --git a/cluecon2.tmpl b/cluecon2.tmpl
index e0f2309ca3..28c4d51d56 100644
--- a/cluecon2.tmpl
+++ b/cluecon2.tmpl
@@ -1,29 +1,20 @@
-[01;44;33m
.=======================================================================================================.
-| ____ _ ____ |
-| / ___| |_ _ ___ / ___|___ _ __ |
-| | | | | | | |/ _ \ | / _ \| '_ \ |
-| | |___| | |_| | __/ |__| (_) | | | | |
-| \____|_|\__,_|\___|\____\___/|_| |_| |
+| _ _ ____ _ ____ |
+| / \ _ __ _ __ _ _ __ _| | / ___| |_ _ ___ / ___|___ _ __ |
+| / _ \ | '_ \| '_ \| | | |/ _` | | | | | | | | |/ _ \ | / _ \| '_ \ |
+| / ___ \| | | | | | | |_| | (_| | | | |___| | |_| | __/ |__| (_) | | | | |
+| /_/ \_\_| |_|_| |_|\__,_|\__,_|_| \____|_|\__,_|\___|\____\___/|_| |_| |
| |
-| _____ _ _ ____ __ |
-| |_ _|__| | ___ _ __ | |__ ___ _ __ _ _ / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |
-| | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ |
-| | | __/ | __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |
-| |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, | \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| |
-| |_| |___/ |
-| _____ _ _ |
-| | ____|_ _____ _ __ _ _ / \ _ _ __ _ _ _ ___| |_ |
-| | _| \ \ / / _ \ '__| | | | / _ \| | | |/ _` | | | / __| __| |
-| | |___ \ V / __/ | | |_| | / ___ \ |_| | (_| | |_| \__ \ |_ |
-| |_____| \_/ \___|_| \__, | /_/ \_\__,_|\__, |\__,_|___/\__| |
-| |___/ |___/ |
-| ____ _ ____ |
-| __ ____ ____ __ / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |
-| \ \ /\ / /\ \ /\ / /\ \ /\ / / | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ |
-| \ V V / \ V V / \ V V / _ | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |
-| \_/\_/ \_/\_/ \_/\_/ (_) \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| |
+| ____ _____ ____ ____ __ |
+| | _ \_ _/ ___| / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |
+| | |_) || || | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ |
+| | _ < | || |___ | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |
+| |_| \_\|_| \____| \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| |
+| |
+| ____ _ ____ |
+| / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |
+| | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ |
+| | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |
+| \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| |
| |
.=======================================================================================================.
-[0m
-
diff --git a/conf/vanilla/autoload_configs/vpx.conf.xml b/conf/vanilla/autoload_configs/vpx.conf.xml
new file mode 100644
index 0000000000..f20f984e01
--- /dev/null
+++ b/conf/vanilla/autoload_configs/vpx.conf.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/configure.ac b/configure.ac
index ec85d80beb..9cc9f7ed42 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,10 +3,10 @@
# Must change all of the below together
# For a release, set revision for that tagged release as well and uncomment
-AC_INIT([freeswitch], [1.8.0], bugs@freeswitch.org)
+AC_INIT([freeswitch], [1.8.1], bugs@freeswitch.org)
AC_SUBST(SWITCH_VERSION_MAJOR, [1])
AC_SUBST(SWITCH_VERSION_MINOR, [8])
-AC_SUBST(SWITCH_VERSION_MICRO, [0])
+AC_SUBST(SWITCH_VERSION_MICRO, [1])
AC_SUBST(SWITCH_VERSION_REVISION, [])
AC_SUBST(SWITCH_VERSION_REVISION_HUMAN, [])
diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh
index 75a832458c..e1bf1165a4 100755
--- a/debian/bootstrap.sh
+++ b/debian/bootstrap.sh
@@ -56,6 +56,7 @@ avoid_mods=(
endpoints/mod_skypopen
endpoints/mod_unicall
event_handlers/mod_smpp
+ event_handlers/mod_cdr_pg_csv
formats/mod_webm
sdk/autotools
xml_int/mod_xml_ldap
diff --git a/debian/control-modules b/debian/control-modules
index 275b5d3ccc..978ecc49f3 100644
--- a/debian/control-modules
+++ b/debian/control-modules
@@ -507,7 +507,7 @@ Build-Depends: erlang-dev
Module: event_handlers/mod_event_multicast
Description: mod_event_multicast
Adds mod_event_multicast.
-Build-Depends: libssl-dev
+Build-Depends: libssl1.0-dev | libssl-dev
Module: event_handlers/mod_event_socket
Description: mod_event_socket
diff --git a/debian/freeswitch.dirs b/debian/freeswitch.dirs
new file mode 100644
index 0000000000..f0e2fca44b
--- /dev/null
+++ b/debian/freeswitch.dirs
@@ -0,0 +1 @@
+usr/share/freeswitch/fonts
\ No newline at end of file
diff --git a/debian/freeswitch.install b/debian/freeswitch.install
index 415f082dd9..b58e589b8f 100644
--- a/debian/freeswitch.install
+++ b/debian/freeswitch.install
@@ -1 +1,3 @@
/usr/bin
+fonts/FreeMono.ttf /usr/share/freeswitch/fonts/
+fonts/FreeSans.ttf /usr/share/freeswitch/fonts/
\ No newline at end of file
diff --git a/debian/rules b/debian/rules
index f890165553..7fdf7ff733 100755
--- a/debian/rules
+++ b/debian/rules
@@ -75,7 +75,6 @@ override_dh_auto_clean:
--prefix=/usr --localstatedir=/var --sysconfdir=/etc \
--with-gnu-ld --with-python --with-erlang --with-openssl \
--enable-core-odbc-support --enable-zrtp \
- --enable-core-pgsql-support \
--enable-static-v8 --disable-parallel-build-v8
touch $@
diff --git a/html5/verto/js/src/jquery.FSRTC.js b/html5/verto/js/src/jquery.FSRTC.js
index f3b6cdd380..c2ea803d0b 100644
--- a/html5/verto/js/src/jquery.FSRTC.js
+++ b/html5/verto/js/src/jquery.FSRTC.js
@@ -232,8 +232,6 @@
FSRTCattachMediaStream = function(element, stream) {
if (typeof element.srcObject !== 'undefined') {
element.srcObject = stream;
- } else if (typeof element.src !== 'undefined') {
- element.src = URL.createObjectURL(stream);
} else {
console.error('Error attaching stream to element.');
}
@@ -430,7 +428,8 @@
offerSDP: {
type: "offer",
sdp: self.remoteSDP
- }
+ },
+ turnServer: self.options.turnServer
});
onStreamSuccess(self, stream);
@@ -449,10 +448,7 @@
getUserMedia({
constraints: {
audio: false,
- video: {
- //mandatory: self.options.videoParams,
- //optional: []
- },
+ video: { deviceId: params.useCamera },
},
localVideo: self.options.localVideo,
onsuccess: function(e) {self.options.localVideoStream = e; console.log("local video ready");},
@@ -502,11 +498,10 @@
getUserMedia({
constraints: {
audio: false,
- video: obj.options.videoParams
-
+ video: { deviceId: obj.options.useCamera },
},
localVideo: obj.options.localVideo,
- onsuccess: function(e) {self.options.localVideoStream = e; console.log("local video ready");},
+ onsuccess: function(e) {obj.options.localVideoStream = e; console.log("local video ready");},
onerror: function(e) {console.error("local video error!");}
});
}
@@ -625,6 +620,7 @@
},
constraints: self.constraints,
iceServers: self.options.iceServers,
+ turnServer: self.options.turnServer
});
onStreamSuccess(self, stream);
@@ -674,13 +670,15 @@
function FSRTCPeerConnection(options) {
var gathering = false, done = false;
var config = {};
- var default_ice = {
- urls: ['stun:stun.l.google.com:19302']
- };
+ var default_ice = [{ urls: ['stun:stun.l.google.com:19302'] }];
+
+ if (self.options.turnServer) {
+ default_ice.push(self.options.turnServer)
+ }
if (options.iceServers) {
if (typeof(options.iceServers) === "boolean") {
- config.iceServers = [default_ice];
+ config.iceServers = default_ice;
} else {
config.iceServers = options.iceServers;
}
@@ -958,7 +956,7 @@
function streaming(stream) {
if (options.localVideo) {
- options.localVideo['src'] = window.URL.createObjectURL(stream);
+ options.localVideo['srcObject'] = stream;
options.localVideo.style.display = 'block';
}
diff --git a/html5/verto/js/src/jquery.jsonrpcclient.js b/html5/verto/js/src/jquery.jsonrpcclient.js
index 702998cc58..5beb85fc50 100644
--- a/html5/verto/js/src/jquery.jsonrpcclient.js
+++ b/html5/verto/js/src/jquery.jsonrpcclient.js
@@ -322,6 +322,10 @@
self.options.onWSClose(self);
}
+ if (self.ws_cnt > 10 && self.options.wsFallbackURL) {
+ self.options.socketUrl = self.options.wsFallbackURL;
+ }
+
console.error("Websocket Lost " + self.ws_cnt + " sleep: " + self.ws_sleep + "msec");
self.to = setTimeout(function() {
diff --git a/html5/verto/js/src/jquery.verto.js b/html5/verto/js/src/jquery.verto.js
index 20befd92d6..c913ca4140 100644
--- a/html5/verto/js/src/jquery.verto.js
+++ b/html5/verto/js/src/jquery.verto.js
@@ -110,6 +110,8 @@
login: verto.options.login,
passwd: verto.options.passwd,
socketUrl: verto.options.socketUrl,
+ wsFallbackURL: verto.options.wsFallbackURL,
+ turnServer: verto.options.turnServer,
loginParams: verto.options.loginParams,
userVariables: verto.options.userVariables,
sessid: verto.sessid,
@@ -2076,10 +2078,11 @@
videoParams: dialog.params.videoParams,
audioParams: verto.options.audioParams,
iceServers: verto.options.iceServers,
- screenShare: dialog.screenShare,
- useCamera: dialog.useCamera,
- useMic: dialog.useMic,
- useSpeak: dialog.useSpeak
+ screenShare: dialog.screenShare,
+ useCamera: dialog.useCamera,
+ useMic: dialog.useMic,
+ useSpeak: dialog.useSpeak,
+ turnServer: verto.options.turnServer
});
dialog.rtc.verto = dialog.verto;
diff --git a/html5/verto/verto_communicator/bower.json b/html5/verto/verto_communicator/bower.json
index 68a96ec31f..444ccf6021 100644
--- a/html5/verto/verto_communicator/bower.json
+++ b/html5/verto/verto_communicator/bower.json
@@ -24,6 +24,9 @@
"tests"
],
"dependencies": {
+ "jquery": "~2.1.4",
+ "jquery-cookie": "~1.4.1",
+ "jquery-json": "~2.5.1",
"angular-gravatar": "~0.4.1",
"bootstrap": "~3.3.4",
"angular-toastr": "~1.4.1",
@@ -34,13 +37,10 @@
"angular-animate": "~1.3.15",
"angular-cookies": "~1.3.15",
"angular-directive.g-signin": "~0.1.2",
- "jquery": "~2.1.4",
"angular-fullscreen": "~1.0.1",
"ngstorage": "~0.3.9",
"angular-timer": "~1.3.3",
"angular-tooltips": "~0.1.21",
- "jquery-cookie": "~1.4.1",
- "jquery-json": "~2.5.1",
"datatables": "~1.10.8",
"angular-bootstrap": "~0.14.3",
"bootstrap-material-design": "~0.3.0",
diff --git a/html5/verto/verto_communicator/src/config.json.sample b/html5/verto/verto_communicator/src/config.json.sample
index a905c6161d..a4a4bafad2 100644
--- a/html5/verto/verto_communicator/src/config.json.sample
+++ b/html5/verto/verto_communicator/src/config.json.sample
@@ -9,5 +9,11 @@
"autologin": "true",
"autocall": "3500",
"googlelogin": "true",
- "wsURL": "wss://gamma.tollfreegateway.com/wss2"
+ "wsURL": "wss://gamma.tollfreegateway.com/wss2",
+ "wsFallbackURL": "wss://gamma.tollfreegateway.com/wss2",
+ "turnServer": {
+ "urls": "turn:someturnserver.com:443?transport=tcp",
+ "credential": "1234",
+ "username": "username"
+ }
}
diff --git a/html5/verto/verto_communicator/src/index.html b/html5/verto/verto_communicator/src/index.html
index 87879b5ae9..d3f5cc1825 100644
--- a/html5/verto/verto_communicator/src/index.html
+++ b/html5/verto/verto_communicator/src/index.html
@@ -75,6 +75,8 @@
+
+
@@ -92,8 +94,6 @@
-
-
diff --git a/html5/verto/verto_communicator/src/vertoService/services/configService.js b/html5/verto/verto_communicator/src/vertoService/services/configService.js
index 9fd789e81f..05b0b2cbe8 100644
--- a/html5/verto/verto_communicator/src/vertoService/services/configService.js
+++ b/html5/verto/verto_communicator/src/vertoService/services/configService.js
@@ -41,6 +41,14 @@ vertoService.service('config', ['$rootScope', '$http', '$location', 'storage', '
verto.data.googleclientid = data.googleclientid;
}
+ if (data.wsFallbackURL) {
+ verto.data.wsFallbackURL = data.wsFallbackURL;
+ }
+
+ if (data.turnServer) {
+ verto.data.turnServer = data.turnServer;
+ }
+
angular.extend(verto.data, data);
/**
diff --git a/html5/verto/verto_communicator/src/vertoService/services/vertoService.js b/html5/verto/verto_communicator/src/vertoService/services/vertoService.js
index 808aba539c..348412a261 100644
--- a/html5/verto/verto_communicator/src/vertoService/services/vertoService.js
+++ b/html5/verto/verto_communicator/src/vertoService/services/vertoService.js
@@ -175,6 +175,8 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
password: $cookieStore.get('verto_demo_passwd') || "1234",
hostname: window.location.hostname,
wsURL: ("wss://" + window.location.hostname + ":8082"),
+ wsFallbackURL: null,
+ turnServer: null,
resCheckEnded: false
};
@@ -733,6 +735,8 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
login: data.login + '@' + data.hostname,
passwd: data.password,
socketUrl: data.wsURL,
+ wsFallbackURL: data.wsFallbackURL,
+ turnServer: data.turnServer,
tag: "webcam",
ringFile: "sounds/bell_ring2.wav",
audioParams: {
diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c
index 39c445ba5c..b4a5838175 100644
--- a/libs/esl/fs_cli.c
+++ b/libs/esl/fs_cli.c
@@ -89,7 +89,7 @@ static int pcount = 0;
static esl_handle_t *global_handle;
static cli_profile_t *global_profile;
static int running = 1;
-static int thread_running = 0;
+static int thread_running = 0, thread_up = 0, check_up = 0;
static char *filter_uuid;
static char *logfilter;
static int timeout = 0;
@@ -671,40 +671,45 @@ static void clear_line(void)
static void redisplay(void)
{
-#ifdef HAVE_LIBEDIT
-#ifdef HAVE_DECL_EL_REFRESH
-#ifdef HAVE_EL_WSET
- /* Current libedit versions don't implement EL_REFRESH in eln.c so
- * use the wide version instead. */
- el_wset(el, EL_REFRESH);
-#else
- /* This will work on future libedit versions and versions built
- * without wide character support. */
- el_set(el, EL_REFRESH);
-#endif
-#else
- /* Old libedit versions don't implement EL_REFRESH at all so use
- * our own implementation instead. */
- const LineInfo *lf = el_line(el);
- const char *c = lf->buffer;
- if (global_profile->batch_mode) return;
- printf("%s",prompt_str);
- while (c < lf->lastchar && *c) {
- putchar(*c);
- c++;
- }
+ esl_mutex_lock(MUTEX);
{
- int pos = (int)(lf->cursor - lf->buffer);
- char s1[12], s2[12];
- putchar('\r');
- snprintf(s1, sizeof(s1), "\033[%dC", bare_prompt_str_len);
- snprintf(s2, sizeof(s2), "\033[%dC", pos);
- printf("%s%s",s1,s2);
+#ifdef HAVE_LIBEDIT
+#ifdef XHAVE_DECL_EL_REFRESH
+#ifdef HAVE_EL_WSET
+ /* Current libedit versions don't implement EL_REFRESH in eln.c so
+ * use the wide version instead. */
+ el_wset(el, EL_REFRESH);
+#else
+ /* This will work on future libedit versions and versions built
+ * without wide character support. */
+ el_set(el, EL_REFRESH);
+#endif
+#else
+ /* Old libedit versions don't implement EL_REFRESH at all so use
+ * our own implementation instead. */
+ const LineInfo *lf = el_line(el);
+ const char *c = lf->buffer;
+ if (global_profile->batch_mode) return;
+ printf("%s",prompt_str);
+ while (c < lf->lastchar && *c) {
+ putchar(*c);
+ c++;
+ }
+ {
+ int pos = (int)(lf->cursor - lf->buffer);
+ char s1[12], s2[12] = "";
+
+ putchar('\r');
+ snprintf(s1, sizeof(s1), "\033[%dC", bare_prompt_str_len);
+ if (pos) snprintf(s2, sizeof(s2), "\033[%dC", pos);
+ printf("%s%s",s1,s2);
+ }
+ fflush(stdout);
+#endif
+#endif
}
- fflush(stdout);
+ esl_mutex_unlock(MUTEX);
return;
-#endif
-#endif
}
static int output_printf(const char *fmt, ...)
@@ -726,6 +731,9 @@ static void *msg_thread_run(esl_thread_t *me, void *obj)
{
esl_handle_t *handle = (esl_handle_t *) obj;
thread_running = 1;
+ esl_mutex_lock(MUTEX);
+ thread_up = 1;
+ esl_mutex_unlock(MUTEX);
while(thread_running && handle->connected) {
int aok = 1;
esl_status_t status;
@@ -846,6 +854,10 @@ static void *msg_thread_run(esl_thread_t *me, void *obj)
}
//sleep_ms(1);
}
+
+ esl_mutex_lock(MUTEX);
+ thread_up = 0;
+ esl_mutex_unlock(MUTEX);
thread_running = 0;
esl_log(ESL_LOG_DEBUG, "Thread Done\n");
return NULL;
@@ -1165,8 +1177,10 @@ static unsigned char esl_console_complete(const char *buffer, const char *cursor
snprintf(cmd_str, sizeof(cmd_str), "api console_complete %s\n\n", buf);
}
+ esl_mutex_lock(MUTEX);
esl_send_recv(global_handle, cmd_str);
-
+ esl_mutex_unlock(MUTEX);
+
if (global_handle->last_sr_event && global_handle->last_sr_event->body) {
char *r = global_handle->last_sr_event->body;
char *w, *p1;
@@ -1828,6 +1842,7 @@ int main(int argc, char *argv[])
output_printf("%s\n", handle.last_sr_reply);
while (running > 0) {
int r;
+
#ifdef HAVE_LIBEDIT
if (!(global_profile->batch_mode)) {
line = el_gets(el, &count);
@@ -1869,6 +1884,13 @@ int main(int argc, char *argv[])
global_handle = NULL;
thread_running = 0;
+ do {
+ esl_mutex_lock(MUTEX);
+ check_up = thread_up;
+ esl_mutex_unlock(MUTEX);
+ sleep_ms(10);
+ } while (check_up > 0);
+
esl_mutex_destroy(&MUTEX);
return 0;
diff --git a/libs/esl/src/include/cc.h b/libs/esl/src/include/cc.h
index d2635f3b1c..e92d2cd6e9 100644
--- a/libs/esl/src/include/cc.h
+++ b/libs/esl/src/include/cc.h
@@ -1,4 +1,4 @@
-const char *cc = ".=======================================================================================================.\n| ____ _ ____ |\n| / ___| |_ _ ___ / ___|___ _ __ |\n| | | | | | | |/ _ \\ | / _ \\| '_ \\ |\n| | |___| | |_| | __/ |__| (_) | | | | |\n| \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |\n| |\n| _____ _ _ ____ __ |\n| |_ _|__| | ___ _ __ | |__ ___ _ __ _ _ / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |\n| | |/ _ \\ |/ _ \\ '_ \\| '_ \\ / _ \\| '_ \\| | | | | | / _ \\| '_ \\| |_ / _ \\ '__/ _ \\ '_ \\ / __/ _ \\ |\n| | | __/ | __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |\n| |_|\\___|_|\\___| .__/|_| |_|\\___/|_| |_|\\__, | \\____\\___/|_| |_|_| \\___|_| \\___|_| |_|\\___\\___| |\n| |_| |___/ |\n| _____ _ _ |\n| | ____|_ _____ _ __ _ _ / \\ _ _ __ _ _ _ ___| |_ |\n| | _| \\ \\ / / _ \\ '__| | | | / _ \\| | | |/ _` | | | / __| __| |\n| | |___ \\ V / __/ | | |_| | / ___ \\ |_| | (_| | |_| \\__ \\ |_ |\n| |_____| \\_/ \\___|_| \\__, | /_/ \\_\\__,_|\\__, |\\__,_|___/\\__| |\n| |___/ |___/ |\n| ____ _ ____ |\n| __ ____ ____ __ / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |\n| \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / | | | | | | |/ _ \\ | / _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| \\ V V / \\ V V / \\ V V / _ | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |\n| \\_/\\_/ \\_/\\_/ \\_/\\_/ (_) \\____|_|\\__,_|\\___|\\____\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.=======================================================================================================.\n";
+const char *cc = ".=======================================================================================================.\n| _ _ ____ _ ____ |\n| / \\ _ __ _ __ _ _ __ _| | / ___| |_ _ ___ / ___|___ _ __ |\n| / _ \\ | '_ \\| '_ \\| | | |/ _` | | | | | | | | |/ _ \\ | / _ \\| '_ \\ |\n| / ___ \\| | | | | | | |_| | (_| | | | |___| | |_| | __/ |__| (_) | | | | |\n| /_/ \\_\\_| |_|_| |_|\\__,_|\\__,_|_| \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |\n| |\n| ____ _____ ____ ____ __ |\n| | _ \\_ _/ ___| / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |\n| | |_) || || | | | / _ \\| '_ \\| |_ / _ \\ '__/ _ \\ '_ \\ / __/ _ \\ |\n| | _ < | || |___ | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |\n| |_| \\_\\|_| \\____| \\____\\___/|_| |_|_| \\___|_| \\___|_| |_|\\___\\___| |\n| |\n| ____ _ ____ |\n| / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |\n| | | | | | | |/ _ \\ | / _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |\n| \\____|_|\\__,_|\\___|\\____\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.=======================================================================================================.\n";
const char *cc_s = ".===============================================================.\n| _ |\n| ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.===============================================================.\n";
diff --git a/libs/win32/apr-util/libaprutil.2010.vcxproj.filters b/libs/win32/apr-util/libaprutil.2010.vcxproj.filters
deleted file mode 100644
index 66ad7f99e0..0000000000
--- a/libs/win32/apr-util/libaprutil.2010.vcxproj.filters
+++ /dev/null
@@ -1,307 +0,0 @@
-
-
-
-
- {fefe4b16-83a4-46b0-ab4b-858531a32218}
-
-
- {66bee6b2-6ba2-4e7d-9c04-5e52ea75b8ee}
-
-
- {ec602915-b144-4258-81ce-f8931434e1eb}
-
-
- {47b5e91f-ec43-4b87-8d11-cc109d0f0733}
-
-
- {12d41721-8bc3-476e-bffa-6bab3ebbcfef}
-
-
- {aafe340f-5f94-4402-a3f4-977c302848c1}
-
-
- {627c064a-54af-49ae-b154-01343f2be90e}
-
-
- {3791a803-8653-410b-905e-934728270db6}
-
-
- {5133e514-d14d-46b5-9e37-3ab909e4ef28}
-
-
- {62959b64-29f8-483f-830f-91e3005c15b9}
-
-
- {ec299ad2-8fa6-4923-95f4-b8c7f6184dcf}
-
-
- {ef13505a-0a7a-4fdc-a55a-b47e92957a85}
-
-
- {80fa8ffc-4776-4a21-bd8b-bfa055f9f46d}
-
-
- {fdb27306-6946-4cf2-bdb6-39e03cdeeae6}
-
-
- {ee62af10-73ee-4af5-85d1-442efcd33aa2}
-
-
- {0ea472ce-22be-43c7-b06d-a50dd027a9fe}
-
-
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\buckets
-
-
- Source Files\crypto
-
-
- Source Files\crypto
-
-
- Source Files\crypto
-
-
- Source Files\crypto
-
-
- Source Files\crypto
-
-
- Source Files\dbd
-
-
- Source Files\dbd
-
-
- Source Files\dbd
-
-
- Source Files\dbd
-
-
- Source Files\dbm
-
-
- Source Files\dbm
-
-
- Source Files\dbm
-
-
- Source Files\dbm
-
-
- Source Files\encoding
-
-
- Source Files\hooks
-
-
- Source Files\ldap
-
-
- Source Files\ldap
-
-
- Source Files\ldap
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\sdbm
-
-
- Source Files\sdbm
-
-
- Source Files\sdbm
-
-
- Source Files\sdbm
-
-
- Source Files\strmatch
-
-
- Source Files\uri
-
-
- Source Files\xlate
-
-
-
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
-
-
-
-
-
- Source Files\sdbm
-
-
- Source Files\sdbm
-
-
- Source Files\sdbm
-
-
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
- Generated Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/apr-util/xml.2010.vcxproj.filters b/libs/win32/apr-util/xml.2010.vcxproj.filters
deleted file mode 100644
index 290e15f8fa..0000000000
--- a/libs/win32/apr-util/xml.2010.vcxproj.filters
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-
-
- {e33b7b13-01f9-4f80-b853-993ecbce325e}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {da5f19e9-6a89-4668-815e-293aafff5410}
- h;hpp;hxx;hm;inl
-
-
- {9f1b6ff0-ef97-40e0-bcea-0b5b8b302288}
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
-
-
-
- Generated Header Files
-
-
- Generated Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/apr/libapr.2010.vcxproj.filters b/libs/win32/apr/libapr.2010.vcxproj.filters
deleted file mode 100644
index d8f55dc5f7..0000000000
--- a/libs/win32/apr/libapr.2010.vcxproj.filters
+++ /dev/null
@@ -1,406 +0,0 @@
-
-
-
-
- {4fc8eb14-6896-4c69-bd8c-bddb16455565}
- .c
-
-
- {c89ee98b-64d0-48dd-b568-2ff6b59fc5c5}
-
-
- {78b00836-5d44-4387-8462-4bb5e76ae5da}
-
-
- {0fa9b52a-8504-44e2-8c0e-12b4aad8d27b}
-
-
- {a4bc2b15-7e22-4e76-a2bc-bcd8fd793d09}
-
-
- {07e65061-0cc8-4f41-879e-0c4f5a1b4592}
-
-
- {2bb687cd-88a4-4477-8ee8-c0036b0b061c}
-
-
- {8931e7d2-2589-4697-8eab-cbfdd7b78102}
-
-
- {13d0cf3c-5d76-4e93-9dc9-20fc256f342e}
-
-
- {c8b09a9b-d7a9-493c-af76-2f774f1ae867}
-
-
- {8021a134-d200-4419-a9af-79c9330f7a50}
-
-
- {5b36b756-ba67-41b3-82e8-19bf529b98e7}
-
-
- {4792d1b4-2348-4cdc-9ac0-eced0c1e658e}
-
-
- {bb1839cf-8ea0-43fd-a025-fe01e7ddd29e}
-
-
- {f9664d77-a9cb-4eb7-9f86-b81860e8eac8}
-
-
- {5d888443-39c7-4937-aed7-f100b0efc8bc}
-
-
- {01c1e6ed-56bc-4d03-a1fd-1671ca1c2d90}
-
-
- {243e3b60-6f34-46d7-8ffb-18936f283239}
-
-
- {77829670-aaa9-4ff9-af8e-62ba7f507e32}
-
-
-
-
- Source Files\atomic
-
-
- Source Files\dso
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\file_io
-
-
- Source Files\locks
-
-
- Source Files\locks
-
-
- Source Files\locks
-
-
- Source Files\locks
-
-
- Source Files\memory
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\misc
-
-
- Source Files\mmap
-
-
- Source Files\mmap
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\network_io
-
-
- Source Files\passwd
-
-
- Source Files\random
-
-
- Source Files\random
-
-
- Source Files\random
-
-
- Source Files\shmem
-
-
- Source Files\strings
-
-
- Source Files\strings
-
-
- Source Files\strings
-
-
- Source Files\strings
-
-
- Source Files\strings
-
-
- Source Files\strings
-
-
- Source Files\tables
-
-
- Source Files\tables
-
-
- Source Files\threadproc
-
-
- Source Files\threadproc
-
-
- Source Files\threadproc
-
-
- Source Files\threadproc
-
-
- Source Files\time
-
-
- Source Files\time
-
-
- Source Files\time
-
-
- Source Files\user
-
-
- Source Files\user
-
-
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Private Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
- Public Header Files
-
-
-
-
-
-
\ No newline at end of file
diff --git a/libs/win32/iksemel/iksemel.2010.vcxproj.filters b/libs/win32/iksemel/iksemel.2010.vcxproj.filters
deleted file mode 100644
index 27382de28b..0000000000
--- a/libs/win32/iksemel/iksemel.2010.vcxproj.filters
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/ldns/ldns-lib/ldns-lib.2010.vcxproj.filters b/libs/win32/ldns/ldns-lib/ldns-lib.2010.vcxproj.filters
deleted file mode 100644
index c76a57ea6f..0000000000
--- a/libs/win32/ldns/ldns-lib/ldns-lib.2010.vcxproj.filters
+++ /dev/null
@@ -1,258 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Header Files
-
-
-
-
\ No newline at end of file
diff --git a/libs/win32/libcbt/libcbt.2010.vcxproj.filters b/libs/win32/libcbt/libcbt.2010.vcxproj.filters
deleted file mode 100644
index b5b7ad717d..0000000000
--- a/libs/win32/libcbt/libcbt.2010.vcxproj.filters
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
- {0a4bdcda-43d0-4907-83ce-01f3a87cdf59}
-
-
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
- include
-
-
-
diff --git a/libs/win32/libjpeg/libjpeg.2010.vcxproj.filters b/libs/win32/libjpeg/libjpeg.2010.vcxproj.filters
deleted file mode 100644
index 6a63450cb4..0000000000
--- a/libs/win32/libjpeg/libjpeg.2010.vcxproj.filters
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/libmp3lame/libmp3lame.2010.vcxproj.filters b/libs/win32/libmp3lame/libmp3lame.2010.vcxproj.filters
deleted file mode 100644
index 227b9295f0..0000000000
--- a/libs/win32/libmp3lame/libmp3lame.2010.vcxproj.filters
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-
-
- {f5641aca-51aa-43fe-94f1-8a3463d81fd2}
- c
-
-
- {35db8916-1b8b-4072-9a38-f62167263222}
- h
-
-
- {644a1cf1-f43b-4bd7-9e99-17500205a788}
- .nas
-
-
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
- Source
-
-
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
- Include
-
-
-
-
- Asm
-
-
- Asm
-
-
- Asm
-
-
- Asm
-
-
- Asm
-
-
- Asm
-
-
- Asm
-
-
- Asm
-
-
-
\ No newline at end of file
diff --git a/libs/win32/libogg/libogg.2010.vcxproj.filters b/libs/win32/libogg/libogg.2010.vcxproj.filters
deleted file mode 100644
index e769aa60a3..0000000000
--- a/libs/win32/libogg/libogg.2010.vcxproj.filters
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- {34e81afc-61be-40dc-b978-f4e20b9b1236}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {acd20529-ba9d-4ef9-8dc6-0c785bf72394}
- h;hpp;hxx;hm;inl
-
-
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/mpg123/libmpg123.2010.vcxproj.filters b/libs/win32/mpg123/libmpg123.2010.vcxproj.filters
deleted file mode 100644
index c2b9a2adca..0000000000
--- a/libs/win32/mpg123/libmpg123.2010.vcxproj.filters
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/opus/opus.2010.vcxproj.filters b/libs/win32/opus/opus.2010.vcxproj.filters
deleted file mode 100644
index 80b78c2044..0000000000
--- a/libs/win32/opus/opus.2010.vcxproj.filters
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
diff --git a/libs/win32/opus/opus.celt.2010.vcxproj.filters b/libs/win32/opus/opus.celt.2010.vcxproj.filters
deleted file mode 100644
index 9cdc36139e..0000000000
--- a/libs/win32/opus/opus.celt.2010.vcxproj.filters
+++ /dev/null
@@ -1,147 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
diff --git a/libs/win32/opus/opus.silk_common.2010.vcxproj.filters b/libs/win32/opus/opus.silk_common.2010.vcxproj.filters
deleted file mode 100644
index 000040c0ca..0000000000
--- a/libs/win32/opus/opus.silk_common.2010.vcxproj.filters
+++ /dev/null
@@ -1,315 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
diff --git a/libs/win32/opus/opus.silk_fixed.2010.vcxproj.filters b/libs/win32/opus/opus.silk_fixed.2010.vcxproj.filters
deleted file mode 100644
index d4c0785df5..0000000000
--- a/libs/win32/opus/opus.silk_fixed.2010.vcxproj.filters
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
diff --git a/libs/win32/opus/opus.silk_float.2010.vcxproj.filters b/libs/win32/opus/opus.silk_float.2010.vcxproj.filters
deleted file mode 100644
index 4e132e1222..0000000000
--- a/libs/win32/opus/opus.silk_float.2010.vcxproj.filters
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
diff --git a/libs/win32/pocketsphinx/pocketsphinx.2010.vcxproj.filters b/libs/win32/pocketsphinx/pocketsphinx.2010.vcxproj.filters
deleted file mode 100644
index 5d1afe56b6..0000000000
--- a/libs/win32/pocketsphinx/pocketsphinx.2010.vcxproj.filters
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
- {30a9f269-d81a-4ee2-adf0-8b402eb80fec}
-
-
- {d54e4410-06e1-4361-b050-7aced67dff22}
-
-
- {ebcc7cb5-8ca2-489c-b0e8-426058856ac8}
- ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/portaudio/portaudio.2010.vcxproj.filters b/libs/win32/portaudio/portaudio.2010.vcxproj.filters
deleted file mode 100644
index 3f126704a6..0000000000
--- a/libs/win32/portaudio/portaudio.2010.vcxproj.filters
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
- {27479ed0-78ba-43cc-8fb5-31de44bbc8da}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {8f150320-dccc-4b5c-b43c-b3b91378f721}
-
-
- {ac26acd3-797a-4668-a607-9694e9f10a16}
-
-
- {03878aa4-e6a3-4d56-81fe-f93794a1e3a1}
-
-
- {99774f7f-59c1-48cb-b72a-09d78537e6e4}
-
-
- {f47fabee-145b-4c98-9423-3d1bb7c1f3b3}
-
-
- {4ea57aa2-5b6b-4022-86b9-f3a02dd2284b}
-
-
- {9c44aff3-3f53-4117-8097-ee8b810caba2}
-
-
- {a20f633f-4213-4f4b-bd65-a8e49cf9f842}
-
-
- {ce9a362c-b700-4ea4-88b4-51c222789754}
-
-
- {6e72bafa-42f5-450a-90f4-0206faddcf3d}
- ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
-
-
- {5060bc7a-2362-400f-bda0-ae74643cea86}
- h;hpp;hxx;hm;inl
-
-
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\common
-
-
- Source Files\hostapi\ASIO
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\ASIO\ASIOSDK
-
-
- Source Files\hostapi\dsound
-
-
- Source Files\hostapi\dsound
-
-
- Source Files\hostapi\wmme
-
-
- Source Files\os\win
-
-
- Source Files\os\win
-
-
- Source Files\os\win
-
-
- Source Files\os\win
-
-
- Source Files\os\win
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Resource Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/pthread/pthread.2010.vcxproj.filters b/libs/win32/pthread/pthread.2010.vcxproj.filters
deleted file mode 100644
index e97efb4d6d..0000000000
--- a/libs/win32/pthread/pthread.2010.vcxproj.filters
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
- {eea9b312-399b-4998-b90c-92abe8150466}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {4fdd54b4-c31e-45b5-9b1a-09740020ae6f}
- h;hpp;hxx;hm;inl
-
-
- {d9df37d7-2c75-4916-bd8d-68f96aca4677}
- ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
-
-
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Resource Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/sofia/libsofia_sip_ua_static.2010.vcxproj.filters b/libs/win32/sofia/libsofia_sip_ua_static.2010.vcxproj.filters
deleted file mode 100644
index f15af0508f..0000000000
--- a/libs/win32/sofia/libsofia_sip_ua_static.2010.vcxproj.filters
+++ /dev/null
@@ -1,1025 +0,0 @@
-
-
-
-
- {e2fb9ce3-2e60-4ab8-a3f5-3acc0770c1fb}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {07c4085c-ab49-4d20-b4f4-bcd30b90ce73}
- su*.c
-
-
- {f302ae4a-7736-4563-b130-a88f67fb8420}
-
-
- {0bd6f7dc-1416-4eba-a83b-9728b0f5ff09}
- url*.c
-
-
- {7d12ef13-6833-4299-a002-4cfa700aab08}
- features*.c
-
-
- {503e3513-dc29-4a8d-968f-eb9b85e37831}
- bnf*.c
-
-
- {3680f590-87b0-43fc-93d4-2f055947608c}
- msg*.c
-
-
- {71b15ca9-401c-4587-8b0e-1cbd01761e4c}
-
-
- {777999e7-603f-4e2a-be29-0933e5d56c0d}
-
-
- {0b33e411-4f7e-4275-9d87-9d674a0a294f}
-
-
- {3e4054e5-d5cf-498d-afe4-feaee3b0df04}
-
-
- {92d282a8-1180-42cf-baea-3b826d7fc6da}
-
-
- {5dfb833d-6d12-41e4-9b84-35faae36eac9}
-
-
- {ce2f9d87-410e-4558-8fb0-564ae88af551}
-
-
- {a631bda8-f647-4fe1-92d1-6929887d822c}
-
-
- {e7f1aa28-e4cd-4563-bb81-46e761435d07}
-
-
- {c608280f-e56c-4f2b-94a8-052eac15f6e5}
-
-
- {00e7d1cc-bb3a-4e76-b6b1-11db89ed6701}
-
-
- {6b3531f0-aab2-44d2-8319-185e40c5c739}
-
-
- {c1b1203d-95fa-41e3-bdea-df2b9915c4b9}
-
-
- {ab318891-9ef3-4e56-baf7-8ce922a73e45}
- h;hpp;hxx;hm;inl
-
-
- {af1f4a99-a82d-4e82-b6ce-94a3cf7d1c37}
- su*.h
-
-
- {861289c7-2dec-4715-b158-2b3e00ab6040}
-
-
- {ee802dd4-b53b-43d1-bdf2-3d4343d37779}
-
-
- {bb636639-0b7f-41ed-a549-438d02a7d3ac}
- url*.h
-
-
- {d294ad27-4906-495b-8be4-5fc8aa291f3a}
- features*.h
-
-
- {566a4c1d-8cbb-4570-a8e8-3d1c6a6e3f71}
- bnf*.h
-
-
- {32c05478-a038-4b7d-bb4b-d33b82ab576d}
-
-
- {84dbad62-348f-4e67-a48e-d8d22526b4a8}
-
-
- {1441bb2b-94f7-4cbe-a4fc-82e7a88af588}
-
-
- {bce41b99-f79a-45ee-9634-d0859695014f}
-
-
- {ce670254-9dd6-4e3c-99ad-90f78c69d766}
-
-
- {3b978047-99c5-4fd4-99fe-200151c76fd1}
-
-
- {e9eaad41-1195-4c26-b813-d101ff7bf4f2}
-
-
- {9ec1016a-8c36-4a62-bd3f-e226b3a6b479}
-
-
- {4a392d00-3246-42cb-bff9-7b4f7889d8f2}
-
-
- {e8343a7f-eed9-4051-85b0-d02fd78c06f1}
-
-
- {17f68ee6-6245-4c14-8bda-387799431553}
-
-
- {b08ddec7-8118-4a9d-8606-c62ffcbafc97}
-
-
- {de42c0cc-17b9-4768-9981-abf8765ec30b}
-
-
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\su
-
-
- Source Files\ipt
-
-
- Source Files\ipt
-
-
- Source Files\ipt
-
-
- Source Files\url
-
-
- Source Files\url
-
-
- Source Files\url
-
-
- Source Files\features
-
-
- Source Files\bnf
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\msg
-
-
- Source Files\clib replacement
-
-
- Source Files\clib replacement
-
-
- Source Files\clib replacement
-
-
- Source Files\clib replacement
-
-
- Source Files\clib replacement
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\sip
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\http
-
-
- Source Files\nth
-
-
- Source Files\nth
-
-
- Source Files\nth
-
-
- Source Files\nth
-
-
- Source Files\sresolv
-
-
- Source Files\sresolv
-
-
- Source Files\sresolv
-
-
- Source Files\sresolv
-
-
- Source Files\sresolv
-
-
- Source Files\nea
-
-
- Source Files\nea
-
-
- Source Files\nea
-
-
- Source Files\nea
-
-
- Source Files\nea
-
-
- Source Files\nea
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\iptsec
-
-
- Source Files\stun
-
-
- Source Files\stun
-
-
- Source Files\stun
-
-
- Source Files\stun
-
-
- Source Files\stun
-
-
- Source Files\stun
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nta
-
-
- Source Files\nta
-
-
- Source Files\nta
-
-
- Source Files\nta
-
-
- Source Files\nta
-
-
- Source Files\nta
-
-
- Source Files\nta
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\tport
-
-
- Source Files\sdp
-
-
- Source Files\sdp
-
-
- Source Files\sdp
-
-
- Source Files\sdp
-
-
- Source Files\sdp
-
-
- Source Files\soa
-
-
- Source Files\soa
-
-
- Source Files\soa
-
-
- Source Files\soa
-
-
-
-
- Source Files\stun
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\nua
-
-
- Source Files\tport
-
-
- Source Files\soa
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\su headers
-
-
- Header Files\win32 headers
-
-
- Header Files\win32 headers
-
-
- Header Files\win32 headers
-
-
- Header Files\ipt headers
-
-
- Header Files\ipt headers
-
-
- Header Files\ipt headers
-
-
- Header Files\url headers
-
-
- Header Files\url headers
-
-
- Header Files\url headers
-
-
- Header Files\features headers
-
-
- Header Files\bnf headers
-
-
- Header Files\bnf headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\msg headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\sip headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\http headers
-
-
- Header Files\nth headers
-
-
- Header Files\nth headers
-
-
- Header Files\sresolv headers
-
-
- Header Files\sresolv headers
-
-
- Header Files\sresolv headers
-
-
- Header Files\sresolv headers
-
-
- Header Files\sresolv headers
-
-
- Header Files\sresolv headers
-
-
- Header Files\nea headers
-
-
- Header Files\nea headers
-
-
- Header Files\nea headers
-
-
- Header Files\iptsec headers
-
-
- Header Files\iptsec headers
-
-
- Header Files\iptsec headers
-
-
- Header Files\iptsec headers
-
-
- Header Files\iptsec headers
-
-
- Header Files\iptsec headers
-
-
- Header Files\stun headers
-
-
- Header Files\stun headers
-
-
- Header Files\stun headers
-
-
- Header Files\nua headers
-
-
- Header Files\nua headers
-
-
- Header Files\nta headers
-
-
- Header Files\nta headers
-
-
- Header Files\nta headers
-
-
- Header Files\nta headers
-
-
- Header Files\nta headers
-
-
- Header Files\nta headers
-
-
- Header Files\tport headers
-
-
- Header Files\tport headers
-
-
- Header Files\tport headers
-
-
- Header Files\tport headers
-
-
- Header Files\sdp headers
-
-
- Header Files\sdp headers
-
-
- Header Files\soa headers
-
-
- Header Files\soa headers
-
-
- Header Files\soa headers
-
-
-
\ No newline at end of file
diff --git a/libs/win32/speex/libspeex.2010.vcxproj.filters b/libs/win32/speex/libspeex.2010.vcxproj.filters
deleted file mode 100644
index e799cdc160..0000000000
--- a/libs/win32/speex/libspeex.2010.vcxproj.filters
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/sphinxbase/sphinxbase.2010.vcxproj.filters b/libs/win32/sphinxbase/sphinxbase.2010.vcxproj.filters
deleted file mode 100644
index 510e13f5f3..0000000000
--- a/libs/win32/sphinxbase/sphinxbase.2010.vcxproj.filters
+++ /dev/null
@@ -1,354 +0,0 @@
-
-
-
-
- {5ce23960-a856-416b-a477-cf2d724bd43e}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {8d90e900-0942-4a25-b48a-b8dcd4382c28}
- h;hpp;hxx;hm;inl
-
-
- {cd06b891-4b88-427f-9f62-187bfead9b0f}
- ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/sqlite/sqlite.2010.vcxproj.filters b/libs/win32/sqlite/sqlite.2010.vcxproj.filters
deleted file mode 100644
index fbeb745a62..0000000000
--- a/libs/win32/sqlite/sqlite.2010.vcxproj.filters
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
-
-
- Source Files
-
-
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/udns/libudns.2010.vcxproj.filters b/libs/win32/udns/libudns.2010.vcxproj.filters
deleted file mode 100644
index f4e9018f39..0000000000
--- a/libs/win32/udns/libudns.2010.vcxproj.filters
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/xmlrpc-c/abyss.2010.vcxproj.filters b/libs/win32/xmlrpc-c/abyss.2010.vcxproj.filters
deleted file mode 100644
index dc60f95547..0000000000
--- a/libs/win32/xmlrpc-c/abyss.2010.vcxproj.filters
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
- {8ac4971f-a9ba-4930-a7e3-b291ad24d6ca}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
- {05489d43-6c6b-4bb8-95db-414e8137ee9e}
- h;hpp;hxx;hm;inl
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/xmlrpc-c/xmlrpc.2010.vcxproj.filters b/libs/win32/xmlrpc-c/xmlrpc.2010.vcxproj.filters
deleted file mode 100644
index 8b6a1834a1..0000000000
--- a/libs/win32/xmlrpc-c/xmlrpc.2010.vcxproj.filters
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-
-
- {7ca2b8b9-bf59-4407-aedf-588e548fe34a}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;cc
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/libs/win32/xmlrpc-c/xmltok.2010.vcxproj.filters b/libs/win32/xmlrpc-c/xmltok.2010.vcxproj.filters
deleted file mode 100644
index edcb1d2353..0000000000
--- a/libs/win32/xmlrpc-c/xmltok.2010.vcxproj.filters
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- Source Files
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- {e8ec3017-8580-49f6-b5b5-4ba1c66c9b58}
-
-
- {cf3bec2c-9e12-4a6c-8d1c-495721118adf}
-
-
-
\ No newline at end of file
diff --git a/src/include/cc.h b/src/include/cc.h
index d2635f3b1c..e92d2cd6e9 100644
--- a/src/include/cc.h
+++ b/src/include/cc.h
@@ -1,4 +1,4 @@
-const char *cc = ".=======================================================================================================.\n| ____ _ ____ |\n| / ___| |_ _ ___ / ___|___ _ __ |\n| | | | | | | |/ _ \\ | / _ \\| '_ \\ |\n| | |___| | |_| | __/ |__| (_) | | | | |\n| \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |\n| |\n| _____ _ _ ____ __ |\n| |_ _|__| | ___ _ __ | |__ ___ _ __ _ _ / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |\n| | |/ _ \\ |/ _ \\ '_ \\| '_ \\ / _ \\| '_ \\| | | | | | / _ \\| '_ \\| |_ / _ \\ '__/ _ \\ '_ \\ / __/ _ \\ |\n| | | __/ | __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |\n| |_|\\___|_|\\___| .__/|_| |_|\\___/|_| |_|\\__, | \\____\\___/|_| |_|_| \\___|_| \\___|_| |_|\\___\\___| |\n| |_| |___/ |\n| _____ _ _ |\n| | ____|_ _____ _ __ _ _ / \\ _ _ __ _ _ _ ___| |_ |\n| | _| \\ \\ / / _ \\ '__| | | | / _ \\| | | |/ _` | | | / __| __| |\n| | |___ \\ V / __/ | | |_| | / ___ \\ |_| | (_| | |_| \\__ \\ |_ |\n| |_____| \\_/ \\___|_| \\__, | /_/ \\_\\__,_|\\__, |\\__,_|___/\\__| |\n| |___/ |___/ |\n| ____ _ ____ |\n| __ ____ ____ __ / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |\n| \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / | | | | | | |/ _ \\ | / _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| \\ V V / \\ V V / \\ V V / _ | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |\n| \\_/\\_/ \\_/\\_/ \\_/\\_/ (_) \\____|_|\\__,_|\\___|\\____\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.=======================================================================================================.\n";
+const char *cc = ".=======================================================================================================.\n| _ _ ____ _ ____ |\n| / \\ _ __ _ __ _ _ __ _| | / ___| |_ _ ___ / ___|___ _ __ |\n| / _ \\ | '_ \\| '_ \\| | | |/ _` | | | | | | | | |/ _ \\ | / _ \\| '_ \\ |\n| / ___ \\| | | | | | | |_| | (_| | | | |___| | |_| | __/ |__| (_) | | | | |\n| /_/ \\_\\_| |_|_| |_|\\__,_|\\__,_|_| \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |\n| |\n| ____ _____ ____ ____ __ |\n| | _ \\_ _/ ___| / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ |\n| | |_) || || | | | / _ \\| '_ \\| |_ / _ \\ '__/ _ \\ '_ \\ / __/ _ \\ |\n| | _ < | || |___ | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ |\n| |_| \\_\\|_| \\____| \\____\\___/|_| |_|_| \\___|_| \\___|_| |_|\\___\\___| |\n| |\n| ____ _ ____ |\n| / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ |\n| | | | | | | |/ _ \\ | / _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | |\n| \\____|_|\\__,_|\\___|\\____\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.=======================================================================================================.\n";
const char *cc_s = ".===============================================================.\n| _ |\n| ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.===============================================================.\n";
diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h
index 39f02339c8..a142927568 100644
--- a/src/include/switch_ivr.h
+++ b/src/include/switch_ivr.h
@@ -909,7 +909,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
#define switch_ivr_phrase_macro(session, macro_name, data, lang, args) switch_ivr_phrase_macro_event(session, macro_name, data, NULL, lang, args)
SWITCH_DECLARE(void) switch_ivr_delay_echo(switch_core_session_t *session, uint32_t delay_ms);
SWITCH_DECLARE(switch_status_t) switch_ivr_find_bridged_uuid(const char *uuid, char *b_uuid, switch_size_t blen);
-SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg);
+SWITCH_DECLARE(switch_status_t) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg);
SWITCH_DECLARE(void) switch_ivr_park_session(switch_core_session_t *session);
SWITCH_DECLARE(switch_status_t) switch_ivr_wait_for_answer(switch_core_session_t *session, switch_core_session_t *peer_session);
diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h
index dd5adcbd89..4b7d949579 100644
--- a/src/include/switch_utils.h
+++ b/src/include/switch_utils.h
@@ -1084,6 +1084,61 @@ static inline int32_t switch_parse_bandwidth_string(const char *bwv)
return (int32_t) roundf(bw);
}
+static inline uint32_t switch_parse_cpu_string(const char *cpu)
+{
+ int cpu_count = switch_core_cpu_count();
+ int ncpu = cpu_count;
+
+ if (!cpu) return 1;
+
+ if (!strcasecmp(cpu, "auto")) {
+ if (cpu_count > 4) return 4;
+ if (cpu_count <= 2) return 1;
+
+ return (uint32_t)(cpu_count / 2);
+ }
+
+ if (!strncasecmp(cpu, "cpu/", 4)) { /* cpu/2 or cpu/2/ */
+ const char *has_max = cpu;
+ float divisor;
+ int max = cpu_count;
+
+ cpu +=4;
+
+ has_max = strchr(cpu, '/');
+
+ if (has_max > cpu) {
+ max = atoi(has_max + 1);
+ }
+
+ divisor = (float)atof(cpu);
+
+ if (divisor <= 0) divisor = 1;
+
+ ncpu = (int)(cpu_count / divisor);
+
+ if (ncpu <= 0) return 1;
+
+ if (ncpu > max) return (uint32_t)max;
+
+ return (uint32_t)ncpu;
+ } else if (!strcasecmp(cpu, "cpu")) {
+ ncpu = cpu_count;
+ } else {
+ ncpu = atoi(cpu);
+
+ if (cpu && strrchr(cpu, '%')) {
+ ncpu = (int) (cpu_count * ((float)ncpu / 100));
+ }
+ }
+
+ if (ncpu > cpu_count) return (uint32_t)cpu_count;
+
+ if (ncpu <= 0) return 1;
+
+ return ncpu;
+}
+
static inline int switch_needs_url_encode(const char *s)
{
const char hex[] = "0123456789ABCDEF";
diff --git a/src/mod/applications/mod_av/autoload_configs/av.conf.xml b/src/mod/applications/mod_av/autoload_configs/av.conf.xml
new file mode 100644
index 0000000000..7d0390646a
--- /dev/null
+++ b/src/mod/applications/mod_av/autoload_configs/av.conf.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c
index 5994e48aba..4614f23ee5 100644
--- a/src/mod/applications/mod_av/avcodec.c
+++ b/src/mod/applications/mod_av/avcodec.c
@@ -38,12 +38,15 @@
#include
#include
-#define SLICE_SIZE SWITCH_DEFAULT_VIDEO_SIZE
+int SLICE_SIZE = SWITCH_DEFAULT_VIDEO_SIZE;
+
#define H264_NALU_BUFFER_SIZE 65536
-#define MAX_NALUS 128
+#define MAX_NALUS 256
#define H263_MODE_B // else Mode A only
+#define KEY_FRAME_MIN_FREQ 250000
SWITCH_MODULE_LOAD_FUNCTION(mod_avcodec_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_avcodec_shutdown);
/* ff_avc_find_startcode is not exposed in the ffmpeg lib but you can use it
Either include the avc.h which available in the ffmpeg source, or
@@ -194,6 +197,48 @@ typedef struct h264_codec_context_s {
static uint8_t ff_input_buffer_padding[FF_INPUT_BUFFER_PADDING_SIZE] = { 0 };
+#define MAX_CODECS 4
+
+typedef struct avcodec_profile_s {
+ char name[20];
+ int decoder_thread_count;
+ AVCodecContext ctx;
+ switch_event_t *options;
+} avcodec_profile_t;
+
+struct avcodec_globals {
+ int debug;
+ uint32_t max_bitrate;
+ uint32_t rtp_slice_size;
+ uint32_t key_frame_min_freq;
+
+ avcodec_profile_t profiles[MAX_CODECS];
+};
+
+struct avcodec_globals avcodec_globals = { 0 };
+
+char *CODEC_MAPS[] = {
+ "H263",
+ "H263+",
+ "H264",
+ "H265",
+ NULL
+};
+
+static int get_codec_index(const char *cstr)
+{
+ int i;
+
+ for (i = 0; ; i++) {
+ if (!strcasecmp(cstr, CODEC_MAPS[i])) {
+ return i;
+ }
+ }
+
+ abort();
+ return -1;
+}
+
static switch_status_t buffer_h264_nalu(h264_codec_context_t *context, switch_frame_t *frame)
{
uint8_t nalu_type = 0;
@@ -827,9 +872,9 @@ static switch_status_t consume_nalu(h264_codec_context_t *context, switch_frame_
static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t width, uint32_t height)
{
- int sane = 0;
- int threads = switch_core_cpu_count();
-
+ int fps = 15;
+ avcodec_profile_t *profile = NULL;
+
#ifdef NVENC_SUPPORT
if (!context->encoder) {
if (context->av_codec_id == AV_CODEC_ID_H264) {
@@ -859,6 +904,20 @@ static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t widt
return SWITCH_STATUS_FALSE;
}
+ if (context->av_codec_id == AV_CODEC_ID_H263) {
+ profile = &avcodec_globals.profiles[get_codec_index("H263")];
+ } else if (context->av_codec_id == AV_CODEC_ID_H263P) {
+ profile = &avcodec_globals.profiles[get_codec_index("H263+")];
+ } else if (context->av_codec_id == AV_CODEC_ID_H264) {
+ profile = &avcodec_globals.profiles[get_codec_index("H264")];
+#ifdef AV_CODEC_ID_H265
+ } else if (context->av_codec_id == AV_CODEC_ID_H265) {
+ profile = &avcodec_globals.profiles[get_codec_index("H265")];
+#endif
+ }
+
+ if (!profile) return SWITCH_STATUS_FALSE;
+
if (context->encoder_ctx) {
if (avcodec_is_open(context->encoder_ctx)) {
avcodec_close(context->encoder_ctx);
@@ -895,28 +954,31 @@ static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t widt
context->bandwidth = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 1, fps);
}
- sane = switch_calc_bitrate(1920, 1080, 3, 60);
-
- if (context->bandwidth > sane) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "BITRATE TRUNCATED TO %d\n", sane);
- context->bandwidth = sane;
+ if (context->bandwidth > avcodec_globals.max_bitrate) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "BITRATE TRUNCATED TO %d\n", avcodec_globals.max_bitrate);
+ context->bandwidth = avcodec_globals.max_bitrate;
}
- if (threads > 4) threads = 4;
- context->bandwidth *= 4;
+ context->bandwidth *= 3;
+ fps = context->codec_settings.video.fps;
+
+ if (!fps) fps = 20;
+
context->encoder_ctx->bit_rate = context->bandwidth * 1024;
-
+ context->encoder_ctx->rc_min_rate = context->encoder_ctx->bit_rate;
+ context->encoder_ctx->rc_max_rate = context->encoder_ctx->bit_rate;
+ context->encoder_ctx->rc_buffer_size = context->encoder_ctx->bit_rate;
+ context->encoder_ctx->qcompress = 0.6;
+ context->encoder_ctx->gop_size = 1000;
+ context->encoder_ctx->keyint_min = 1000;
+
context->encoder_ctx->width = context->codec_settings.video.width;
context->encoder_ctx->height = context->codec_settings.video.height;
- /* frames per second */
context->encoder_ctx->time_base = (AVRational){1, 90};
- context->encoder_ctx->max_b_frames = 0;
+ context->encoder_ctx->max_b_frames = profile->ctx.max_b_frames;
context->encoder_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
- context->encoder_ctx->thread_count = threads;
-
- context->encoder_ctx->rc_max_rate = context->bandwidth * 1024;
- context->encoder_ctx->rc_buffer_size = context->bandwidth * 1024 * 4;
+ context->encoder_ctx->thread_count = profile->ctx.thread_count;
if (context->av_codec_id == AV_CODEC_ID_H263 || context->av_codec_id == AV_CODEC_ID_H263P) {
#ifndef H263_MODE_B
@@ -934,48 +996,41 @@ FF_DISABLE_DEPRECATION_WARNINGS
context->encoder_ctx->rtp_callback = rtp_callback;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
- context->encoder_ctx->rc_min_rate = context->encoder_ctx->rc_max_rate;
context->encoder_ctx->opaque = context;
av_opt_set_int(context->encoder_ctx->priv_data, "mb_info", SLICE_SIZE - 8, 0);
} else if (context->av_codec_id == AV_CODEC_ID_H264) {
- context->encoder_ctx->profile = FF_PROFILE_H264_BASELINE;
- context->encoder_ctx->level = 31;
+ context->encoder_ctx->profile = profile->ctx.profile;
+ context->encoder_ctx->level = profile->ctx.level;
if (context->hw_encoder) {
av_opt_set(context->encoder_ctx->priv_data, "preset", "llhp", 0);
av_opt_set_int(context->encoder_ctx->priv_data, "2pass", 1, 0);
} else {
- av_opt_set_int(context->encoder_ctx->priv_data, "intra-refresh", 1, 0);
- av_opt_set(context->encoder_ctx->priv_data, "preset", "veryfast", 0);
- av_opt_set(context->encoder_ctx->priv_data, "tune", "animation+zerolatency", 0);
- av_opt_set(context->encoder_ctx->priv_data, "profile", "baseline", 0);
- av_opt_set_int(context->encoder_ctx->priv_data, "slice-max-size", SLICE_SIZE, 0);
+ if (profile->options) {
+ switch_event_header_t *hp;
-
- context->encoder_ctx->colorspace = AVCOL_SPC_RGB;
- context->encoder_ctx->color_range = AVCOL_RANGE_JPEG;
+ for (hp = profile->options->headers; hp; hp = hp->next) {
+ // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: %s\n", hp->name, hp->value);
+ av_opt_set(context->encoder_ctx->priv_data, hp->name, hp->value, 0);
+ }
+ }
- /*
- av_opt_set_int(context->encoder_ctx->priv_data, "sc_threshold", 40, 0);
- av_opt_set_int(context->encoder_ctx->priv_data, "b_strategy", 1, 0);
- av_opt_set_int(context->encoder_ctx->priv_data, "crf", 18, 0);
+ context->encoder_ctx->colorspace = profile->ctx.colorspace;
+ context->encoder_ctx->color_range = profile->ctx.color_range;
- // libx264-medium.ffpreset preset
-
- context->encoder_ctx->flags|=CODEC_FLAG_LOOP_FILTER; // flags=+loop
- context->encoder_ctx->me_cmp|= 1; // cmp=+chroma, where CHROMA = 1
- context->encoder_ctx->me_range = 21; // me_range=16
- context->encoder_ctx->max_b_frames = 3; // bf=3
- //context->encoder_ctx->refs = 3; // refs=3
- context->encoder_ctx->gop_size = 250; // g=250
- context->encoder_ctx->keyint_min = 25; // keyint_min=25
- context->encoder_ctx->i_quant_factor = 0.71; // i_qfactor=0.71
- context->encoder_ctx->b_quant_factor = 0.76923078; // Qscale difference between P-frames and B-frames.
- context->encoder_ctx->qcompress = 0;//0.6; // qcomp=0.6
- context->encoder_ctx->qmin = 10; // qmin=10
- context->encoder_ctx->qmax = 51; // qmax=51
- context->encoder_ctx->max_qdiff = 4; // qdiff=4
- */
+ context->encoder_ctx->flags |= profile->ctx.flags; // CODEC_FLAG_LOOP_FILTER; // flags=+loop
+ if (profile->ctx.me_cmp >= 0) context->encoder_ctx->me_cmp = profile->ctx.me_cmp; // cmp=+chroma, where CHROMA = 1
+ if (profile->ctx.me_range >= 0) context->encoder_ctx->me_range = profile->ctx.me_range;
+ if (profile->ctx.max_b_frames >= 0) context->encoder_ctx->max_b_frames = profile->ctx.max_b_frames;
+ if (profile->ctx.refs >= 0) context->encoder_ctx->refs = profile->ctx.refs;
+ if (profile->ctx.gop_size >= 0) context->encoder_ctx->gop_size = profile->ctx.gop_size;
+ if (profile->ctx.keyint_min >= 0) context->encoder_ctx->keyint_min = profile->ctx.keyint_min;
+ if (profile->ctx.i_quant_factor >= 0) context->encoder_ctx->i_quant_factor = profile->ctx.i_quant_factor;
+ if (profile->ctx.b_quant_factor >= 0) context->encoder_ctx->b_quant_factor = profile->ctx.b_quant_factor;
+ if (profile->ctx.qcompress >= 0) context->encoder_ctx->qcompress = profile->ctx.qcompress;
+ if (profile->ctx.qmin >= 0) context->encoder_ctx->qmin = profile->ctx.qmin;
+ if (profile->ctx.qmax >= 0) context->encoder_ctx->qmax = profile->ctx.qmax;
+ if (profile->ctx.max_qdiff >= 0) context->encoder_ctx->max_qdiff = profile->ctx.max_qdiff;
}
}
@@ -991,7 +1046,7 @@ static switch_status_t switch_h264_init(switch_codec_t *codec, switch_codec_flag
{
int encoding, decoding;
h264_codec_context_t *context = NULL;
- int threads = switch_core_cpu_count();
+ avcodec_profile_t *profile = NULL;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
@@ -1014,12 +1069,17 @@ static switch_status_t switch_h264_init(switch_codec_t *codec, switch_codec_flag
if (!strcmp(codec->implementation->iananame, "H263")) {
context->av_codec_id = AV_CODEC_ID_H263;
+ profile = &avcodec_globals.profiles[get_codec_index("H263")];
} else if (!strcmp(codec->implementation->iananame, "H263-1998")) {
context->av_codec_id = AV_CODEC_ID_H263P;
+ profile = &avcodec_globals.profiles[get_codec_index("H263+")];
} else {
context->av_codec_id = AV_CODEC_ID_H264;
+ profile = &avcodec_globals.profiles[get_codec_index("H264")];
}
+ switch_assert(profile);
+
if (decoding) {
context->decoder = avcodec_find_decoder(context->av_codec_id);
@@ -1034,11 +1094,9 @@ static switch_status_t switch_h264_init(switch_codec_t *codec, switch_codec_flag
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "codec: id=%d %s\n", context->decoder->id, context->decoder->long_name);
-
- if (threads > 4) threads = 4;
context->decoder_ctx = avcodec_alloc_context3(context->decoder);
- //context->decoder_ctx->thread_count = threads;
+ context->decoder_ctx->thread_count = profile->decoder_thread_count;
if (avcodec_open2(context->decoder_ctx, context->decoder, NULL) < 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error openning codec\n");
goto error;
@@ -1239,6 +1297,10 @@ GCC_DIAG_ON(deprecated-declarations)
while (!(*p++)) ; /* eat the sync bytes, what ever 0 0 1 or 0 0 0 1 */
context->nalus[i].start = p;
context->nalus[i].eat = p;
+
+ if (mod_av_globals.debug && (*p & 0x1f) == 7) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "KEY FRAME GENERATED\n");
+ }
} else {
context->nalus[i].len = p - context->nalus[i].start;
while (!(*p++)) ; /* eat the sync bytes, what ever 0 0 1 or 0 0 0 1 */
@@ -1550,10 +1612,343 @@ void show_codecs(switch_stream_handle_t *stream)
av_free(codecs);
}
+#define UINTVAL(v) (v > 0 ? v : 0);
+
+static void load_config()
+{
+ switch_xml_t cfg = NULL, xml = NULL;
+ int i;
+
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H263")].name, "H263");
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H263+")].name, "H263+");
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H264")].name, "H264");
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H265")].name, "H265");
+
+ for (i = 0; i < MAX_CODECS; i++) {
+ avcodec_profile_t *profile = &avcodec_globals.profiles[i];
+
+ profile->ctx.colorspace = AVCOL_SPC_RGB;
+ profile->ctx.color_range = AVCOL_RANGE_JPEG;
+ profile->ctx.flags = 0;
+ profile->ctx.me_cmp = -1;
+ profile->ctx.me_range = -1;
+ profile->ctx.max_b_frames = -1;
+ profile->ctx.refs = -1;
+ profile->ctx.gop_size = -1;
+ profile->ctx.keyint_min = -1;
+ profile->ctx.i_quant_factor = -1;
+ profile->ctx.b_quant_factor = -1;
+ profile->ctx.qcompress = -1;
+ profile->ctx.qmin = -1;
+ profile->ctx.qmax = -1;
+ profile->ctx.max_qdiff = -1;
+
+ if (!strcasecmp(CODEC_MAPS[i], "H264")) {
+ profile->ctx.profile = FF_PROFILE_H264_BASELINE;
+ profile->ctx.level = 41;
+ }
+ }
+
+ avcodec_globals.max_bitrate = 0;
+
+ xml = switch_xml_open_cfg("avcodec.conf", &cfg, NULL);
+
+ if (xml) {
+ switch_xml_t settings = switch_xml_child(cfg, "settings");
+ switch_xml_t profiles = switch_xml_child(cfg, "profiles");
+
+ if (settings) {
+ switch_xml_t param;
+
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ const char *name = switch_xml_attr(param, "name");
+ const char *value = switch_xml_attr(param, "value");
+
+ if (zstr(name) || zstr(value)) continue;
+
+ if (!strcmp(name, "max-bitrate")) {
+ avcodec_globals.max_bitrate = switch_parse_bandwidth_string(value);
+ } else if (!strcmp(name, "rtp-slice-size")) {
+ int val = atoi(value);
+ avcodec_globals.rtp_slice_size = UINTVAL(val);
+ } else if (!strcmp(name, "key-frame-min-freq")) {
+ int val = atoi(value);
+ avcodec_globals.key_frame_min_freq = UINTVAL(val);
+ avcodec_globals.key_frame_min_freq *= 1000;
+ } else if (!strcmp(name, "dec-threads")) {
+ int i;
+ uint threads = switch_parse_cpu_string(value);
+
+ for (i = 0; i < MAX_CODECS; i++) {
+ avcodec_globals.profiles[i].decoder_thread_count = threads;
+ }
+ } else if (!strcmp(name, "enc-threads")) {
+ int i;
+ uint threads = switch_parse_cpu_string(value);
+
+ for (i = 0; i < MAX_CODECS; i++) {
+ avcodec_globals.profiles[i].ctx.thread_count = threads;
+ }
+ } else if (!strcasecmp(name, "h263-profile")) {
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H263")].name, value);
+ } else if (!strcasecmp(name, "h263+-profile")) {
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H263+")].name, value);
+ } else if (!strcasecmp(name, "h264-profile")) {
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H264")].name, value);
+ } else if (!strcasecmp(name, "h265-profile")) {
+ switch_set_string(avcodec_globals.profiles[get_codec_index("H265")].name, value);
+ }
+ }
+ }
+
+ if (profiles) {
+ switch_xml_t profile = switch_xml_child(profiles, "profile");
+
+ for (; profile; profile = profile->next) {
+ switch_xml_t options = switch_xml_child(profile, "options");
+ switch_xml_t param = NULL;
+ const char *profile_name = switch_xml_attr(profile, "name");
+ avcodec_profile_t *aprofile = NULL;
+ AVCodecContext *ctx = NULL;
+ int i;
+
+ if (zstr(profile_name)) continue;
+
+ for (i = 0; i < MAX_CODECS; i++) {
+ if (!strcmp(profile_name, avcodec_globals.profiles[i].name)) {
+ aprofile = &avcodec_globals.profiles[i];
+ ctx = &aprofile->ctx;
+ break;
+ }
+ }
+
+ if (!ctx) continue;
+
+ for (param = switch_xml_child(profile, "param"); param; param = param->next) {
+ const char *name = switch_xml_attr(param, "name");
+ const char *value = switch_xml_attr(param, "value");
+ int val;
+
+ if (zstr(name) || zstr(value)) continue;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: %s = %s\n", profile_name, name, value);
+
+ val = atoi(value);
+
+ if (!strcmp(name, "dec-threads")) {
+ aprofile->decoder_thread_count = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "enc-threads")) {
+ ctx->thread_count = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "profile")) {
+ ctx->profile = UINTVAL(val);
+
+ if (ctx->profile == 0 && !strcasecmp(CODEC_MAPS[i], "H264")) {
+ if (!strcasecmp(value, "baseline")) {
+ ctx->profile = FF_PROFILE_H264_BASELINE;
+ } else if (!strcasecmp(value, "main")) {
+ ctx->profile = FF_PROFILE_H264_MAIN;
+ } else if (!strcasecmp(value, "high")) {
+ ctx->profile = FF_PROFILE_H264_HIGH;
+ }
+ }
+ } else if (!strcmp(name, "level")) {
+ ctx->level = UINTVAL(val);
+ } else if (!strcmp(name, "timebase")) {
+ int num = 0;
+ int den = 0;
+ char *slash = strchr(value, '/');
+
+ num = UINTVAL(val);
+
+ if (slash) {
+ slash++;
+ den = atoi(slash);
+
+ if (den < 0) den = 0;
+ }
+
+ if (num && den) {
+ ctx->time_base.num = num;
+ ctx->time_base.den = den;
+ }
+ } else if (!strcmp(name, "flags")) {
+ char *s = strdup(value);
+ int flags = 0;
+
+ if (s) {
+ int argc;
+ char *argv[20];
+ int i;
+
+ argc = switch_separate_string(s, '|', argv, (sizeof(argv) / sizeof(argv[0])));
+
+ for (i = 0; i < argc; i++) {
+ if (!strcasecmp(argv[i], "UNALIGNED")) {
+#ifdef AV_CODEC_FLAG_UNALIGNED
+ flags |= AV_CODEC_FLAG_UNALIGNED;
+#endif
+ } else if (!strcasecmp(argv[i], "QSCALE")) {
+#ifdef AV_CODEC_FLAG_QSCALE
+ flags |= AV_CODEC_FLAG_QSCALE;
+#endif
+ } else if (!strcasecmp(argv[i], "4MV")) {
+#ifdef AV_CODEC_FLAG_4MV
+ flags |= AV_CODEC_FLAG_4MV;
+#endif
+ } else if (!strcasecmp(argv[i], "CORRUPT")) {
+#ifdef AV_CODEC_FLAG_OUTPUT_CORRUPT
+ flags |= AV_CODEC_FLAG_OUTPUT_CORRUPT;
+#endif
+ } else if (!strcasecmp(argv[i], "QPEL")) {
+#ifdef AV_CODEC_FLAG_QPEL
+ flags |= AV_CODEC_FLAG_QPEL;
+#endif
+ } else if (!strcasecmp(argv[i], "PASS1")) {
+#ifdef AV_CODEC_FLAG_PASS1
+ flags |= AV_CODEC_FLAG_PASS1;
+#endif
+ } else if (!strcasecmp(argv[i], "PASS2")) {
+#ifdef AV_CODEC_FLAG_PASS2
+ flags |= AV_CODEC_FLAG_PASS2;
+#endif
+ } else if (!strcasecmp(argv[i], "FILTER")) {
+#ifdef AV_CODEC_FLAG_LOOP_FILTER
+ flags |= AV_CODEC_FLAG_LOOP_FILTER;
+#endif
+ } else if (!strcasecmp(argv[i], "GRAY")) {
+#ifdef AV_CODEC_FLAG_GRAY
+ flags |= AV_CODEC_FLAG_GRAY;
+#endif
+ } else if (!strcasecmp(argv[i], "PSNR")) {
+#ifdef AV_CODEC_FLAG_PSNR
+ flags |= AV_CODEC_FLAG_PSNR;
+#endif
+ } else if (!strcasecmp(argv[i], "TRUNCATED")) {
+#ifdef AV_CODEC_FLAG_TRUNCATED
+ flags |= AV_CODEC_FLAG_TRUNCATED;
+#endif
+ } else if (!strcasecmp(argv[i], "INTERLACED_DCT")) {
+#ifdef AV_CODEC_FLAG_INTERLACED_DCT
+ flags |= AV_CODEC_FLAG_INTERLACED_DCT;
+#endif
+ } else if (!strcasecmp(argv[i], "LOW_DELAY")) {
+#ifdef AV_CODEC_FLAG_LOW_DELAY
+ flags |= AV_CODEC_FLAG_LOW_DELAY;
+#endif
+ } else if (!strcasecmp(argv[i], "HEADER")) {
+#ifdef AV_CODEC_FLAG_GLOBAL_HEADER
+ flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+#endif
+ } else if (!strcasecmp(argv[i], "BITEXACT")) {
+#ifdef AV_CODEC_FLAG_BITEXACT
+ flags |= AV_CODEC_FLAG_BITEXACT;
+#endif
+ } else if (!strcasecmp(argv[i], "AC_PRED")) {
+#ifdef AV_CODEC_FLAG_AC_PRED
+ flags |= AV_CODEC_FLAG_AC_PRED;
+#endif
+ } else if (!strcasecmp(argv[i], "INTERLACED_ME")) {
+#ifdef AV_CODEC_FLAG_INTERLACED_ME
+ flags |= AV_CODEC_FLAG_INTERLACED_ME;
+#endif
+ } else if (!strcasecmp(argv[i], "CLOSED_GOP")) {
+#ifdef AV_CODEC_FLAG_CLOSED_GOP
+ flags |= AV_CODEC_FLAG_CLOSED_GOP;
+#endif
+ }
+ }
+
+ free(s);
+ ctx->flags = flags;
+ }
+ } else if (!strcmp(name, "me-cmp")) {
+ ctx->me_cmp = UINTVAL(val);
+ } else if (!strcmp(name, "me-range")) {
+ ctx->me_range = UINTVAL(val);
+ } else if (!strcmp(name, "max-b-frames")) {
+ ctx->max_b_frames = UINTVAL(val);
+ } else if (!strcmp(name, "refs")) {
+ ctx->refs = UINTVAL(val);
+ } else if (!strcmp(name, "gop-size")) {
+ ctx->gop_size = UINTVAL(val);
+ } else if (!strcmp(name, "keyint-min")) {
+ ctx->keyint_min = UINTVAL(val);
+ } else if (!strcmp(name, "i-quant-factor")) {
+ ctx->i_quant_factor = UINTVAL(val);
+ } else if (!strcmp(name, "b-quant-factor")) {
+ ctx->b_quant_factor = UINTVAL(val);
+ } else if (!strcmp(name, "qcompress")) {
+ ctx->qcompress = UINTVAL(val);
+ } else if (!strcmp(name, "qmin")) {
+ ctx->qmin = UINTVAL(val);
+ } else if (!strcmp(name, "qmax")) {
+ ctx->qmax = UINTVAL(val);
+ } else if (!strcmp(name, "max-qdiff")) {
+ ctx->max_qdiff = UINTVAL(val);
+ } else if (!strcmp(name, "colorspace")) {
+ ctx->colorspace = UINTVAL(val);
+
+ if (ctx->colorspace > AVCOL_SPC_NB) {
+ ctx->colorspace = AVCOL_SPC_RGB;
+ }
+ } else if (!strcmp(name, "color-range")) {
+ ctx->color_range = UINTVAL(val);
+
+ if (ctx->color_range > AVCOL_RANGE_NB) {
+ ctx->color_range = 0;
+ }
+ }
+ } // for param
+
+ if (options) {
+ switch_xml_t option = switch_xml_child(options, "option");
+
+ if (aprofile->options) {
+ switch_event_destroy(&aprofile->options);
+ }
+
+ switch_event_create(&aprofile->options, SWITCH_EVENT_CLONE);
+ aprofile->options->flags |= EF_UNIQ_HEADERS;
+
+ for (; option; option = option->next) {
+ const char *name = switch_xml_attr(option, "name");
+ const char *value = switch_xml_attr(option, "value");
+
+ if (zstr(name) || zstr(value)) continue;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: %s\n", name, value);
+
+ switch_event_add_header_string(aprofile->options, SWITCH_STACK_BOTTOM, name, value);
+ }
+ } // for options
+ } // for profile
+ } // profiles
+
+ switch_xml_free(xml);
+ } // xml
+
+ if (avcodec_globals.max_bitrate <= 0) {
+ avcodec_globals.max_bitrate = switch_calc_bitrate(1920, 1080, 5, 60);
+ }
+
+ if (avcodec_globals.rtp_slice_size < 500 || avcodec_globals.rtp_slice_size > 1500) {
+ avcodec_globals.rtp_slice_size = SWITCH_DEFAULT_VIDEO_SIZE;
+ }
+
+ SLICE_SIZE = avcodec_globals.rtp_slice_size;
+
+ if (avcodec_globals.key_frame_min_freq < 10000 || avcodec_globals.key_frame_min_freq > 3 * 1000000) {
+ avcodec_globals.key_frame_min_freq = KEY_FRAME_MIN_FREQ;
+ }
+}
+
SWITCH_MODULE_LOAD_FUNCTION(mod_avcodec_load)
{
switch_codec_interface_t *codec_interface;
+ memset(&avcodec_globals, 0, sizeof(struct avcodec_globals));
+ load_config();
+
SWITCH_ADD_CODEC(codec_interface, "H264 Video");
switch_core_codec_add_video_implementation(pool, codec_interface, 99, "H264", NULL,
switch_h264_init, switch_h264_encode, switch_h264_decode, switch_h264_control, switch_h264_destroy);
@@ -1570,6 +1965,21 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_avcodec_load)
return SWITCH_STATUS_SUCCESS;
}
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_avcodec_shutdown)
+{
+ int i;
+
+ for (i = 0; i < MAX_CODECS; i++) {
+ avcodec_profile_t *profile = &avcodec_globals.profiles[i];
+
+ if (profile->options) {
+ switch_event_destroy(&profile->options);
+ }
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
/* For Emacs:
* Local Variables:
* mode:c
diff --git a/src/mod/applications/mod_av/mod_av.c b/src/mod/applications/mod_av/mod_av.c
index fcf4e54af6..68f363bff5 100644
--- a/src/mod/applications/mod_av/mod_av.c
+++ b/src/mod/applications/mod_av/mod_av.c
@@ -38,6 +38,7 @@
SWITCH_MODULE_LOAD_FUNCTION(mod_avformat_load);
SWITCH_MODULE_LOAD_FUNCTION(mod_avcodec_load);
SWITCH_MODULE_LOAD_FUNCTION(mod_av_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_avcodec_shutdown);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_av_shutdown);
SWITCH_MODULE_DEFINITION(mod_av, mod_av_load, mod_av_shutdown, NULL);
@@ -124,6 +125,7 @@ static void log_callback(void *ptr, int level, const char *fmt, va_list vl)
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_av_shutdown)
{
+ mod_avcodec_shutdown();
avformat_network_deinit();
av_log_set_callback(NULL);
av_lockmgr_register(NULL);
diff --git a/src/mod/applications/mod_avmd/mod_avmd.2010.vcxproj.filters b/src/mod/applications/mod_avmd/mod_avmd.2010.vcxproj.filters
deleted file mode 100644
index e173af184d..0000000000
--- a/src/mod/applications/mod_avmd/mod_avmd.2010.vcxproj.filters
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- {4ad6c9d4-436e-451a-8455-2cfce963ef3c}
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c
index 5b8e1a1cc9..1c3e59adfb 100644
--- a/src/mod/applications/mod_commands/mod_commands.c
+++ b/src/mod/applications/mod_commands/mod_commands.c
@@ -4435,6 +4435,44 @@ SWITCH_STANDARD_API(uuid_video_bitrate_function)
return SWITCH_STATUS_SUCCESS;
}
+
+#define VIDEO_BITRATE_SYNTAX " "
+SWITCH_STANDARD_API(uuid_video_bandwidth_function)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+ char *mycmd = NULL, *argv[2] = { 0 };
+ int argc = 0;
+
+ if (!zstr(cmd) && (mycmd = strdup(cmd))) {
+ argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
+ }
+
+ if (argc < 2) {
+ stream->write_function(stream, "-USAGE: %s\n", VIDEO_REFRESH_SYNTAX);
+ } else {
+ switch_core_session_t *lsession = NULL;
+
+ if ((lsession = switch_core_session_locate(argv[0]))) {
+ int kps;
+
+ kps = switch_parse_bandwidth_string(argv[1]);
+ switch_core_media_set_outgoing_bitrate(lsession, SWITCH_MEDIA_TYPE_VIDEO, kps);
+ status = SWITCH_STATUS_SUCCESS;
+ switch_core_session_rwunlock(lsession);
+ }
+ }
+
+ if (status == SWITCH_STATUS_SUCCESS) {
+ stream->write_function(stream, "+OK Success\n");
+ } else {
+ stream->write_function(stream, "-ERR Operation Failed\n");
+ }
+
+ switch_safe_free(mycmd);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
#define CODEC_DEBUG_SYNTAX " audio|video "
SWITCH_STANDARD_API(uuid_codec_debug_function)
{
@@ -7496,6 +7534,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load)
SWITCH_ADD_API(commands_api_interface, "uuid_send_info", "Send info to the endpoint", uuid_send_info_function, INFO_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_set_media_stats", "Set media stats", uuid_set_media_stats, UUID_MEDIA_STATS_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_video_bitrate", "Send video bitrate req.", uuid_video_bitrate_function, VIDEO_BITRATE_SYNTAX);
+ SWITCH_ADD_API(commands_api_interface, "uuid_video_bandwidth", "Send video bandwidth", uuid_video_bandwidth_function, VIDEO_BITRATE_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_video_refresh", "Send video refresh.", uuid_video_refresh_function, VIDEO_REFRESH_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_outgoing_answer", "Answer outgoing channel", outgoing_answer_function, OUTGOING_ANSWER_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_limit", "Increase limit resource", uuid_limit_function, LIMIT_SYNTAX);
@@ -7719,6 +7758,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load)
switch_console_set_complete("add uuid_dual_transfer ::console::list_uuid");
switch_console_set_complete("add uuid_video_refresh ::console::list_uuid");
switch_console_set_complete("add uuid_video_bitrate ::console::list_uuid");
+ switch_console_set_complete("add uuid_video_bandwidth ::console::list_uuid");
switch_console_set_complete("add uuid_xfer_zombie ::console::list_uuid");
switch_console_set_complete("add version");
switch_console_set_complete("add uuid_warning ::console::list_uuid");
diff --git a/src/mod/applications/mod_conference/conference_al.c b/src/mod/applications/mod_conference/conference_al.c
index 41eeb8cda1..2d4f0ad7a9 100644
--- a/src/mod/applications/mod_conference/conference_al.c
+++ b/src/mod/applications/mod_conference/conference_al.c
@@ -78,7 +78,9 @@ void conference_al_gen_arc(conference_obj_t *conference, switch_stream_handle_t
switch_mutex_lock(conference->member_mutex);
for (member = conference->members; member; member = member->next) {
- if (member->channel && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) && !conference_utils_member_test_flag(member, MFLAG_NO_POSITIONAL)) {
+ if (member->channel && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) &&
+ !conference_utils_member_test_flag(member, MFLAG_HOLD) &&
+ !conference_utils_member_test_flag(member, MFLAG_NO_POSITIONAL)) {
count++;
}
}
@@ -112,7 +114,9 @@ void conference_al_gen_arc(conference_obj_t *conference, switch_stream_handle_t
for (member = conference->members; member; member = member->next) {
- if (!member->channel || conference_utils_member_test_flag(member, MFLAG_NO_POSITIONAL) || !conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
+ if (!member->channel || conference_utils_member_test_flag(member, MFLAG_NO_POSITIONAL) ||
+ conference_utils_member_test_flag(member, MFLAG_HOLD) ||
+ !conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
continue;
}
diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c
index bd379ea177..96c2bc8bc4 100644
--- a/src/mod/applications/mod_conference/conference_api.c
+++ b/src/mod/applications/mod_conference/conference_api.c
@@ -72,6 +72,8 @@ api_command_t conference_api_sub_commands[] = {
{"vid-flip", (void_fn_t) & conference_api_sub_vid_flip, CONF_API_SUB_MEMBER_TARGET, "vid-flip", "<[member_id|all|last|non_moderator]>"},
{"vid-border", (void_fn_t) & conference_api_sub_vid_border, CONF_API_SUB_MEMBER_TARGET, "vid-border", "<[member_id|all|last|non_moderator]>"},
{"hup", (void_fn_t) & conference_api_sub_hup, CONF_API_SUB_MEMBER_TARGET, "hup", "<[member_id|all|last|non_moderator]>"},
+ {"hold", (void_fn_t) & conference_api_sub_hold, CONF_API_SUB_MEMBER_TARGET, "hold", "<[member_id|all]|last|non_moderator> [file]"},
+ {"unhold", (void_fn_t) & conference_api_sub_unhold, CONF_API_SUB_MEMBER_TARGET, "unhold", "<[member_id|all]|last|non_moderator>"},
{"mute", (void_fn_t) & conference_api_sub_mute, CONF_API_SUB_MEMBER_TARGET, "mute", "<[member_id|all]|last|non_moderator> []"},
{"tmute", (void_fn_t) & conference_api_sub_tmute, CONF_API_SUB_MEMBER_TARGET, "tmute", "<[member_id|all]|last|non_moderator> []"},
{"unmute", (void_fn_t) & conference_api_sub_unmute, CONF_API_SUB_MEMBER_TARGET, "unmute", "<[member_id|all]|last|non_moderator> []"},
@@ -313,6 +315,11 @@ switch_status_t conference_api_sub_mute(conference_member_t *member, switch_stre
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR mute %u\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
conference_utils_member_clear_flag_locked(member, MFLAG_CAN_SPEAK);
conference_utils_member_clear_flag_locked(member, MFLAG_TALKING);
@@ -345,6 +352,107 @@ switch_status_t conference_api_sub_mute(conference_member_t *member, switch_stre
return SWITCH_STATUS_SUCCESS;
}
+switch_status_t conference_api_sub_unhold(conference_member_t *member, switch_stream_handle_t *stream, void *data)
+{
+ mcu_layer_t *layer = NULL;
+ switch_event_t *event;
+
+ if (member == NULL)
+ return SWITCH_STATUS_GENERR;
+
+ conference_utils_member_clear_flag_locked(member, MFLAG_HOLD);
+
+ if (member->session && !conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT)) {
+ switch_core_media_hard_mute(member->session, SWITCH_FALSE);
+ }
+
+ conference_member_stop_file(member, FILE_STOP_ALL);
+
+ if (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY) {
+ if ((layer = conference_video_get_layer_locked(member))) {
+ layer->clear = 1;
+ conference_video_release_layer(&layer);
+ }
+
+ conference_video_reset_video_bitrate_counters(member);
+
+ if (member->channel) {
+ switch_channel_clear_flag(member->channel, CF_VIDEO_PAUSE_READ);
+ switch_channel_video_sync(member->channel);
+ }
+ }
+
+ if (stream != NULL) {
+ stream->write_function(stream, "+OK unhold %u\n", member->id);
+ }
+
+ if (test_eflag(member->conference, EFLAG_HOLD_MEMBER) &&
+ switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
+ conference_member_add_event_data(member, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "unhold-member");
+ switch_event_fire(&event);
+ }
+
+ if (conference_utils_test_flag(member->conference, CFLAG_POSITIONAL)) {
+ conference_al_gen_arc(member->conference, NULL);
+ }
+
+ conference_member_update_status_field(member);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+switch_status_t conference_api_sub_hold(conference_member_t *member, switch_stream_handle_t *stream, void *data)
+{
+ switch_event_t *event;
+
+ if (member == NULL)
+ return SWITCH_STATUS_GENERR;
+
+ conference_utils_member_clear_flag_locked(member, MFLAG_TALKING);
+
+ if (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY) {
+ conference_video_reset_video_bitrate_counters(member);
+
+ if (member->channel) {
+ switch_channel_set_flag(member->channel, CF_VIDEO_PAUSE_READ);
+ switch_core_session_request_video_refresh(member->session);
+ switch_channel_video_sync(member->channel);
+ }
+ }
+
+ if (member->session) {
+ switch_core_media_hard_mute(member->session, SWITCH_TRUE);
+ }
+
+ conference_utils_member_set_flag(member, MFLAG_HOLD);
+
+ conference_member_set_score_iir(member, 0);
+
+ if (!zstr(data)) {
+ conference_member_play_file(member, data, 0, SWITCH_FALSE);
+ }
+
+ if (stream != NULL) {
+ stream->write_function(stream, "+OK hold %u\n", member->id);
+ }
+
+ if (test_eflag(member->conference, EFLAG_HOLD_MEMBER) &&
+ switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
+ conference_member_add_event_data(member, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "hold-member");
+ switch_event_fire(&event);
+ }
+
+ if (conference_utils_test_flag(member->conference, CFLAG_POSITIONAL)) {
+ conference_al_gen_arc(member->conference, NULL);
+ }
+
+ conference_member_update_status_field(member);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
switch_status_t conference_api_sub_tmute(conference_member_t *member, switch_stream_handle_t *stream, void *data)
{
@@ -352,6 +460,11 @@ switch_status_t conference_api_sub_tmute(conference_member_t *member, switch_str
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR mute %u\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
return conference_api_sub_mute(member, stream, data);
}
@@ -367,6 +480,11 @@ switch_status_t conference_api_sub_unmute(conference_member_t *member, switch_st
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR unmute %u\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
conference_utils_member_set_flag_locked(member, MFLAG_CAN_SPEAK);
if (member->session && !conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT)) {
@@ -413,6 +531,11 @@ switch_status_t conference_api_sub_conference_video_vmute_snap(conference_member
return SWITCH_STATUS_SUCCESS;
}
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (stream != NULL) {
stream->write_function(stream, "+OK vmute image snapped %u\n", member->id);
}
@@ -437,6 +560,11 @@ switch_status_t conference_api_sub_vmute(conference_member_t *member, switch_str
return SWITCH_STATUS_SUCCESS;
}
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
conference_utils_member_clear_flag_locked(member, MFLAG_CAN_BE_SEEN);
conference_video_reset_video_bitrate_counters(member);
@@ -473,6 +601,11 @@ switch_status_t conference_api_sub_tvmute(conference_member_t *member, switch_st
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)) {
return conference_api_sub_vmute(member, stream, data);
}
@@ -493,6 +626,11 @@ switch_status_t conference_api_sub_unvmute(conference_member_t *member, switch_s
return SWITCH_STATUS_SUCCESS;
}
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if ((layer = conference_video_get_layer_locked(member))) {
layer->clear = 1;
conference_video_release_layer(&layer);
@@ -534,7 +672,8 @@ switch_status_t conference_api_sub_vblind(conference_member_t *member, switch_st
if (member == NULL)
return SWITCH_STATUS_GENERR;
- if (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY) {
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
return SWITCH_STATUS_SUCCESS;
}
@@ -569,6 +708,11 @@ switch_status_t conference_api_sub_tvblind(conference_member_t *member, switch_s
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (conference_utils_member_test_flag(member, MFLAG_CAN_SEE)) {
return conference_api_sub_vblind(member, stream, data);
}
@@ -584,7 +728,8 @@ switch_status_t conference_api_sub_unvblind(conference_member_t *member, switch_
if (member == NULL)
return SWITCH_STATUS_GENERR;
- if (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY) {
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
return SWITCH_STATUS_SUCCESS;
}
@@ -621,6 +766,11 @@ switch_status_t conference_api_sub_deaf(conference_member_t *member, switch_stre
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
conference_utils_member_clear_flag_locked(member, MFLAG_CAN_HEAR);
if (!(data) || !strstr((char *) data, "quiet")) {
@@ -663,6 +813,11 @@ switch_status_t conference_api_sub_undeaf(conference_member_t *member, switch_st
if (member == NULL)
return SWITCH_STATUS_GENERR;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (stream) stream->write_function(stream, "-ERR member %u is on hold\n", member->id);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
conference_utils_member_set_flag_locked(member, MFLAG_CAN_HEAR);
if (!(data) || !strstr((char *) data, "quiet")) {
diff --git a/src/mod/applications/mod_conference/conference_loop.c b/src/mod/applications/mod_conference/conference_loop.c
index 60e5056435..49377312c6 100644
--- a/src/mod/applications/mod_conference/conference_loop.c
+++ b/src/mod/applications/mod_conference/conference_loop.c
@@ -132,6 +132,8 @@ void conference_loop_mute_toggle(conference_member_t *member, caller_control_act
if (member == NULL)
return;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) return;
+
if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
conference_api_sub_mute(member, NULL, NULL);
} else {
@@ -144,6 +146,8 @@ void conference_loop_mute_toggle(conference_member_t *member, caller_control_act
void conference_loop_mute_on(conference_member_t *member, caller_control_action_t *action)
{
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) return;
+
if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
conference_api_sub_mute(member, NULL, NULL);
}
@@ -151,6 +155,8 @@ void conference_loop_mute_on(conference_member_t *member, caller_control_action_
void conference_loop_mute_off(conference_member_t *member, caller_control_action_t *action)
{
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) return;
+
if (!conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
conference_api_sub_unmute(member, NULL, NULL);
if (!conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
@@ -280,6 +286,8 @@ void conference_loop_deafmute_toggle(conference_member_t *member, caller_control
if (member == NULL)
return;
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) return;
+
if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
conference_api_sub_mute(member, NULL, NULL);
if (conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
@@ -933,7 +941,8 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
/* if the member can speak, compute the audio energy level and */
/* generate events when the level crosses the threshold */
- if ((conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) || conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT))) {
+ if (((conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) && !conference_utils_member_test_flag(member, MFLAG_HOLD)) ||
+ conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT))) {
uint32_t energy = 0, i = 0, samples = 0, j = 0;
int16_t *data;
int gate_check = 0;
@@ -990,7 +999,7 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
gate_check = conference_member_noise_gate_check(member);
- if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
+ if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) && !conference_utils_member_test_flag(member, MFLAG_HOLD)) {
if (member->max_energy_level) {
if (member->score > member->max_energy_level && ++member->max_energy_hits > member->max_energy_hit_trigger) {
member->mute_counter = member->burst_mute_count;
@@ -1131,6 +1140,7 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
member->talking_count = 0;
if (test_eflag(member->conference, EFLAG_START_TALKING) && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) &&
+ !conference_utils_member_test_flag(member, MFLAG_HOLD) &&
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_member_add_event_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "start-talking");
@@ -1157,7 +1167,8 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
hangunder_hits--;
}
- if (conference_utils_member_test_flag(member, MFLAG_TALKING) && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
+ if (conference_utils_member_test_flag(member, MFLAG_TALKING) && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) &&
+ !conference_utils_member_test_flag(member, MFLAG_HOLD)) {
if (++hangover_hits >= hangover) {
hangover_hits = hangunder_hits = 0;
@@ -1188,7 +1199,8 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
/* skip frames that are not actual media or when we are muted or silent */
if ((conference_utils_member_test_flag(member, MFLAG_TALKING) || member->energy_level == 0 || conference_utils_test_flag(member->conference, CFLAG_AUDIO_ALWAYS))
- && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) && !conference_utils_test_flag(member->conference, CFLAG_WAIT_MOD)
+ && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) && !conference_utils_test_flag(member->conference, CFLAG_WAIT_MOD)
+ && !conference_utils_member_test_flag(member, MFLAG_HOLD)
&& (member->conference->count > 1 || (member->conference->record_count && member->conference->count >= member->conference->min_recording_participants))) {
switch_audio_resampler_t *read_resampler = member->read_resampler;
void *data;
diff --git a/src/mod/applications/mod_conference/conference_member.c b/src/mod/applications/mod_conference/conference_member.c
index b530a6e3ff..d72fcf5153 100644
--- a/src/mod/applications/mod_conference/conference_member.c
+++ b/src/mod/applications/mod_conference/conference_member.c
@@ -133,7 +133,9 @@ void conference_member_update_status_field(conference_member_t *member)
switch_live_array_lock(member->conference->la);
- if (!conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ str = "HOLD";
+ } else if (!conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
str = "MUTE";
} else if (switch_channel_test_flag(member->channel, CF_HOLD)) {
str = "HOLD";
@@ -258,6 +260,7 @@ switch_status_t conference_member_add_event_data(conference_member_t *member, sw
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Speak", "%s", conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false" );
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Talking", "%s", conference_utils_member_test_flag(member, MFLAG_TALKING) ? "true" : "false" );
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Mute-Detect", "%s", conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT) ? "true" : "false" );
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Hold", "%s", conference_utils_member_test_flag(member, MFLAG_HOLD) ? "true" : "false" );
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", member->id);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-Type", "%s", conference_utils_member_test_flag(member, MFLAG_MOD) ? "moderator" : "member");
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-Ghost", "%s", conference_utils_member_test_flag(member, MFLAG_GHOST) ? "true" : "false");
diff --git a/src/mod/applications/mod_conference/conference_utils.c b/src/mod/applications/mod_conference/conference_utils.c
index 5940c06358..c1932ead74 100644
--- a/src/mod/applications/mod_conference/conference_utils.c
+++ b/src/mod/applications/mod_conference/conference_utils.c
@@ -237,9 +237,7 @@ void conference_utils_clear_eflags(char *events, uint32_t *f)
*next++ = '\0';
}
- if (!strcmp(event, "add-member")) {
- *f &= ~EFLAG_ADD_MEMBER;
- } else if (!strcmp(event, "del-member")) {
+ if (!strcmp(event, "del-member")) {
*f &= ~EFLAG_DEL_MEMBER;
} else if (!strcmp(event, "energy-level")) {
*f &= ~EFLAG_ENERGY_LEVEL;
@@ -257,6 +255,8 @@ void conference_utils_clear_eflags(char *events, uint32_t *f)
*f &= ~EFLAG_MUTE_DETECT;
} else if (!strcmp(event, "mute-member")) {
*f &= ~EFLAG_MUTE_MEMBER;
+ } else if (!strcmp(event, "hold-member")) {
+ *f &= ~EFLAG_HOLD_MEMBER;
} else if (!strcmp(event, "kick-member")) {
*f &= ~EFLAG_KICK_MEMBER;
} else if (!strcmp(event, "dtmf-member")) {
diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c
index 81f2fbc09d..859b135515 100644
--- a/src/mod/applications/mod_conference/conference_video.c
+++ b/src/mod/applications/mod_conference/conference_video.c
@@ -1199,16 +1199,20 @@ void conference_member_set_logo(conference_member_t *member, const char *path)
if (y < 0) y = 0;
}
- img = switch_img_write_text_img(member->video_logo->d_w, member->video_logo->d_h, SWITCH_FALSE, var);
- switch_img_fit(&img, member->video_logo->d_w, member->video_logo->d_h, SWITCH_FIT_NECESSARY);
- switch_img_attenuate(member->video_logo);
+ if ((img = switch_img_write_text_img(member->video_logo->d_w, member->video_logo->d_h, SWITCH_FALSE, var))) {
+ switch_img_fit(&img, member->video_logo->d_w, member->video_logo->d_h, SWITCH_FIT_NECESSARY);
+ switch_img_attenuate(member->video_logo);
- if (center) {
- x = center_off + ((member->video_logo->d_w - center_off - img->d_w) / 2);
+
+ if (center) {
+ x = center_off + ((member->video_logo->d_w - center_off - img->d_w) / 2);
+ }
+
+ switch_img_patch(member->video_logo, img, x, y);
+ switch_img_free(&img);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to write text on image!\n");
}
-
- switch_img_patch(member->video_logo, img, x, y);
- switch_img_free(&img);
}
if (params && (var = switch_event_get_header(params, "alt_text"))) {
@@ -1236,17 +1240,21 @@ void conference_member_set_logo(conference_member_t *member, const char *path)
y = atoi(tmp);
if (y < 0) y = 0;
}
+
+ if ((img = switch_img_write_text_img(member->video_logo->d_w, member->video_logo->d_h, SWITCH_FALSE, var))) {
+ switch_img_fit(&img, member->video_logo->d_w, member->video_logo->d_h, SWITCH_FIT_NECESSARY);
+ switch_img_attenuate(member->video_logo);
+
+ if (center) {
+ x = center_off + ((member->video_logo->d_w - center_off - img->d_w) / 2);
+ }
- img = switch_img_write_text_img(member->video_logo->d_w, member->video_logo->d_h, SWITCH_FALSE, var);
- switch_img_fit(&img, member->video_logo->d_w, member->video_logo->d_h, SWITCH_FIT_NECESSARY);
- switch_img_attenuate(member->video_logo);
-
- if (center) {
- x = center_off + ((member->video_logo->d_w - center_off - img->d_w) / 2);
+ switch_img_patch(member->video_logo, img, x, y);
+ switch_img_free(&img);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to write text on image!\n");
}
-
- switch_img_patch(member->video_logo, img, x, y);
- switch_img_free(&img);
+
}
}
@@ -1406,6 +1414,10 @@ switch_status_t conference_video_attach_video_layer(conference_member_t *member,
return SWITCH_STATUS_FALSE;
}
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ conference_utils_member_clear_flag(member, MFLAG_DED_VID_LAYER);
+ return SWITCH_STATUS_FALSE;
+ }
if (!switch_channel_test_flag(channel, CF_VIDEO_READY) && !member->avatar_png_img) {
conference_utils_member_clear_flag(member, MFLAG_DED_VID_LAYER);
@@ -1417,6 +1429,8 @@ switch_status_t conference_video_attach_video_layer(conference_member_t *member,
return SWITCH_STATUS_FALSE;
}
+
+
switch_mutex_lock(canvas->mutex);
layer = &canvas->layers[idx];
@@ -2598,6 +2612,10 @@ switch_status_t conference_video_find_layer(conference_obj_t *conference, mcu_ca
return SWITCH_STATUS_FALSE;
}
+ if (conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
switch_mutex_lock(canvas->mutex);
for (i = 0; i < canvas->total_layers; i++) {
@@ -2722,7 +2740,7 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
size = switch_queue_size(member->video_queue);
} while(size > 1);
- if (conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) &&
+ if (conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(member, MFLAG_HOLD) &&
member->video_layer_id > -1 &&
switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY &&
switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_INACTIVE
@@ -2875,6 +2893,13 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
int kps = 0, kps_in = 0;
int max = 0;
int min_layer = 0, min = 0;
+ int screen_w = 0, screen_h = 0;
+
+ if (layer) {
+ screen_w = layer->screen_w;
+ screen_h = layer->screen_h;
+ }
+
if (!conference_utils_test_flag(member->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) ||
switch_channel_test_flag(member->channel, CF_VIDEO_BITRATE_UNMANAGABLE)) {
@@ -2906,6 +2931,13 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
member->vid_params = vid_params;
+ if (member->vid_params.width && member->vid_params.height && (screen_w > member->vid_params.width || screen_h > member->vid_params.height)) {
+ //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s Layer is bigger than input res, limit size to %dx%d\n",
+ //switch_channel_get_name(member->channel), member->vid_params.width, member->vid_params.height);
+ screen_w = member->vid_params.width;
+ screen_h = member->vid_params.height;
+ }
+
if (member->managed_kps_set) {
return;
}
@@ -2916,7 +2948,7 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
}
if (layer) {
- kps = switch_calc_bitrate(layer->screen_w, layer->screen_h, member->conference->video_quality, (int)(member->conference->video_fps.fps));
+ kps = switch_calc_bitrate(screen_w, screen_h, member->conference->video_quality, (int)(member->conference->video_fps.fps));
} else {
kps = kps_in;
}
@@ -2939,9 +2971,14 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s setting bitrate to %dkps because it was forced.\n",
switch_channel_get_name(member->channel), kps);
} else {
- if (layer && conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accommodate %dx%d resolution\n",
- switch_channel_get_name(member->channel), kps, layer->screen_w, layer->screen_h);
+ if (layer && conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(member, MFLAG_HOLD)) {
+ if (layer->screen_w != screen_w) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps (max res %dx%d) to accommodate %dx%d resolution\n",
+ switch_channel_get_name(member->channel), kps, screen_w, screen_h, layer->screen_w, layer->screen_h);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accommodate %dx%d resolution\n",
+ switch_channel_get_name(member->channel), kps, screen_w, screen_h);
+ }
} else {
kps = min;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps because the user is not visible\n",
@@ -3150,6 +3187,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
int no_muted = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS);
int no_av = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS);
int seen = conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN);
+ int hold = conference_utils_member_test_flag(imember, MFLAG_HOLD);
if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) &&
imember->watching_canvas_id == canvas->canvas_id) {
@@ -3157,7 +3195,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
}
if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) &&
- !conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) &&
+ !conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) && !hold &&
conference_utils_member_test_flag(imember, MFLAG_RUNNING) && (!no_muted || seen) && (!no_av || (no_av && !imember->avatar_png_img))
&& imember->canvas_id == canvas->canvas_id && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY && imember->video_media_flow != SWITCH_MEDIA_FLOW_INACTIVE) {
video_count++;
@@ -3376,8 +3414,9 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
continue;
}
- if (conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) &&
- !conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) && imember->video_layer_id > -1) {
+ if ((conference_utils_member_test_flag(imember, MFLAG_HOLD) ||
+ (conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) &&
+ !conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN))) && imember->video_layer_id > -1) {
conference_video_detach_video_layer(imember);
switch_img_free(&imember->video_mute_img);
@@ -3491,7 +3530,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
// switch_img_free(&layer->cur_img);
//}
- if (conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) || switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY || switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_INACTIVE || conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS)) {
+ if ((conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(imember, MFLAG_HOLD)) || switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY || switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_INACTIVE || conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS)) {
layer->mute_patched = 0;
} else {
@@ -3610,7 +3649,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
if (total > 0 &&
(!conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) ||
- conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN)) &&
+ (conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(imember, MFLAG_HOLD))) &&
imember->session && switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY &&
imember->session && switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_INACTIVE) {
@@ -3777,7 +3816,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
}
if (layer) {
- if (conference_utils_member_test_flag(omember, MFLAG_CAN_BE_SEEN)) {
+ if (conference_utils_member_test_flag(omember, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(imember, MFLAG_HOLD)) {
layer->mute_patched = 0;
} else if (!conference_utils_test_flag(omember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS)) {
if (!layer->mute_patched) {
@@ -4795,6 +4834,7 @@ void conference_video_write_frame(conference_obj_t *conference, conference_membe
}
if (!conference_utils_member_test_flag(imember, MFLAG_CAN_SEE)) {
+ switch_core_session_rwunlock(isession);
continue;
}
@@ -4926,6 +4966,7 @@ switch_status_t conference_video_thread_callback(switch_core_session_t *session,
if (frame->img && (((member->video_layer_id > -1) && canvas_id > -1) || member->canvas) &&
conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) &&
+ !conference_utils_member_test_flag(member, MFLAG_HOLD) &&
switch_queue_size(member->video_queue) < member->conference->video_fps.fps &&
!member->conference->canvases[canvas_id]->playing_video_file) {
diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c
index 7b9c8207c8..6efb7c72df 100644
--- a/src/mod/applications/mod_conference/mod_conference.c
+++ b/src/mod/applications/mod_conference/mod_conference.c
@@ -84,6 +84,7 @@ void conference_list(conference_obj_t *conference, switch_stream_handle_t *strea
char *uuid;
char *name;
uint32_t count = 0;
+ switch_bool_t hold = conference_utils_member_test_flag(member, MFLAG_HOLD);
if (conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) {
continue;
@@ -97,21 +98,26 @@ void conference_list(conference_obj_t *conference, switch_stream_handle_t *strea
stream->write_function(stream, "%u%s%s%s%s%s%s%s%s%s",
member->id, delim, name, delim, uuid, delim, profile->caller_id_name, delim, profile->caller_id_number, delim);
- if (conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
+ if (!hold && conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
stream->write_function(stream, "hear");
count++;
}
- if (conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
+ if (!hold && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) {
stream->write_function(stream, "%s%s", count ? "|" : "", "speak");
count++;
}
- if (conference_utils_member_test_flag(member, MFLAG_TALKING)) {
+ if (!hold && conference_utils_member_test_flag(member, MFLAG_TALKING)) {
stream->write_function(stream, "%s%s", count ? "|" : "", "talking");
count++;
}
+ if (hold) {
+ stream->write_function(stream, "%s%s", count ? "|" : "", "hold");
+ count++;
+ }
+
if (switch_channel_test_flag(switch_core_session_get_channel(member->session), CF_VIDEO)) {
stream->write_function(stream, "%s%s", count ? "|" : "", "video");
count++;
@@ -331,6 +337,7 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob
switch_channel_test_flag(channel, CF_VIDEO_READY) &&
imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY &&
!conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) &&
+ !conference_utils_member_test_flag(imember, MFLAG_HOLD) &&
(!conference_utils_test_flag(conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) ||
conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN))) {
members_with_video++;
@@ -1225,7 +1232,8 @@ void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, i
switch_xml_t x_tag;
int toff = 0;
char tmp[50] = "";
-
+ switch_bool_t hold = conference_utils_member_test_flag(member, MFLAG_HOLD);
+
if (conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) {
if (member->rec_path) {
x_member = switch_xml_add_child_d(x_members, "member", moff++);
@@ -1286,19 +1294,22 @@ void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, i
switch_assert(x_flags);
x_tag = switch_xml_add_child_d(x_flags, "can_hear", count++);
- switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_CAN_HEAR) ? "true" : "false");
+ switch_xml_set_txt_d(x_tag, (!hold && conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) ? "true" : "false");
x_tag = switch_xml_add_child_d(x_flags, "can_see", count++);
- switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_CAN_SEE) ? "true" : "false");
+ switch_xml_set_txt_d(x_tag, (!hold && conference_utils_member_test_flag(member, MFLAG_CAN_SEE)) ? "true" : "false");
x_tag = switch_xml_add_child_d(x_flags, "can_speak", count++);
- switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false");
+ switch_xml_set_txt_d(x_tag, (!hold && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK)) ? "true" : "false");
x_tag = switch_xml_add_child_d(x_flags, "mute_detect", count++);
switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT) ? "true" : "false");
x_tag = switch_xml_add_child_d(x_flags, "talking", count++);
- switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_TALKING) ? "true" : "false");
+ switch_xml_set_txt_d(x_tag, (!hold && conference_utils_member_test_flag(member, MFLAG_TALKING)) ? "true" : "false");
+
+ x_tag = switch_xml_add_child_d(x_flags, "hold", count++);
+ switch_xml_set_txt_d(x_tag, hold ? "true" : "false");
x_tag = switch_xml_add_child_d(x_flags, "has_video", count++);
switch_xml_set_txt_d(x_tag, switch_channel_test_flag(switch_core_session_get_channel(member->session), CF_VIDEO) ? "true" : "false");
@@ -1374,6 +1385,8 @@ void conference_jlist(conference_obj_t *conference, cJSON *json_conferences)
switch_channel_t *channel;
switch_caller_profile_t *profile;
char *uuid;
+ switch_bool_t hold = conference_utils_member_test_flag(member, MFLAG_HOLD);
+
cJSON_AddItemToObject(json_conference_members, "member", json_conference_member = cJSON_CreateObject());
if (conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) {
@@ -1405,9 +1418,10 @@ void conference_jlist(conference_obj_t *conference, cJSON *json_conferences)
cJSON_AddNumberToObject(json_conference_member, "volume_out", member->volume_out_level);
cJSON_AddNumberToObject(json_conference_member, "output-volume", member->volume_out_level);
cJSON_AddNumberToObject(json_conference_member, "input-volume", member->volume_in_level);
- ADDBOOL(json_conference_member_flags, "can_hear", conference_utils_member_test_flag(member, MFLAG_CAN_HEAR));
- ADDBOOL(json_conference_member_flags, "can_see", conference_utils_member_test_flag(member, MFLAG_CAN_SEE));
- ADDBOOL(json_conference_member_flags, "can_speak", conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK));
+ ADDBOOL(json_conference_member_flags, "can_hear", !hold && conference_utils_member_test_flag(member, MFLAG_CAN_HEAR));
+ ADDBOOL(json_conference_member_flags, "can_see", !hold && conference_utils_member_test_flag(member, MFLAG_CAN_SEE));
+ ADDBOOL(json_conference_member_flags, "can_speak", !hold && conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK));
+ ADDBOOL(json_conference_member_flags, "hold", hold);
ADDBOOL(json_conference_member_flags, "mute_detect", conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT));
ADDBOOL(json_conference_member_flags, "talking", conference_utils_member_test_flag(member, MFLAG_TALKING));
ADDBOOL(json_conference_member_flags, "has_video", switch_channel_test_flag(switch_core_session_get_channel(member->session), CF_VIDEO));
diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h
index c4f7b14fba..60920410a2 100644
--- a/src/mod/applications/mod_conference/mod_conference.h
+++ b/src/mod/applications/mod_conference/mod_conference.h
@@ -220,6 +220,7 @@ typedef enum {
MFLAG_NO_VIDEO_BLANKS,
MFLAG_VIDEO_JOIN,
MFLAG_DED_VID_LAYER,
+ MFLAG_HOLD,
///////////////////////////
MFLAG_MAX
} member_flag_t;
@@ -322,7 +323,7 @@ typedef enum {
} node_flag_t;
typedef enum {
- EFLAG_ADD_MEMBER = (1 << 0),
+ EFLAG_HOLD_MEMBER = (1 << 0),
EFLAG_DEL_MEMBER = (1 << 1),
EFLAG_ENERGY_LEVEL = (1 << 2),
EFLAG_VOLUME_LEVEL = (1 << 3),
@@ -1210,6 +1211,8 @@ switch_status_t conference_api_sub_file_seek(conference_obj_t *conference, switc
switch_status_t conference_api_sub_cam(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_stop(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_hup(conference_member_t *member, switch_stream_handle_t *stream, void *data);
+switch_status_t conference_api_sub_hold(conference_member_t *member, switch_stream_handle_t *stream, void *data);
+switch_status_t conference_api_sub_unhold(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_pauserec(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_volume_out(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_lock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c
index 4cc8dfab64..3d22b350ef 100644
--- a/src/mod/applications/mod_dptools/mod_dptools.c
+++ b/src/mod/applications/mod_dptools/mod_dptools.c
@@ -494,7 +494,10 @@ SWITCH_STANDARD_APP(detect_speech_function)
switch_ivr_stop_detect_speech(session);
} else if (!strcasecmp(argv[0], "param")) {
switch_ivr_set_param_detect_speech(session, argv[1], argv[2]);
+ } else if (!strcasecmp(argv[0], "start-input-timers")) {
+ switch_ivr_detect_speech_start_input_timers(session);
} else if (!strcasecmp(argv[0], "start_input_timers")) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "start_input_timers is deprecated, please use start-input-timers instead!\n");
switch_ivr_detect_speech_start_input_timers(session);
} else if (argc >= 3) {
switch_ivr_detect_speech(session, argv[0], argv[1], argv[2], argv[3], NULL);
@@ -1512,7 +1515,9 @@ SWITCH_STANDARD_APP(respond_function)
SWITCH_STANDARD_APP(deflect_function)
{
switch_core_session_message_t msg = { 0 };
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_channel_wait_for_flag(channel, CF_MEDIA_ACK, SWITCH_TRUE, 10000, NULL);
/* Tell the channel to deflect the call */
msg.from = __FILE__;
msg.string_arg = data;
diff --git a/src/mod/asr_tts/mod_unimrcp/unimrcp.props b/src/mod/asr_tts/mod_unimrcp/unimrcp.props
index a904aa25db..6f304ae5f0 100644
--- a/src/mod/asr_tts/mod_unimrcp/unimrcp.props
+++ b/src/mod/asr_tts/mod_unimrcp/unimrcp.props
@@ -9,7 +9,7 @@
$(SolutionDir)libs\unimrcp\platforms\libunimrcp-client\include;$(SolutionDir)libs\unimrcp\libs\mrcp-client\include;$(SolutionDir)libs\unimrcp\libs\mrcp-signaling\include;$(SolutionDir)libs\unimrcp\libs\apr-toolkit\include;$(SolutionDir)libs\unimrcp\build;$(SolutionDir)libs\unimrcp\libs\mrcp\include;$(SolutionDir)libs\unimrcp\libs\mrcp\message\include;$(SolutionDir)libs\unimrcp\libs\mrcp\control\include;$(SolutionDir)libs\unimrcp\libs\mrcp\resources\include;$(SolutionDir)libs\unimrcp\libs\mpf\include;$(SolutionDir)libs\unimrcp\libs\mrcpv2-transport\include;$(SolutionDir)libs\unimrcp\modules\mrcp-sofiasip\include;$(SolutionDir)libs\unimrcp\modules\mrcp-unirtsp\include;%(AdditionalIncludeDirectories)
- MRCP_STATIC_LIB MPF_STATIC_LIB APT_STATIC_LIB;%(PreprocessorDefinitions)
+ MRCP_STATIC_LIB;MPF_STATIC_LIB;APT_STATIC_LIB;%(PreprocessorDefinitions)
\ No newline at end of file
diff --git a/src/mod/asr_tts/mod_unimrcp/unimrcp.vsprops b/src/mod/asr_tts/mod_unimrcp/unimrcp.vsprops
deleted file mode 100644
index 359408084a..0000000000
--- a/src/mod/asr_tts/mod_unimrcp/unimrcp.vsprops
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c
index b2b06d6e16..cc11c3d209 100644
--- a/src/mod/endpoints/mod_verto/mod_verto.c
+++ b/src/mod/endpoints/mod_verto/mod_verto.c
@@ -5052,10 +5052,10 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
switch_mutex_lock(verto_globals.mutex);
for(profile = verto_globals.profile_head; profile; profile = profile->next) {
- for (i = 0; i < profile->i; i++) {
+ for (i = 0; i < profile->i; i++) {
char *tmpurl = switch_mprintf(strchr(profile->ip[i].local_ip, ':') ? "%s:[%s]:%d" : "%s:%s:%d",
(profile->ip[i].secure == 1) ? "wss" : "ws", profile->ip[i].local_ip, profile->ip[i].local_port);
- stream->write_function(stream, "%25s\t%s\t %40s\t%s\n", profile->name, "profile", tmpurl, (profile->running) ? "RUNNING" : "DOWN");
+ stream->write_function(stream, "%25s\t%s\t %40s\t%s\n", profile->name, "profile", tmpurl, (profile->server_socket[i] != ws_sock_invalid) ? "RUNNING" : "DOWN");
switch_safe_free(tmpurl);
}
cp++;
diff --git a/src/mod/formats/mod_shout/mod_shout.vcxproj.filters b/src/mod/formats/mod_shout/mod_shout.vcxproj.filters
deleted file mode 100644
index ffd30b7d6d..0000000000
--- a/src/mod/formats/mod_shout/mod_shout.vcxproj.filters
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav
-
-
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java
index 3dd3f722b3..7d0824dbef 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class API {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected API(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
index 88d5a3df28..75b09e1448 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class CoreSession {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected CoreSession(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/DTMF.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/DTMF.java
index cae50ff4c0..71d6198f44 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/DTMF.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/DTMF.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class DTMF {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected DTMF(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/Event.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/Event.java
index c6a271e12c..f3a06a2177 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/Event.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/Event.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class Event {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected Event(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/EventConsumer.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/EventConsumer.java
index 6decf27f82..9a69a6c5e6 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/EventConsumer.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/EventConsumer.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class EventConsumer {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected EventConsumer(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/IVRMenu.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/IVRMenu.java
index 8c10dd95fc..84ca8671b9 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/IVRMenu.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/IVRMenu.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class IVRMenu {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected IVRMenu(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/JavaSession.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/JavaSession.java
index a030fbd625..82573cbff9 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/JavaSession.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/JavaSession.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,7 +9,7 @@
package org.freeswitch.swig;
public class JavaSession extends CoreSession {
- private long swigCPtr;
+ private transient long swigCPtr;
protected JavaSession(long cPtr, boolean cMemoryOwn) {
super(freeswitchJNI.JavaSession_SWIGUpcast(cPtr), cMemoryOwn);
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_JavaVM.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_JavaVM.java
index 6308483c7c..87d2efd11f 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_JavaVM.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_JavaVM.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_JavaVM {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_JavaVM(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_JavaVM(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_int.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_int.java
index e189e7c4f1..b7aa92cec2 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_int.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_int.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_int {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_int(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_int(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_p_switch_event_node_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_p_switch_event_node_t.java
index 9ee3a23b22..bf20923d8f 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_p_switch_event_node_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_p_switch_event_node_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_p_switch_event_node_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_p_switch_event_node_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_p_switch_event_node_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_call_cause_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_call_cause_t.java
index 00c53135fd..c668c339ba 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_call_cause_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_call_cause_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_call_cause_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_call_cause_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_call_cause_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_state_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_state_t.java
index ea82d3b7ee..b0443427ae 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_state_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_state_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_channel_state_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_channel_state_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_channel_state_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_t.java
index b46a02db25..eea4e2e1bd 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_channel_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_channel_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_channel_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_channel_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_core_session_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_core_session_t.java
index 2f811a74cc..fa595a7386 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_core_session_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_core_session_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_core_session_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_core_session_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_core_session_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_t.java
index 2e17094bfa..060199a96f 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_event_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_event_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_event_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_types_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_types_t.java
index 7c1ebebb4c..be40b44b6c 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_types_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_event_types_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_event_types_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_event_types_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_event_types_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_args_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_args_t.java
index a0ab192d0d..3fdb4a7d20 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_args_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_args_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_input_args_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_input_args_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_input_args_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_type_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_type_t.java
index 33731d5d33..8bfe879d51 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_type_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_input_type_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_input_type_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_input_type_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_input_type_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_priority_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_priority_t.java
index f5a8c4b604..713ca09d3d 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_priority_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_priority_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_priority_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_priority_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_priority_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_queue_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_queue_t.java
index c7da580c56..10e2d38666 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_queue_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_queue_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_queue_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_queue_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_queue_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_state_handler_table_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_state_handler_table_t.java
index 7a387036b1..989d3d403e 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_state_handler_table_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_state_handler_table_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_state_handler_table_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_state_handler_table_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_state_handler_table_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_status_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_status_t.java
index 0880fbaef2..dc28f2e1f8 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_status_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_status_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_status_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_status_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_status_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_stream_handle_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_stream_handle_t.java
index 659c247946..798349044c 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_stream_handle_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_switch_stream_handle_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_switch_stream_handle_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_switch_stream_handle_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_switch_stream_handle_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_uint32_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_uint32_t.java
index 08c3ef8c82..6e6ab7d8c3 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_uint32_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_uint32_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_uint32_t {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_uint32_t(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_uint32_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_void.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_void.java
index 9bc1acae98..20f5835447 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_void.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/SWIGTYPE_p_void.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,9 +9,9 @@
package org.freeswitch.swig;
public class SWIGTYPE_p_void {
- private long swigCPtr;
+ private transient long swigCPtr;
- protected SWIGTYPE_p_void(long cPtr, boolean futureUse) {
+ protected SWIGTYPE_p_void(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/Stream.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/Stream.java
index f917c54c9c..23eab06f39 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/Stream.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/Stream.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class Stream {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected Stream(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java
index cfcd35e889..3d59d14638 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
index 5005b518a6..8d708cace8 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/input_callback_state_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/input_callback_state_t.java
index e323161be2..f5bbcd6246 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/input_callback_state_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/input_callback_state_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
@@ -9,8 +9,8 @@
package org.freeswitch.swig;
public class input_callback_state_t {
- private long swigCPtr;
- protected boolean swigCMemOwn;
+ private transient long swigCPtr;
+ protected transient boolean swigCMemOwn;
protected input_callback_state_t(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/session_flag_t.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/session_flag_t.java
index d07c596b41..e4b6d10e88 100644
--- a/src/mod/languages/mod_java/src/org/freeswitch/swig/session_flag_t.java
+++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/session_flag_t.java
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
diff --git a/src/mod/languages/mod_java/switch_swig_wrap.cpp b/src/mod/languages/mod_java/switch_swig_wrap.cpp
index fe4c4db259..09b4baf16a 100644
--- a/src/mod/languages/mod_java/switch_swig_wrap.cpp
+++ b/src/mod/languages/mod_java/switch_swig_wrap.cpp
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
@@ -8,7 +8,11 @@
* interface file instead.
* ----------------------------------------------------------------------------- */
+
+#ifndef SWIGJAVA
#define SWIGJAVA
+#endif
+
#ifdef __cplusplus
@@ -101,9 +105,11 @@ template T SwigValueInit() {
#endif
/* exporting methods */
-#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-# ifndef GCC_HASCLASSVISIBILITY
-# define GCC_HASCLASSVISIBILITY
+#if defined(__GNUC__)
+# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# ifndef GCC_HASCLASSVISIBILITY
+# define GCC_HASCLASSVISIBILITY
+# endif
# endif
#endif
@@ -142,6 +148,19 @@ template T SwigValueInit() {
# define _SCL_SECURE_NO_DEPRECATE
#endif
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used. So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
/* Fix for jlong on some versions of gcc on Windows */
diff --git a/src/mod/languages/mod_lua/mod_lua_wrap.cpp b/src/mod/languages/mod_lua/mod_lua_wrap.cpp
index ed046632c6..b5efc8595a 100644
--- a/src/mod/languages/mod_lua/mod_lua_wrap.cpp
+++ b/src/mod/languages/mod_lua/mod_lua_wrap.cpp
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
@@ -8,7 +8,11 @@
* interface file instead.
* ----------------------------------------------------------------------------- */
+
+#ifndef SWIGLUA
#define SWIGLUA
+#endif
+
#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_LUA
#define SWIG_LUA_MODULE_GLOBAL
@@ -103,9 +107,11 @@ template T SwigValueInit() {
#endif
/* exporting methods */
-#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-# ifndef GCC_HASCLASSVISIBILITY
-# define GCC_HASCLASSVISIBILITY
+#if defined(__GNUC__)
+# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# ifndef GCC_HASCLASSVISIBILITY
+# define GCC_HASCLASSVISIBILITY
+# endif
# endif
#endif
@@ -144,6 +150,19 @@ template T SwigValueInit() {
# define _SCL_SECURE_NO_DEPRECATE
#endif
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used. So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -642,16 +661,16 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
char d = *(c++);
unsigned char uu;
if ((d >= '0') && (d <= '9'))
- uu = ((d - '0') << 4);
+ uu = (unsigned char)((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
- uu = ((d - ('a'-10)) << 4);
+ uu = (unsigned char)((d - ('a'-10)) << 4);
else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
- uu |= (d - '0');
+ uu |= (unsigned char)(d - '0');
else if ((d >= 'a') && (d <= 'f'))
- uu |= (d - ('a'-10));
+ uu |= (unsigned char)(d - ('a'-10));
else
return (char *) 0;
*u = uu;
@@ -1526,6 +1545,44 @@ SWIGINTERN int SWIG_Lua_iterate_bases(lua_State *L, swig_type_info * SWIGUNUSED
return result;
}
+/* The class.get method helper, performs the lookup of class attributes.
+ * It returns an error code. Number of function return values is passed inside 'ret'.
+ * first_arg is not used in this function because function always has 2 arguments.
+ */
+SWIGINTERN int SWIG_Lua_class_do_get_item(lua_State *L, swig_type_info *type, int SWIGUNUSED first_arg, int *ret)
+{
+/* there should be 2 params passed in
+ (1) userdata (not the meta table)
+ (2) string name of the attribute
+*/
+ int bases_search_result;
+ int substack_start = lua_gettop(L)-2;
+ assert(first_arg == substack_start+1);
+ lua_checkstack(L,5);
+ assert(lua_isuserdata(L,-2)); /* just in case */
+ lua_getmetatable(L,-2); /* get the meta table */
+ assert(lua_istable(L,-1)); /* just in case */
+ /* NEW: looks for the __getitem() fn
+ this is a user provided get fn */
+ SWIG_Lua_get_table(L,"__getitem"); /* find the __getitem fn */
+ if (lua_iscfunction(L,-1)) /* if its there */
+ { /* found it so call the fn & return its value */
+ lua_pushvalue(L,substack_start+1); /* the userdata */
+ lua_pushvalue(L,substack_start+2); /* the parameter */
+ lua_call(L,2,1); /* 2 value in (userdata),1 out (result) */
+ lua_remove(L,-2); /* stack tidy, remove metatable */
+ if(ret) *ret = 1;
+ return SWIG_OK;
+ }
+ lua_pop(L,1);
+ /* Remove the metatable */
+ lua_pop(L,1);
+ /* Search in base classes */
+ bases_search_result = SWIG_Lua_iterate_bases(L,type,substack_start+1,SWIG_Lua_class_do_get_item,ret);
+ return bases_search_result; /* sorry not known */
+}
+
+
/* The class.get method helper, performs the lookup of class attributes.
* It returns an error code. Number of function return values is passed inside 'ret'.
* first_arg is not used in this function because function always has 2 arguments.
@@ -1573,19 +1630,6 @@ SWIGINTERN int SWIG_Lua_class_do_get(lua_State *L, swig_type_info *type, int SW
return SWIG_OK;
}
lua_pop(L,1); /* remove whatever was there */
- /* NEW: looks for the __getitem() fn
- this is a user provided get fn */
- SWIG_Lua_get_table(L,"__getitem"); /* find the __getitem fn */
- if (lua_iscfunction(L,-1)) /* if its there */
- { /* found it so call the fn & return its value */
- lua_pushvalue(L,substack_start+1); /* the userdata */
- lua_pushvalue(L,substack_start+2); /* the parameter */
- lua_call(L,2,1); /* 2 value in (userdata),1 out (result) */
- lua_remove(L,-2); /* stack tidy, remove metatable */
- if(ret) *ret = 1;
- return SWIG_OK;
- }
- lua_pop(L,1);
/* Remove the metatable */
lua_pop(L,1);
/* Search in base classes */
@@ -1612,6 +1656,10 @@ SWIGINTERN int SWIG_Lua_class_get(lua_State *L)
if(result == SWIG_OK)
return ret;
+ result = SWIG_Lua_class_do_get_item(L,type,1,&ret);
+ if(result == SWIG_OK)
+ return ret;
+
return 0;
}
@@ -1881,7 +1929,7 @@ SWIGINTERN void SWIG_Lua_init_base_class(lua_State *L,swig_lua_class *clss)
#if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA)
/* Merges two tables */
-SWIGINTERN int SWIG_Lua_merge_tables_by_index(lua_State *L, int target, int source)
+SWIGINTERN void SWIG_Lua_merge_tables_by_index(lua_State *L, int target, int source)
{
/* iterating */
lua_pushnil(L);
@@ -1897,7 +1945,7 @@ SWIGINTERN int SWIG_Lua_merge_tables_by_index(lua_State *L, int target, int sour
}
/* Merges two tables with given name. original - index of target metatable, base - index of source metatable */
-SWIGINTERN int SWIG_Lua_merge_tables(lua_State *L, const char* name, int original, int base)
+SWIGINTERN void SWIG_Lua_merge_tables(lua_State *L, const char* name, int original, int base)
{
/* push original[name], then base[name] */
lua_pushstring(L,name);
@@ -1912,7 +1960,7 @@ SWIGINTERN int SWIG_Lua_merge_tables(lua_State *L, const char* name, int origina
}
/* Function takes all symbols from base and adds it to derived class. It's just a helper. */
-SWIGINTERN int SWIG_Lua_class_squash_base(lua_State *L, swig_lua_class *base_cls)
+SWIGINTERN void SWIG_Lua_class_squash_base(lua_State *L, swig_lua_class *base_cls)
{
/* There is one parameter - original, i.e. 'derived' class metatable */
assert(lua_istable(L,-1));
@@ -1926,7 +1974,7 @@ SWIGINTERN int SWIG_Lua_class_squash_base(lua_State *L, swig_lua_class *base_cls
}
/* Function squashes all symbols from 'clss' bases into itself */
-SWIGINTERN int SWIG_Lua_class_squash_bases(lua_State *L, swig_lua_class *clss)
+SWIGINTERN void SWIG_Lua_class_squash_bases(lua_State *L, swig_lua_class *clss)
{
int i;
SWIG_Lua_get_class_metatable(L,clss->fqname);
@@ -2551,7 +2599,7 @@ SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]) {
switch(constants[i].type) {
case SWIG_LUA_INT:
lua_pushstring(L,constants[i].name);
- lua_pushnumber(L,(lua_Number)constants[i].lvalue);
+ lua_pushinteger(L,(lua_Number)constants[i].lvalue);
lua_rawset(L,-3);
break;
case SWIG_LUA_FLOAT:
@@ -2561,7 +2609,10 @@ SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]) {
break;
case SWIG_LUA_CHAR:
lua_pushstring(L,constants[i].name);
- lua_pushfstring(L,"%c",(char)constants[i].lvalue);
+ {
+ char c = constants[i].lvalue;
+ lua_pushlstring(L,&c,1);
+ }
lua_rawset(L,-3);
break;
case SWIG_LUA_STRING:
@@ -3684,7 +3735,7 @@ static int _wrap_DTMF_digit_get(lua_State* L) {
}
result = (char) ((arg1)->digit);
- lua_pushfstring(L,"%c",result); SWIG_arg++;
+ lua_pushlstring(L, &result, 1); SWIG_arg++;
return SWIG_arg;
if(0) SWIG_fail;
@@ -9688,7 +9739,7 @@ SWIGRUNTIME void
SWIG_InitializeModule(void *clientdata) {
size_t i;
swig_module_info *module_head, *iter;
- int found, init;
+ int init;
/* check to see if the circular list has been setup, if not, set it up */
if (swig_module.next==0) {
@@ -9707,22 +9758,18 @@ SWIG_InitializeModule(void *clientdata) {
/* This is the first module loaded for this interpreter */
/* so set the swig module into the interpreter */
SWIG_SetModule(clientdata, &swig_module);
- module_head = &swig_module;
} else {
/* the interpreter has loaded a SWIG module, but has it loaded this one? */
- found=0;
iter=module_head;
do {
if (iter==&swig_module) {
- found=1;
- break;
+ /* Our module is already in the list, so there's nothing more to do. */
+ return;
}
iter=iter->next;
} while (iter!= module_head);
- /* if the is found in the list, then all is done and we may leave */
- if (found) return;
- /* otherwise we must add out module into the list */
+ /* otherwise we must add our module into the list */
swig_module.next = module_head->next;
module_head->next = &swig_module;
}
diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx
index 449dc0b525..2c74292495 100644
--- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx
+++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx
@@ -20023,10 +20023,10 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_switch_find_parameter(char * jarg1, char *
SWIGEXPORT int SWIGSTDCALL CSharp_switch_true(char * jarg1) {
int jresult ;
char *arg1 = (char *) 0 ;
- int result;
+ switch_bool_t result;
arg1 = (char *)jarg1;
- result = (int)switch_true((char const *)arg1);
+ result = (switch_bool_t)switch_true((char const *)arg1);
jresult = result;
return jresult;
}
@@ -40954,15 +40954,19 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_find_bridged_uuid(char * jarg1, cha
}
-SWIGEXPORT void SWIGSTDCALL CSharp_switch_ivr_intercept_session(void * jarg1, char * jarg2, int jarg3) {
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_intercept_session(void * jarg1, char * jarg2, int jarg3) {
+ int jresult ;
switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
char *arg2 = (char *) 0 ;
switch_bool_t arg3 ;
+ switch_status_t result;
arg1 = (switch_core_session_t *)jarg1;
arg2 = (char *)jarg2;
arg3 = (switch_bool_t)jarg3;
- switch_ivr_intercept_session(arg1,(char const *)arg2,arg3);
+ result = (switch_status_t)switch_ivr_intercept_session(arg1,(char const *)arg2,arg3);
+ jresult = result;
+ return jresult;
}
diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs
index fc4bf3cb1f..b9b7e0d462 100644
--- a/src/mod/languages/mod_managed/managed/swig.cs
+++ b/src/mod/languages/mod_managed/managed/swig.cs
@@ -4019,8 +4019,8 @@ else
return ret;
}
- public static int switch_true(string expr) {
- int ret = freeswitchPINVOKE.switch_true(expr);
+ public static switch_bool_t switch_true(string expr) {
+ switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_true(expr);
return ret;
}
@@ -6397,8 +6397,9 @@ else
return ret;
}
- public static void switch_ivr_intercept_session(SWIGTYPE_p_switch_core_session session, string uuid, switch_bool_t bleg) {
- freeswitchPINVOKE.switch_ivr_intercept_session(SWIGTYPE_p_switch_core_session.getCPtr(session), uuid, (int)bleg);
+ public static switch_status_t switch_ivr_intercept_session(SWIGTYPE_p_switch_core_session session, string uuid, switch_bool_t bleg) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_intercept_session(SWIGTYPE_p_switch_core_session.getCPtr(session), uuid, (int)bleg);
+ return ret;
}
public static void switch_ivr_park_session(SWIGTYPE_p_switch_core_session session) {
@@ -18022,7 +18023,7 @@ class freeswitchPINVOKE {
public static extern int switch_ivr_find_bridged_uuid(string jarg1, string jarg2, HandleRef jarg3);
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_intercept_session")]
- public static extern void switch_ivr_intercept_session(HandleRef jarg1, string jarg2, int jarg3);
+ public static extern int switch_ivr_intercept_session(HandleRef jarg1, string jarg2, int jarg3);
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_park_session")]
public static extern void switch_ivr_park_session(HandleRef jarg1);
diff --git a/src/mod/languages/mod_perl/freeswitch.pm b/src/mod/languages/mod_perl/freeswitch.pm
index d2c7b02f39..33764f5a54 100644
--- a/src/mod/languages/mod_perl/freeswitch.pm
+++ b/src/mod/languages/mod_perl/freeswitch.pm
@@ -1,5 +1,5 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 3.0.2
+# Version 3.0.10
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
diff --git a/src/mod/languages/mod_perl/freeswitch_perl.cpp b/src/mod/languages/mod_perl/freeswitch_perl.cpp
index 220a16054f..642ea1d587 100644
--- a/src/mod/languages/mod_perl/freeswitch_perl.cpp
+++ b/src/mod/languages/mod_perl/freeswitch_perl.cpp
@@ -16,6 +16,8 @@ Session::Session():CoreSession()
Session::Session(char *uuid, CoreSession *a_leg):CoreSession(uuid, a_leg)
{
init_me();
+ switch_mutex_init(&callback_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
+
if (session && allocated) {
suuid = switch_core_session_sprintf(session, "main::uuid_%s\n", switch_core_session_get_uuid(session));
for (char *p = suuid; p && *p; p++) {
@@ -32,6 +34,8 @@ Session::Session(char *uuid, CoreSession *a_leg):CoreSession(uuid, a_leg)
Session::Session(switch_core_session_t *new_session):CoreSession(new_session)
{
init_me();
+ switch_mutex_init(&callback_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
+
if (session) {
suuid = switch_core_session_sprintf(session, "main::uuid_%s\n", switch_core_session_get_uuid(session));
for (char *p = suuid; p && *p; p++) {
@@ -52,6 +56,10 @@ void Session::destroy(void)
return;
}
+ switch_mutex_lock(callback_mutex);
+ destroying = 1;
+ switch_mutex_unlock(callback_mutex);
+
if (session) {
if (!channel) {
channel = switch_core_session_get_channel(session);
@@ -216,71 +224,79 @@ void Session::setInputCallback(char *cbfunc, char *funcargs)
switch_status_t Session::run_dtmf_callback(void *input, switch_input_type_t itype)
{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
if (!getPERL()) {
return SWITCH_STATUS_FALSE;;
}
- switch (itype) {
- case SWITCH_INPUT_TYPE_DTMF:
- {
- switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
- char str[32] = "";
- int arg_count = 2;
- HV *hash;
- SV *this_sv;
- char *code;
+ switch_mutex_lock(callback_mutex);
- if (!(hash = get_hv("__dtmf", TRUE))) {
- abort();
- }
+ if (!destroying) {
+ switch (itype) {
+ case SWITCH_INPUT_TYPE_DTMF:
+ {
+ switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
+ char str[32] = "";
+ int arg_count = 2;
+ HV *hash;
+ SV *this_sv;
+ char *code;
- str[0] = dtmf->digit;
- this_sv = newSV(strlen(str) + 1);
- sv_setpv(this_sv, str);
- hv_store(hash, "digit", 5, this_sv, 0);
-
- switch_snprintf(str, sizeof(str), "%d", dtmf->duration);
- this_sv = newSV(strlen(str) + 1);
- sv_setpv(this_sv, str);
- hv_store(hash, "duration", 8, this_sv, 0);
-
- code = switch_mprintf("eval { $__RV = &%s($%s, 'dtmf', \\%%__dtmf, %s);};", cb_function, suuid, switch_str_nil(cb_arg));
- Perl_eval_pv(my_perl, code, FALSE);
- free(code);
-
- return process_callback_result(SvPV(get_sv("__RV", TRUE), n_a));
- }
- break;
- case SWITCH_INPUT_TYPE_EVENT:
- {
- switch_event_t *event = (switch_event_t *) input;
- int arg_count = 2;
- char *code;
- switch_uuid_t uuid;
- char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];
- char var_name[SWITCH_UUID_FORMATTED_LENGTH + 25];
- char *p;
-
- switch_uuid_get(&uuid);
- switch_uuid_format(uuid_str, &uuid);
-
- switch_snprintf(var_name, sizeof(var_name), "main::__event_%s", uuid_str);
- for(p = var_name; p && *p; p++) {
- if (*p == '-') {
- *p = '_';
+ if (!(hash = get_hv("__dtmf", TRUE))) {
+ abort();
}
+
+ str[0] = dtmf->digit;
+ this_sv = newSV(strlen(str) + 1);
+ sv_setpv(this_sv, str);
+ hv_store(hash, "digit", 5, this_sv, 0);
+
+ switch_snprintf(str, sizeof(str), "%d", dtmf->duration);
+ this_sv = newSV(strlen(str) + 1);
+ sv_setpv(this_sv, str);
+ hv_store(hash, "duration", 8, this_sv, 0);
+
+ code = switch_mprintf("eval { $__RV = &%s($%s, 'dtmf', \\%%__dtmf, %s);};", cb_function, suuid, switch_str_nil(cb_arg));
+ Perl_eval_pv(my_perl, code, FALSE);
+ free(code);
+
+ status = process_callback_result(SvPV(get_sv("__RV", TRUE), n_a));
}
+ break;
+ case SWITCH_INPUT_TYPE_EVENT:
+ {
+ switch_event_t *event = (switch_event_t *) input;
+ int arg_count = 2;
+ char *code;
+ switch_uuid_t uuid;
+ char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1] = "";
+ char var_name[SWITCH_UUID_FORMATTED_LENGTH + 25] = "";
+ char *p;
- mod_perl_conjure_event(my_perl, event, var_name);
- code = switch_mprintf("eval {$__RV = &%s($%s, 'event', $%s, '%s');};$%s = undef;",
- cb_function, suuid, var_name, switch_str_nil(cb_arg), var_name);
- Perl_eval_pv(my_perl, code, FALSE);
- free(code);
+ switch_uuid_get(&uuid);
+ switch_uuid_format(uuid_str, &uuid);
- return process_callback_result(SvPV(get_sv("__RV", TRUE), n_a));
+ switch_snprintf(var_name, sizeof(var_name), "__event_%s", uuid_str);
+ for(p = var_name; p && *p; p++) {
+ if (*p == '-') {
+ *p = '_';
+ }
+ }
+
+ mod_perl_conjure_event(my_perl, event, var_name);
+ code = switch_mprintf("eval {$__RV = &%s($%s, 'event', $%s, '%s');};$%s = undef;",
+ cb_function, suuid, var_name, switch_str_nil(cb_arg), var_name);
+ Perl_eval_pv(my_perl, code, FALSE);
+ free(code);
+
+ status = process_callback_result(SvPV(get_sv("__RV", TRUE), n_a));
+ }
+ break;
}
- break;
}
-
- return SWITCH_STATUS_SUCCESS;
+
+ switch_mutex_unlock(callback_mutex);
+
+ return status;
}
diff --git a/src/mod/languages/mod_perl/freeswitch_perl.h b/src/mod/languages/mod_perl/freeswitch_perl.h
index 5c0e6cc3c3..2d98295c4e 100644
--- a/src/mod/languages/mod_perl/freeswitch_perl.h
+++ b/src/mod/languages/mod_perl/freeswitch_perl.h
@@ -41,6 +41,9 @@ namespace PERL {
void unsetInputCallback(void);
void setHangupHook(char *func, char *arg = NULL);
bool ready();
+ switch_mutex_t *callback_mutex;
+ int destroying = 0;
+ int event_idx = 0;
char *suuid;
char *cb_function;
char *cb_arg;
diff --git a/src/mod/languages/mod_perl/mod_perl.c b/src/mod/languages/mod_perl/mod_perl.c
index 24efaefb98..01795fafbb 100644
--- a/src/mod/languages/mod_perl/mod_perl.c
+++ b/src/mod/languages/mod_perl/mod_perl.c
@@ -143,7 +143,11 @@ static int perl_parse_and_execute(PerlInterpreter * my_perl, char *input_code, c
return error;
}
+#ifdef DEBUG_PERL
+#define HACK_CLEAN_CODE "eval{foreach my $kl(keys %main::) {eval{print qq'DEBUG: ' . $kl . '/' . $$kl . '/' . $$$kl . qq'\n';undef($$kl);} if (defined($$kl) && ($kl =~ /^\\w+[\\w\\d_]+$/))}}"
+#else
#define HACK_CLEAN_CODE "eval{foreach my $kl(keys %main::) {eval{undef($$kl);} if (defined($$kl) && ($kl =~ /^\\w+[\\w\\d_]+$/))}}"
+#endif
static void destroy_perl(PerlInterpreter ** to_destroy)
{
diff --git a/src/mod/languages/mod_perl/mod_perl_wrap.cpp b/src/mod/languages/mod_perl/mod_perl_wrap.cpp
index fe0e3ee73e..1aa1ebbb5c 100644
--- a/src/mod/languages/mod_perl/mod_perl_wrap.cpp
+++ b/src/mod/languages/mod_perl/mod_perl_wrap.cpp
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
@@ -8,7 +8,11 @@
* interface file instead.
* ----------------------------------------------------------------------------- */
+
+#ifndef SWIGPERL
#define SWIGPERL
+#endif
+
#define SWIG_CASTRANK_MODE
@@ -102,9 +106,11 @@ template T SwigValueInit() {
#endif
/* exporting methods */
-#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-# ifndef GCC_HASCLASSVISIBILITY
-# define GCC_HASCLASSVISIBILITY
+#if defined(__GNUC__)
+# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# ifndef GCC_HASCLASSVISIBILITY
+# define GCC_HASCLASSVISIBILITY
+# endif
# endif
#endif
@@ -143,6 +149,19 @@ template T SwigValueInit() {
# define _SCL_SECURE_NO_DEPRECATE
#endif
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used. So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -641,16 +660,16 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
char d = *(c++);
unsigned char uu;
if ((d >= '0') && (d <= '9'))
- uu = ((d - '0') << 4);
+ uu = (unsigned char)((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
- uu = ((d - ('a'-10)) << 4);
+ uu = (unsigned char)((d - ('a'-10)) << 4);
else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
- uu |= (d - '0');
+ uu |= (unsigned char)(d - '0');
else if ((d >= 'a') && (d <= 'f'))
- uu |= (d - ('a'-10));
+ uu |= (unsigned char)(d - ('a'-10));
else
return (char *) 0;
*u = uu;
@@ -1018,9 +1037,9 @@ typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *);
# ifdef PERL_OBJECT
# define SWIG_croak_null() SWIG_Perl_croak_null(pPerl)
-static void SWIG_Perl_croak_null(CPerlObj *pPerl)
+static void SWIGUNUSED SWIG_Perl_croak_null(CPerlObj *pPerl)
# else
-static void SWIG_croak_null()
+static void SWIGUNUSED SWIG_croak_null()
# endif
{
SV *err = get_sv("@", GV_ADD);
@@ -1489,6 +1508,9 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#ifdef stat
#undef stat
#endif
+#ifdef seed
+ #undef seed
+#endif
#ifdef bool
/* Leave if macro is from C99 stdbool.h */
@@ -1549,7 +1571,7 @@ static swig_module_info swig_module = {swig_types, 29, 0, 0, 0, 0};
#define SWIG_name "freeswitchc::boot_freeswitch"
#define SWIG_prefix "freeswitchc::"
-#define SWIGVERSION 0x030002
+#define SWIGVERSION 0x030010
#define SWIG_VERSION SWIGVERSION
@@ -1664,6 +1686,17 @@ SWIG_FromCharPtr(const char *cptr)
#endif
+#include
+#ifdef _MSC_VER
+# ifndef strtoull
+# define strtoull _strtoui64
+# endif
+# ifndef strtoll
+# define strtoll _strtoi64
+# endif
+#endif
+
+
SWIGINTERN int
SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val)
{
@@ -1736,14 +1769,14 @@ SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val)
{
if (SvUOK(obj)) {
UV v = SvUV(obj);
- if (v <= LONG_MAX) {
+ if (UVSIZE < sizeof(*val) || v <= LONG_MAX) {
if (val) *val = v;
return SWIG_OK;
}
return SWIG_OverflowError;
} else if (SvIOK(obj)) {
IV v = SvIV(obj);
- if (v >= LONG_MIN && v <= LONG_MAX) {
+ if (IVSIZE <= sizeof(*val) || (v >= LONG_MIN && v <= LONG_MAX)) {
if(val) *val = v;
return SWIG_OK;
}
@@ -1806,7 +1839,7 @@ SWIGINTERNINLINE SV *
SWIG_From_long SWIG_PERL_DECL_ARGS_1(long value)
{
SV *sv;
- if (value >= IV_MIN && value <= IV_MAX)
+ if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX))
sv = newSViv(value);
else
sv = newSVpvf("%ld", value);
@@ -1877,14 +1910,14 @@ SWIG_AsVal_unsigned_SS_long SWIG_PERL_DECL_ARGS_2(SV *obj, unsigned long *val)
{
if (SvUOK(obj)) {
UV v = SvUV(obj);
- if (v <= ULONG_MAX) {
+ if (UVSIZE <= sizeof(*val) || v <= ULONG_MAX) {
if (val) *val = v;
return SWIG_OK;
}
return SWIG_OverflowError;
} else if (SvIOK(obj)) {
IV v = SvIV(obj);
- if (v >= 0 && v <= ULONG_MAX) {
+ if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULONG_MAX)) {
if (val) *val = v;
return SWIG_OK;
}
@@ -1940,7 +1973,7 @@ SWIGINTERNINLINE SV *
SWIG_From_unsigned_SS_long SWIG_PERL_DECL_ARGS_1(unsigned long value)
{
SV *sv;
- if (value <= UV_MAX)
+ if (UVSIZE >= sizeof(value) || value <= UV_MAX)
sv = newSVuv(value);
else
sv = newSVpvf("%lu", value);
@@ -10599,7 +10632,7 @@ SWIGRUNTIME void
SWIG_InitializeModule(void *clientdata) {
size_t i;
swig_module_info *module_head, *iter;
- int found, init;
+ int init;
/* check to see if the circular list has been setup, if not, set it up */
if (swig_module.next==0) {
@@ -10618,22 +10651,18 @@ SWIG_InitializeModule(void *clientdata) {
/* This is the first module loaded for this interpreter */
/* so set the swig module into the interpreter */
SWIG_SetModule(clientdata, &swig_module);
- module_head = &swig_module;
} else {
/* the interpreter has loaded a SWIG module, but has it loaded this one? */
- found=0;
iter=module_head;
do {
if (iter==&swig_module) {
- found=1;
- break;
+ /* Our module is already in the list, so there's nothing more to do. */
+ return;
}
iter=iter->next;
} while (iter!= module_head);
- /* if the is found in the list, then all is done and we may leave */
- if (found) return;
- /* otherwise we must add out module into the list */
+ /* otherwise we must add our module into the list */
swig_module.next = module_head->next;
module_head->next = &swig_module;
}
@@ -10779,13 +10808,14 @@ SWIG_PropagateClientData(void) {
-#ifdef __cplusplus
+#if defined(__cplusplus) && ! defined(XSPROTO)
extern "C"
#endif
XS(SWIG_init) {
dXSARGS;
int i;
+ (void)items;
SWIG_InitializeModule(0);
diff --git a/src/mod/languages/mod_python/freeswitch.py b/src/mod/languages/mod_python/freeswitch.py
index 82a55b8342..387b6af014 100644
--- a/src/mod/languages/mod_python/freeswitch.py
+++ b/src/mod/languages/mod_python/freeswitch.py
@@ -1,5 +1,5 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 3.0.2
+# Version 3.0.10
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
@@ -8,8 +8,19 @@
-from sys import version_info
-if version_info >= (2,6,0):
+from sys import version_info as _swig_python_version_info
+if _swig_python_version_info >= (2, 7, 0):
+ def swig_import_helper():
+ import importlib
+ pkg = __name__.rpartition('.')[0]
+ mname = '.'.join((pkg, '_freeswitch')).lstrip('.')
+ try:
+ return importlib.import_module(mname)
+ except ImportError:
+ return importlib.import_module('_freeswitch')
+ _freeswitch = swig_import_helper()
+ del swig_import_helper
+elif _swig_python_version_info >= (2, 6, 0):
def swig_import_helper():
from os.path import dirname
import imp
@@ -29,73 +40,91 @@ if version_info >= (2,6,0):
del swig_import_helper
else:
import _freeswitch
-del version_info
+del _swig_python_version_info
try:
_swig_property = property
except NameError:
- pass # Python < 2.2 doesn't have 'property'.
-def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
- if (name == "thisown"): return self.this.own(value)
+ pass # Python < 2.2 doesn't have 'property'.
+
+try:
+ import builtins as __builtin__
+except ImportError:
+ import __builtin__
+
+def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
+ if (name == "thisown"):
+ return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'SwigPyObject':
self.__dict__[name] = value
return
- method = class_type.__swig_setmethods__.get(name,None)
- if method: return method(self,value)
+ method = class_type.__swig_setmethods__.get(name, None)
+ if method:
+ return method(self, value)
if (not static):
- self.__dict__[name] = value
+ if _newclass:
+ object.__setattr__(self, name, value)
+ else:
+ self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
-def _swig_setattr(self,class_type,name,value):
- return _swig_setattr_nondynamic(self,class_type,name,value,0)
-def _swig_getattr(self,class_type,name):
- if (name == "thisown"): return self.this.own()
- method = class_type.__swig_getmethods__.get(name,None)
- if method: return method(self)
- raise AttributeError(name)
+def _swig_setattr(self, class_type, name, value):
+ return _swig_setattr_nondynamic(self, class_type, name, value, 0)
+
+
+def _swig_getattr(self, class_type, name):
+ if (name == "thisown"):
+ return self.this.own()
+ method = class_type.__swig_getmethods__.get(name, None)
+ if method:
+ return method(self)
+ raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
+
def _swig_repr(self):
- try: strthis = "proxy of " + self.this.__repr__()
- except: strthis = ""
+ try:
+ strthis = "proxy of " + self.this.__repr__()
+ except __builtin__.Exception:
+ strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
try:
_object = object
_newclass = 1
-except AttributeError:
- class _object : pass
+except __builtin__.Exception:
+ class _object:
+ pass
_newclass = 0
-
-def setGlobalVariable(*args):
- return _freeswitch.setGlobalVariable(*args)
+def setGlobalVariable(var_name, var_val):
+ return _freeswitch.setGlobalVariable(var_name, var_val)
setGlobalVariable = _freeswitch.setGlobalVariable
-def getGlobalVariable(*args):
- return _freeswitch.getGlobalVariable(*args)
+def getGlobalVariable(var_name):
+ return _freeswitch.getGlobalVariable(var_name)
getGlobalVariable = _freeswitch.getGlobalVariable
-def consoleLog(*args):
- return _freeswitch.consoleLog(*args)
+def consoleLog(level_str, msg):
+ return _freeswitch.consoleLog(level_str, msg)
consoleLog = _freeswitch.consoleLog
-def consoleLog2(*args):
- return _freeswitch.consoleLog2(*args)
+def consoleLog2(level_str, file, func, line, msg):
+ return _freeswitch.consoleLog2(level_str, file, func, line, msg)
consoleLog2 = _freeswitch.consoleLog2
-def consoleCleanLog(*args):
- return _freeswitch.consoleCleanLog(*args)
+def consoleCleanLog(msg):
+ return _freeswitch.consoleCleanLog(msg)
consoleCleanLog = _freeswitch.consoleCleanLog
def running():
- return _freeswitch.running()
+ return _freeswitch.running()
running = _freeswitch.running
-def email(*args):
- return _freeswitch.email(*args)
+def email(to, arg2, headers=None, body=None, file=None, convert_cmd=None, convert_ext=None):
+ return _freeswitch.email(to, arg2, headers, body, file, convert_cmd, convert_ext)
email = _freeswitch.email
class IVRMenu(_object):
__swig_setmethods__ = {}
@@ -103,14 +132,21 @@ class IVRMenu(_object):
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, IVRMenu, name)
__repr__ = _swig_repr
- def __init__(self, *args):
- this = _freeswitch.new_IVRMenu(*args)
- try: self.this.append(this)
- except: self.this = this
+
+ def __init__(self, main, name, greeting_sound, short_greeting_sound, invalid_sound, exit_sound, transfer_sound, confirm_macro, confirm_key, tts_engine, tts_voice, confirm_attempts, inter_timeout, digit_len, timeout, max_failures, max_timeouts):
+ this = _freeswitch.new_IVRMenu(main, name, greeting_sound, short_greeting_sound, invalid_sound, exit_sound, transfer_sound, confirm_macro, confirm_key, tts_engine, tts_voice, confirm_attempts, inter_timeout, digit_len, timeout, max_failures, max_timeouts)
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_IVRMenu
- __del__ = lambda self : None;
- def bindAction(self, *args): return _freeswitch.IVRMenu_bindAction(self, *args)
- def execute(self, *args): return _freeswitch.IVRMenu_execute(self, *args)
+ __del__ = lambda self: None
+
+ def bindAction(self, action, arg, bind):
+ return _freeswitch.IVRMenu_bindAction(self, action, arg, bind)
+
+ def execute(self, session, name):
+ return _freeswitch.IVRMenu_execute(self, session, name)
IVRMenu_swigregister = _freeswitch.IVRMenu_swigregister
IVRMenu_swigregister(IVRMenu)
@@ -120,15 +156,24 @@ class API(_object):
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, API, name)
__repr__ = _swig_repr
- def __init__(self, s=None):
+
+ def __init__(self, s=None):
this = _freeswitch.new_API(s)
- try: self.this.append(this)
- except: self.this = this
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_API
- __del__ = lambda self : None;
- def execute(self, *args): return _freeswitch.API_execute(self, *args)
- def executeString(self, *args): return _freeswitch.API_executeString(self, *args)
- def getTime(self): return _freeswitch.API_getTime(self)
+ __del__ = lambda self: None
+
+ def execute(self, command, data=None):
+ return _freeswitch.API_execute(self, command, data)
+
+ def executeString(self, command):
+ return _freeswitch.API_executeString(self, command)
+
+ def getTime(self):
+ return _freeswitch.API_getTime(self)
API_swigregister = _freeswitch.API_swigregister
API_swigregister(API)
@@ -140,22 +185,29 @@ class input_callback_state_t(_object):
__repr__ = _swig_repr
__swig_setmethods__["function"] = _freeswitch.input_callback_state_t_function_set
__swig_getmethods__["function"] = _freeswitch.input_callback_state_t_function_get
- if _newclass:function = _swig_property(_freeswitch.input_callback_state_t_function_get, _freeswitch.input_callback_state_t_function_set)
+ if _newclass:
+ function = _swig_property(_freeswitch.input_callback_state_t_function_get, _freeswitch.input_callback_state_t_function_set)
__swig_setmethods__["threadState"] = _freeswitch.input_callback_state_t_threadState_set
__swig_getmethods__["threadState"] = _freeswitch.input_callback_state_t_threadState_get
- if _newclass:threadState = _swig_property(_freeswitch.input_callback_state_t_threadState_get, _freeswitch.input_callback_state_t_threadState_set)
+ if _newclass:
+ threadState = _swig_property(_freeswitch.input_callback_state_t_threadState_get, _freeswitch.input_callback_state_t_threadState_set)
__swig_setmethods__["extra"] = _freeswitch.input_callback_state_t_extra_set
__swig_getmethods__["extra"] = _freeswitch.input_callback_state_t_extra_get
- if _newclass:extra = _swig_property(_freeswitch.input_callback_state_t_extra_get, _freeswitch.input_callback_state_t_extra_set)
+ if _newclass:
+ extra = _swig_property(_freeswitch.input_callback_state_t_extra_get, _freeswitch.input_callback_state_t_extra_set)
__swig_setmethods__["funcargs"] = _freeswitch.input_callback_state_t_funcargs_set
__swig_getmethods__["funcargs"] = _freeswitch.input_callback_state_t_funcargs_get
- if _newclass:funcargs = _swig_property(_freeswitch.input_callback_state_t_funcargs_get, _freeswitch.input_callback_state_t_funcargs_set)
- def __init__(self):
+ if _newclass:
+ funcargs = _swig_property(_freeswitch.input_callback_state_t_funcargs_get, _freeswitch.input_callback_state_t_funcargs_set)
+
+ def __init__(self):
this = _freeswitch.new_input_callback_state_t()
- try: self.this.append(this)
- except: self.this = this
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_input_callback_state_t
- __del__ = lambda self : None;
+ __del__ = lambda self: None
input_callback_state_t_swigregister = _freeswitch.input_callback_state_t_swigregister
input_callback_state_t_swigregister(input_callback_state_t)
@@ -170,16 +222,21 @@ class DTMF(_object):
__repr__ = _swig_repr
__swig_setmethods__["digit"] = _freeswitch.DTMF_digit_set
__swig_getmethods__["digit"] = _freeswitch.DTMF_digit_get
- if _newclass:digit = _swig_property(_freeswitch.DTMF_digit_get, _freeswitch.DTMF_digit_set)
+ if _newclass:
+ digit = _swig_property(_freeswitch.DTMF_digit_get, _freeswitch.DTMF_digit_set)
__swig_setmethods__["duration"] = _freeswitch.DTMF_duration_set
__swig_getmethods__["duration"] = _freeswitch.DTMF_duration_get
- if _newclass:duration = _swig_property(_freeswitch.DTMF_duration_get, _freeswitch.DTMF_duration_set)
- def __init__(self, *args):
+ if _newclass:
+ duration = _swig_property(_freeswitch.DTMF_duration_get, _freeswitch.DTMF_duration_set)
+
+ def __init__(self, *args):
this = _freeswitch.new_DTMF(*args)
- try: self.this.append(this)
- except: self.this = this
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_DTMF
- __del__ = lambda self : None;
+ __del__ = lambda self: None
DTMF_swigregister = _freeswitch.DTMF_swigregister
DTMF_swigregister(DTMF)
@@ -189,16 +246,27 @@ class Stream(_object):
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, Stream, name)
__repr__ = _swig_repr
- def __init__(self, *args):
+
+ def __init__(self, *args):
this = _freeswitch.new_Stream(*args)
- try: self.this.append(this)
- except: self.this = this
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_Stream
- __del__ = lambda self : None;
- def read(self, *args): return _freeswitch.Stream_read(self, *args)
- def write(self, *args): return _freeswitch.Stream_write(self, *args)
- def raw_write(self, *args): return _freeswitch.Stream_raw_write(self, *args)
- def get_data(self): return _freeswitch.Stream_get_data(self)
+ __del__ = lambda self: None
+
+ def read(self, len):
+ return _freeswitch.Stream_read(self, len)
+
+ def write(self, data):
+ return _freeswitch.Stream_write(self, data)
+
+ def raw_write(self, data, len):
+ return _freeswitch.Stream_raw_write(self, data, len)
+
+ def get_data(self):
+ return _freeswitch.Stream_get_data(self)
Stream_swigregister = _freeswitch.Stream_swigregister
Stream_swigregister(Stream)
@@ -210,30 +278,58 @@ class Event(_object):
__repr__ = _swig_repr
__swig_setmethods__["event"] = _freeswitch.Event_event_set
__swig_getmethods__["event"] = _freeswitch.Event_event_get
- if _newclass:event = _swig_property(_freeswitch.Event_event_get, _freeswitch.Event_event_set)
+ if _newclass:
+ event = _swig_property(_freeswitch.Event_event_get, _freeswitch.Event_event_set)
__swig_setmethods__["serialized_string"] = _freeswitch.Event_serialized_string_set
__swig_getmethods__["serialized_string"] = _freeswitch.Event_serialized_string_get
- if _newclass:serialized_string = _swig_property(_freeswitch.Event_serialized_string_get, _freeswitch.Event_serialized_string_set)
+ if _newclass:
+ serialized_string = _swig_property(_freeswitch.Event_serialized_string_get, _freeswitch.Event_serialized_string_set)
__swig_setmethods__["mine"] = _freeswitch.Event_mine_set
__swig_getmethods__["mine"] = _freeswitch.Event_mine_get
- if _newclass:mine = _swig_property(_freeswitch.Event_mine_get, _freeswitch.Event_mine_set)
- def __init__(self, *args):
+ if _newclass:
+ mine = _swig_property(_freeswitch.Event_mine_get, _freeswitch.Event_mine_set)
+
+ def __init__(self, *args):
this = _freeswitch.new_Event(*args)
- try: self.this.append(this)
- except: self.this = this
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_Event
- __del__ = lambda self : None;
- def chat_execute(self, *args): return _freeswitch.Event_chat_execute(self, *args)
- def chat_send(self, dest_proto=None): return _freeswitch.Event_chat_send(self, dest_proto)
- def serialize(self, format=None): return _freeswitch.Event_serialize(self, format)
- def setPriority(self, *args): return _freeswitch.Event_setPriority(self, *args)
- def getHeader(self, *args): return _freeswitch.Event_getHeader(self, *args)
- def getBody(self): return _freeswitch.Event_getBody(self)
- def getType(self): return _freeswitch.Event_getType(self)
- def addBody(self, *args): return _freeswitch.Event_addBody(self, *args)
- def addHeader(self, *args): return _freeswitch.Event_addHeader(self, *args)
- def delHeader(self, *args): return _freeswitch.Event_delHeader(self, *args)
- def fire(self): return _freeswitch.Event_fire(self)
+ __del__ = lambda self: None
+
+ def chat_execute(self, app, data=None):
+ return _freeswitch.Event_chat_execute(self, app, data)
+
+ def chat_send(self, dest_proto=None):
+ return _freeswitch.Event_chat_send(self, dest_proto)
+
+ def serialize(self, format=None):
+ return _freeswitch.Event_serialize(self, format)
+
+ def setPriority(self, *args):
+ return _freeswitch.Event_setPriority(self, *args)
+
+ def getHeader(self, header_name):
+ return _freeswitch.Event_getHeader(self, header_name)
+
+ def getBody(self):
+ return _freeswitch.Event_getBody(self)
+
+ def getType(self):
+ return _freeswitch.Event_getType(self)
+
+ def addBody(self, value):
+ return _freeswitch.Event_addBody(self, value)
+
+ def addHeader(self, header_name, value):
+ return _freeswitch.Event_addHeader(self, header_name, value)
+
+ def delHeader(self, header_name):
+ return _freeswitch.Event_delHeader(self, header_name)
+
+ def fire(self):
+ return _freeswitch.Event_fire(self)
Event_swigregister = _freeswitch.Event_swigregister
Event_swigregister(Event)
@@ -245,34 +341,50 @@ class EventConsumer(_object):
__repr__ = _swig_repr
__swig_setmethods__["events"] = _freeswitch.EventConsumer_events_set
__swig_getmethods__["events"] = _freeswitch.EventConsumer_events_get
- if _newclass:events = _swig_property(_freeswitch.EventConsumer_events_get, _freeswitch.EventConsumer_events_set)
+ if _newclass:
+ events = _swig_property(_freeswitch.EventConsumer_events_get, _freeswitch.EventConsumer_events_set)
__swig_setmethods__["e_event_id"] = _freeswitch.EventConsumer_e_event_id_set
__swig_getmethods__["e_event_id"] = _freeswitch.EventConsumer_e_event_id_get
- if _newclass:e_event_id = _swig_property(_freeswitch.EventConsumer_e_event_id_get, _freeswitch.EventConsumer_e_event_id_set)
+ if _newclass:
+ e_event_id = _swig_property(_freeswitch.EventConsumer_e_event_id_get, _freeswitch.EventConsumer_e_event_id_set)
__swig_setmethods__["e_callback"] = _freeswitch.EventConsumer_e_callback_set
__swig_getmethods__["e_callback"] = _freeswitch.EventConsumer_e_callback_get
- if _newclass:e_callback = _swig_property(_freeswitch.EventConsumer_e_callback_get, _freeswitch.EventConsumer_e_callback_set)
+ if _newclass:
+ e_callback = _swig_property(_freeswitch.EventConsumer_e_callback_get, _freeswitch.EventConsumer_e_callback_set)
__swig_setmethods__["e_subclass_name"] = _freeswitch.EventConsumer_e_subclass_name_set
__swig_getmethods__["e_subclass_name"] = _freeswitch.EventConsumer_e_subclass_name_get
- if _newclass:e_subclass_name = _swig_property(_freeswitch.EventConsumer_e_subclass_name_get, _freeswitch.EventConsumer_e_subclass_name_set)
+ if _newclass:
+ e_subclass_name = _swig_property(_freeswitch.EventConsumer_e_subclass_name_get, _freeswitch.EventConsumer_e_subclass_name_set)
__swig_setmethods__["e_cb_arg"] = _freeswitch.EventConsumer_e_cb_arg_set
__swig_getmethods__["e_cb_arg"] = _freeswitch.EventConsumer_e_cb_arg_get
- if _newclass:e_cb_arg = _swig_property(_freeswitch.EventConsumer_e_cb_arg_get, _freeswitch.EventConsumer_e_cb_arg_set)
+ if _newclass:
+ e_cb_arg = _swig_property(_freeswitch.EventConsumer_e_cb_arg_get, _freeswitch.EventConsumer_e_cb_arg_set)
__swig_setmethods__["enodes"] = _freeswitch.EventConsumer_enodes_set
__swig_getmethods__["enodes"] = _freeswitch.EventConsumer_enodes_get
- if _newclass:enodes = _swig_property(_freeswitch.EventConsumer_enodes_get, _freeswitch.EventConsumer_enodes_set)
+ if _newclass:
+ enodes = _swig_property(_freeswitch.EventConsumer_enodes_get, _freeswitch.EventConsumer_enodes_set)
__swig_setmethods__["node_index"] = _freeswitch.EventConsumer_node_index_set
__swig_getmethods__["node_index"] = _freeswitch.EventConsumer_node_index_get
- if _newclass:node_index = _swig_property(_freeswitch.EventConsumer_node_index_get, _freeswitch.EventConsumer_node_index_set)
- def __init__(self, event_name=None, subclass_name="", len=5000):
- this = _freeswitch.new_EventConsumer(event_name, subclass_name, len)
- try: self.this.append(this)
- except: self.this = this
+ if _newclass:
+ node_index = _swig_property(_freeswitch.EventConsumer_node_index_get, _freeswitch.EventConsumer_node_index_set)
+
+ def __init__(self, *args):
+ this = _freeswitch.new_EventConsumer(*args)
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_EventConsumer
- __del__ = lambda self : None;
- def bind(self, *args): return _freeswitch.EventConsumer_bind(self, *args)
- def pop(self, block=0, timeout=0): return _freeswitch.EventConsumer_pop(self, block, timeout)
- def cleanup(self): return _freeswitch.EventConsumer_cleanup(self)
+ __del__ = lambda self: None
+
+ def bind(self, *args):
+ return _freeswitch.EventConsumer_bind(self, *args)
+
+ def pop(self, block=0, timeout=0):
+ return _freeswitch.EventConsumer_pop(self, block, timeout)
+
+ def cleanup(self):
+ return _freeswitch.EventConsumer_cleanup(self)
EventConsumer_swigregister = _freeswitch.EventConsumer_swigregister
EventConsumer_swigregister(EventConsumer)
@@ -281,158 +393,301 @@ class CoreSession(_object):
__setattr__ = lambda self, name, value: _swig_setattr(self, CoreSession, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, CoreSession, name)
- def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract")
+
+ def __init__(self, *args, **kwargs):
+ raise AttributeError("No constructor defined - class is abstract")
__repr__ = _swig_repr
__swig_destroy__ = _freeswitch.delete_CoreSession
- __del__ = lambda self : None;
+ __del__ = lambda self: None
__swig_setmethods__["session"] = _freeswitch.CoreSession_session_set
__swig_getmethods__["session"] = _freeswitch.CoreSession_session_get
- if _newclass:session = _swig_property(_freeswitch.CoreSession_session_get, _freeswitch.CoreSession_session_set)
+ if _newclass:
+ session = _swig_property(_freeswitch.CoreSession_session_get, _freeswitch.CoreSession_session_set)
__swig_setmethods__["channel"] = _freeswitch.CoreSession_channel_set
__swig_getmethods__["channel"] = _freeswitch.CoreSession_channel_get
- if _newclass:channel = _swig_property(_freeswitch.CoreSession_channel_get, _freeswitch.CoreSession_channel_set)
+ if _newclass:
+ channel = _swig_property(_freeswitch.CoreSession_channel_get, _freeswitch.CoreSession_channel_set)
__swig_setmethods__["flags"] = _freeswitch.CoreSession_flags_set
__swig_getmethods__["flags"] = _freeswitch.CoreSession_flags_get
- if _newclass:flags = _swig_property(_freeswitch.CoreSession_flags_get, _freeswitch.CoreSession_flags_set)
+ if _newclass:
+ flags = _swig_property(_freeswitch.CoreSession_flags_get, _freeswitch.CoreSession_flags_set)
__swig_setmethods__["allocated"] = _freeswitch.CoreSession_allocated_set
__swig_getmethods__["allocated"] = _freeswitch.CoreSession_allocated_get
- if _newclass:allocated = _swig_property(_freeswitch.CoreSession_allocated_get, _freeswitch.CoreSession_allocated_set)
+ if _newclass:
+ allocated = _swig_property(_freeswitch.CoreSession_allocated_get, _freeswitch.CoreSession_allocated_set)
__swig_setmethods__["cb_state"] = _freeswitch.CoreSession_cb_state_set
__swig_getmethods__["cb_state"] = _freeswitch.CoreSession_cb_state_get
- if _newclass:cb_state = _swig_property(_freeswitch.CoreSession_cb_state_get, _freeswitch.CoreSession_cb_state_set)
+ if _newclass:
+ cb_state = _swig_property(_freeswitch.CoreSession_cb_state_get, _freeswitch.CoreSession_cb_state_set)
__swig_setmethods__["hook_state"] = _freeswitch.CoreSession_hook_state_set
__swig_getmethods__["hook_state"] = _freeswitch.CoreSession_hook_state_get
- if _newclass:hook_state = _swig_property(_freeswitch.CoreSession_hook_state_get, _freeswitch.CoreSession_hook_state_set)
+ if _newclass:
+ hook_state = _swig_property(_freeswitch.CoreSession_hook_state_get, _freeswitch.CoreSession_hook_state_set)
__swig_setmethods__["cause"] = _freeswitch.CoreSession_cause_set
__swig_getmethods__["cause"] = _freeswitch.CoreSession_cause_get
- if _newclass:cause = _swig_property(_freeswitch.CoreSession_cause_get, _freeswitch.CoreSession_cause_set)
+ if _newclass:
+ cause = _swig_property(_freeswitch.CoreSession_cause_get, _freeswitch.CoreSession_cause_set)
__swig_setmethods__["uuid"] = _freeswitch.CoreSession_uuid_set
__swig_getmethods__["uuid"] = _freeswitch.CoreSession_uuid_get
- if _newclass:uuid = _swig_property(_freeswitch.CoreSession_uuid_get, _freeswitch.CoreSession_uuid_set)
+ if _newclass:
+ uuid = _swig_property(_freeswitch.CoreSession_uuid_get, _freeswitch.CoreSession_uuid_set)
__swig_setmethods__["tts_name"] = _freeswitch.CoreSession_tts_name_set
__swig_getmethods__["tts_name"] = _freeswitch.CoreSession_tts_name_get
- if _newclass:tts_name = _swig_property(_freeswitch.CoreSession_tts_name_get, _freeswitch.CoreSession_tts_name_set)
+ if _newclass:
+ tts_name = _swig_property(_freeswitch.CoreSession_tts_name_get, _freeswitch.CoreSession_tts_name_set)
__swig_setmethods__["voice_name"] = _freeswitch.CoreSession_voice_name_set
__swig_getmethods__["voice_name"] = _freeswitch.CoreSession_voice_name_get
- if _newclass:voice_name = _swig_property(_freeswitch.CoreSession_voice_name_get, _freeswitch.CoreSession_voice_name_set)
- def insertFile(self, *args): return _freeswitch.CoreSession_insertFile(self, *args)
- def answer(self): return _freeswitch.CoreSession_answer(self)
- def _print(self, *args): return _freeswitch.CoreSession__print(self, *args)
- def preAnswer(self): return _freeswitch.CoreSession_preAnswer(self)
- def hangup(self, cause="normal_clearing"): return _freeswitch.CoreSession_hangup(self, cause)
- def hangupState(self): return _freeswitch.CoreSession_hangupState(self)
- def setVariable(self, *args): return _freeswitch.CoreSession_setVariable(self, *args)
- def setPrivate(self, *args): return _freeswitch.CoreSession_setPrivate(self, *args)
- def getPrivate(self, *args): return _freeswitch.CoreSession_getPrivate(self, *args)
- def getVariable(self, *args): return _freeswitch.CoreSession_getVariable(self, *args)
- def process_callback_result(self, *args): return _freeswitch.CoreSession_process_callback_result(self, *args)
- def say(self, *args): return _freeswitch.CoreSession_say(self, *args)
- def sayPhrase(self, *args): return _freeswitch.CoreSession_sayPhrase(self, *args)
- def hangupCause(self): return _freeswitch.CoreSession_hangupCause(self)
- def getState(self): return _freeswitch.CoreSession_getState(self)
- def recordFile(self, *args): return _freeswitch.CoreSession_recordFile(self, *args)
- def originate(self, *args): return _freeswitch.CoreSession_originate(self, *args)
- def destroy(self): return _freeswitch.CoreSession_destroy(self)
- def setDTMFCallback(self, *args): return _freeswitch.CoreSession_setDTMFCallback(self, *args)
- def speak(self, *args): return _freeswitch.CoreSession_speak(self, *args)
- def set_tts_parms(self, *args): return _freeswitch.CoreSession_set_tts_parms(self, *args)
- def set_tts_params(self, *args): return _freeswitch.CoreSession_set_tts_params(self, *args)
- def collectDigits(self, *args): return _freeswitch.CoreSession_collectDigits(self, *args)
- def getDigits(self, *args): return _freeswitch.CoreSession_getDigits(self, *args)
- def transfer(self, *args): return _freeswitch.CoreSession_transfer(self, *args)
- def read(self, *args): return _freeswitch.CoreSession_read(self, *args)
- def playAndGetDigits(self, *args): return _freeswitch.CoreSession_playAndGetDigits(self, *args)
- def streamFile(self, *args): return _freeswitch.CoreSession_streamFile(self, *args)
- def sleep(self, *args): return _freeswitch.CoreSession_sleep(self, *args)
- def flushEvents(self): return _freeswitch.CoreSession_flushEvents(self)
- def flushDigits(self): return _freeswitch.CoreSession_flushDigits(self)
- def setAutoHangup(self, *args): return _freeswitch.CoreSession_setAutoHangup(self, *args)
- def setHangupHook(self, *args): return _freeswitch.CoreSession_setHangupHook(self, *args)
- def ready(self): return _freeswitch.CoreSession_ready(self)
- def bridged(self): return _freeswitch.CoreSession_bridged(self)
- def answered(self): return _freeswitch.CoreSession_answered(self)
- def mediaReady(self): return _freeswitch.CoreSession_mediaReady(self)
- def waitForAnswer(self, *args): return _freeswitch.CoreSession_waitForAnswer(self, *args)
- def execute(self, *args): return _freeswitch.CoreSession_execute(self, *args)
- def sendEvent(self, *args): return _freeswitch.CoreSession_sendEvent(self, *args)
- def setEventData(self, *args): return _freeswitch.CoreSession_setEventData(self, *args)
- def getXMLCDR(self): return _freeswitch.CoreSession_getXMLCDR(self)
- def begin_allow_threads(self): return _freeswitch.CoreSession_begin_allow_threads(self)
- def end_allow_threads(self): return _freeswitch.CoreSession_end_allow_threads(self)
- def get_uuid(self): return _freeswitch.CoreSession_get_uuid(self)
- def get_cb_args(self): return _freeswitch.CoreSession_get_cb_args(self)
- def check_hangup_hook(self): return _freeswitch.CoreSession_check_hangup_hook(self)
- def run_dtmf_callback(self, *args): return _freeswitch.CoreSession_run_dtmf_callback(self, *args)
- def consoleLog(self, *args): return _freeswitch.CoreSession_consoleLog(self, *args)
- def consoleLog2(self, *args): return _freeswitch.CoreSession_consoleLog2(self, *args)
+ if _newclass:
+ voice_name = _swig_property(_freeswitch.CoreSession_voice_name_get, _freeswitch.CoreSession_voice_name_set)
+
+ def insertFile(self, file, insert_file, sample_point):
+ return _freeswitch.CoreSession_insertFile(self, file, insert_file, sample_point)
+
+ def answer(self):
+ return _freeswitch.CoreSession_answer(self)
+
+ def _print(self, txt):
+ return _freeswitch.CoreSession__print(self, txt)
+
+ def preAnswer(self):
+ return _freeswitch.CoreSession_preAnswer(self)
+
+ def hangup(self, *args):
+ return _freeswitch.CoreSession_hangup(self, *args)
+
+ def hangupState(self):
+ return _freeswitch.CoreSession_hangupState(self)
+
+ def setVariable(self, var, val):
+ return _freeswitch.CoreSession_setVariable(self, var, val)
+
+ def setPrivate(self, var, val):
+ return _freeswitch.CoreSession_setPrivate(self, var, val)
+
+ def getPrivate(self, var):
+ return _freeswitch.CoreSession_getPrivate(self, var)
+
+ def getVariable(self, var):
+ return _freeswitch.CoreSession_getVariable(self, var)
+
+ def process_callback_result(self, result):
+ return _freeswitch.CoreSession_process_callback_result(self, result)
+
+ def say(self, tosay, module_name, say_type, say_method, say_gender=None):
+ return _freeswitch.CoreSession_say(self, tosay, module_name, say_type, say_method, say_gender)
+
+ def sayPhrase(self, *args):
+ return _freeswitch.CoreSession_sayPhrase(self, *args)
+
+ def hangupCause(self):
+ return _freeswitch.CoreSession_hangupCause(self)
+
+ def getState(self):
+ return _freeswitch.CoreSession_getState(self)
+
+ def recordFile(self, file_name, time_limit=0, silence_threshold=0, silence_hits=0):
+ return _freeswitch.CoreSession_recordFile(self, file_name, time_limit, silence_threshold, silence_hits)
+
+ def originate(self, a_leg_session, dest, timeout=60, handlers=None):
+ return _freeswitch.CoreSession_originate(self, a_leg_session, dest, timeout, handlers)
+
+ def destroy(self):
+ return _freeswitch.CoreSession_destroy(self)
+
+ def setDTMFCallback(self, cbfunc, funcargs):
+ return _freeswitch.CoreSession_setDTMFCallback(self, cbfunc, funcargs)
+
+ def speak(self, text):
+ return _freeswitch.CoreSession_speak(self, text)
+
+ def set_tts_parms(self, tts_name, voice_name):
+ return _freeswitch.CoreSession_set_tts_parms(self, tts_name, voice_name)
+
+ def set_tts_params(self, tts_name, voice_name):
+ return _freeswitch.CoreSession_set_tts_params(self, tts_name, voice_name)
+
+ def collectDigits(self, *args):
+ return _freeswitch.CoreSession_collectDigits(self, *args)
+
+ def getDigits(self, *args):
+ return _freeswitch.CoreSession_getDigits(self, *args)
+
+ def transfer(self, extension, dialplan=None, context=None):
+ return _freeswitch.CoreSession_transfer(self, extension, dialplan, context)
+
+ def read(self, min_digits, max_digits, prompt_audio_file, timeout, valid_terminators, digit_timeout=0):
+ return _freeswitch.CoreSession_read(self, min_digits, max_digits, prompt_audio_file, timeout, valid_terminators, digit_timeout)
+
+ def playAndGetDigits(self, min_digits, max_digits, max_tries, timeout, terminators, audio_files, bad_input_audio_files, digits_regex, var_name=None, digit_timeout=0, transfer_on_failure=None):
+ return _freeswitch.CoreSession_playAndGetDigits(self, min_digits, max_digits, max_tries, timeout, terminators, audio_files, bad_input_audio_files, digits_regex, var_name, digit_timeout, transfer_on_failure)
+
+ def streamFile(self, file, starting_sample_count=0):
+ return _freeswitch.CoreSession_streamFile(self, file, starting_sample_count)
+
+ def sleep(self, ms, sync=0):
+ return _freeswitch.CoreSession_sleep(self, ms, sync)
+
+ def flushEvents(self):
+ return _freeswitch.CoreSession_flushEvents(self)
+
+ def flushDigits(self):
+ return _freeswitch.CoreSession_flushDigits(self)
+
+ def setAutoHangup(self, val):
+ return _freeswitch.CoreSession_setAutoHangup(self, val)
+
+ def setHangupHook(self, hangup_func):
+ return _freeswitch.CoreSession_setHangupHook(self, hangup_func)
+
+ def ready(self):
+ return _freeswitch.CoreSession_ready(self)
+
+ def bridged(self):
+ return _freeswitch.CoreSession_bridged(self)
+
+ def answered(self):
+ return _freeswitch.CoreSession_answered(self)
+
+ def mediaReady(self):
+ return _freeswitch.CoreSession_mediaReady(self)
+
+ def waitForAnswer(self, calling_session):
+ return _freeswitch.CoreSession_waitForAnswer(self, calling_session)
+
+ def execute(self, app, data=None):
+ return _freeswitch.CoreSession_execute(self, app, data)
+
+ def sendEvent(self, sendME):
+ return _freeswitch.CoreSession_sendEvent(self, sendME)
+
+ def setEventData(self, e):
+ return _freeswitch.CoreSession_setEventData(self, e)
+
+ def getXMLCDR(self):
+ return _freeswitch.CoreSession_getXMLCDR(self)
+
+ def begin_allow_threads(self):
+ return _freeswitch.CoreSession_begin_allow_threads(self)
+
+ def end_allow_threads(self):
+ return _freeswitch.CoreSession_end_allow_threads(self)
+
+ def get_uuid(self):
+ return _freeswitch.CoreSession_get_uuid(self)
+
+ def get_cb_args(self):
+ return _freeswitch.CoreSession_get_cb_args(self)
+
+ def check_hangup_hook(self):
+ return _freeswitch.CoreSession_check_hangup_hook(self)
+
+ def run_dtmf_callback(self, input, itype):
+ return _freeswitch.CoreSession_run_dtmf_callback(self, input, itype)
+
+ def consoleLog(self, level_str, msg):
+ return _freeswitch.CoreSession_consoleLog(self, level_str, msg)
+
+ def consoleLog2(self, level_str, file, func, line, msg):
+ return _freeswitch.CoreSession_consoleLog2(self, level_str, file, func, line, msg)
CoreSession_swigregister = _freeswitch.CoreSession_swigregister
CoreSession_swigregister(CoreSession)
-def console_log(*args):
- return _freeswitch.console_log(*args)
+def console_log(level_str, msg):
+ return _freeswitch.console_log(level_str, msg)
console_log = _freeswitch.console_log
-def console_log2(*args):
- return _freeswitch.console_log2(*args)
+def console_log2(level_str, file, func, line, msg):
+ return _freeswitch.console_log2(level_str, file, func, line, msg)
console_log2 = _freeswitch.console_log2
-def console_clean_log(*args):
- return _freeswitch.console_clean_log(*args)
+def console_clean_log(msg):
+ return _freeswitch.console_clean_log(msg)
console_clean_log = _freeswitch.console_clean_log
-def msleep(*args):
- return _freeswitch.msleep(*args)
+def msleep(ms):
+ return _freeswitch.msleep(ms)
msleep = _freeswitch.msleep
-def bridge(*args):
- return _freeswitch.bridge(*args)
+def bridge(session_a, session_b):
+ return _freeswitch.bridge(session_a, session_b)
bridge = _freeswitch.bridge
-def hanguphook(*args):
- return _freeswitch.hanguphook(*args)
+def hanguphook(session):
+ return _freeswitch.hanguphook(session)
hanguphook = _freeswitch.hanguphook
-def dtmf_callback(*args):
- return _freeswitch.dtmf_callback(*args)
+def dtmf_callback(session, input, itype, buf, buflen):
+ return _freeswitch.dtmf_callback(session, input, itype, buf, buflen)
dtmf_callback = _freeswitch.dtmf_callback
class Session(CoreSession):
__swig_setmethods__ = {}
- for _s in [CoreSession]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{}))
+ for _s in [CoreSession]:
+ __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
__setattr__ = lambda self, name, value: _swig_setattr(self, Session, name, value)
__swig_getmethods__ = {}
- for _s in [CoreSession]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{}))
+ for _s in [CoreSession]:
+ __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
__getattr__ = lambda self, name: _swig_getattr(self, Session, name)
__repr__ = _swig_repr
- def __init__(self, *args):
+
+ def __init__(self, *args):
this = _freeswitch.new_Session(*args)
- try: self.this.append(this)
- except: self.this = this
+ try:
+ self.this.append(this)
+ except __builtin__.Exception:
+ self.this = this
__swig_destroy__ = _freeswitch.delete_Session
- __del__ = lambda self : None;
- def begin_allow_threads(self): return _freeswitch.Session_begin_allow_threads(self)
- def end_allow_threads(self): return _freeswitch.Session_end_allow_threads(self)
- def check_hangup_hook(self): return _freeswitch.Session_check_hangup_hook(self)
- def destroy(self): return _freeswitch.Session_destroy(self)
- def run_dtmf_callback(self, *args): return _freeswitch.Session_run_dtmf_callback(self, *args)
- def setInputCallback(self, *args): return _freeswitch.Session_setInputCallback(self, *args)
- def unsetInputCallback(self): return _freeswitch.Session_unsetInputCallback(self)
- def setHangupHook(self, *args): return _freeswitch.Session_setHangupHook(self, *args)
- def ready(self): return _freeswitch.Session_ready(self)
+ __del__ = lambda self: None
+
+ def begin_allow_threads(self):
+ return _freeswitch.Session_begin_allow_threads(self)
+
+ def end_allow_threads(self):
+ return _freeswitch.Session_end_allow_threads(self)
+
+ def check_hangup_hook(self):
+ return _freeswitch.Session_check_hangup_hook(self)
+
+ def destroy(self):
+ return _freeswitch.Session_destroy(self)
+
+ def run_dtmf_callback(self, input, itype):
+ return _freeswitch.Session_run_dtmf_callback(self, input, itype)
+
+ def setInputCallback(self, cbfunc, funcargs=None):
+ return _freeswitch.Session_setInputCallback(self, cbfunc, funcargs)
+
+ def unsetInputCallback(self):
+ return _freeswitch.Session_unsetInputCallback(self)
+
+ def setHangupHook(self, pyfunc, arg=None):
+ return _freeswitch.Session_setHangupHook(self, pyfunc, arg)
+
+ def ready(self):
+ return _freeswitch.Session_ready(self)
__swig_setmethods__["cb_function"] = _freeswitch.Session_cb_function_set
__swig_getmethods__["cb_function"] = _freeswitch.Session_cb_function_get
- if _newclass:cb_function = _swig_property(_freeswitch.Session_cb_function_get, _freeswitch.Session_cb_function_set)
+ if _newclass:
+ cb_function = _swig_property(_freeswitch.Session_cb_function_get, _freeswitch.Session_cb_function_set)
__swig_setmethods__["cb_arg"] = _freeswitch.Session_cb_arg_set
__swig_getmethods__["cb_arg"] = _freeswitch.Session_cb_arg_get
- if _newclass:cb_arg = _swig_property(_freeswitch.Session_cb_arg_get, _freeswitch.Session_cb_arg_set)
+ if _newclass:
+ cb_arg = _swig_property(_freeswitch.Session_cb_arg_get, _freeswitch.Session_cb_arg_set)
__swig_setmethods__["hangup_func"] = _freeswitch.Session_hangup_func_set
__swig_getmethods__["hangup_func"] = _freeswitch.Session_hangup_func_get
- if _newclass:hangup_func = _swig_property(_freeswitch.Session_hangup_func_get, _freeswitch.Session_hangup_func_set)
+ if _newclass:
+ hangup_func = _swig_property(_freeswitch.Session_hangup_func_get, _freeswitch.Session_hangup_func_set)
__swig_setmethods__["hangup_func_arg"] = _freeswitch.Session_hangup_func_arg_set
__swig_getmethods__["hangup_func_arg"] = _freeswitch.Session_hangup_func_arg_get
- if _newclass:hangup_func_arg = _swig_property(_freeswitch.Session_hangup_func_arg_get, _freeswitch.Session_hangup_func_arg_set)
- def setPython(self, *args): return _freeswitch.Session_setPython(self, *args)
- def setSelf(self, *args): return _freeswitch.Session_setSelf(self, *args)
+ if _newclass:
+ hangup_func_arg = _swig_property(_freeswitch.Session_hangup_func_arg_get, _freeswitch.Session_hangup_func_arg_set)
+
+ def setPython(self, state):
+ return _freeswitch.Session_setPython(self, state)
+
+ def setSelf(self, state):
+ return _freeswitch.Session_setSelf(self, state)
Session_swigregister = _freeswitch.Session_swigregister
Session_swigregister(Session)
diff --git a/src/mod/languages/mod_python/mod_python_wrap.cpp b/src/mod/languages/mod_python/mod_python_wrap.cpp
index b4880a1ef2..80b95e8710 100644
--- a/src/mod/languages/mod_python/mod_python_wrap.cpp
+++ b/src/mod/languages/mod_python/mod_python_wrap.cpp
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.2
+ * Version 3.0.10
*
* This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
@@ -8,7 +8,11 @@
* interface file instead.
* ----------------------------------------------------------------------------- */
+
+#ifndef SWIGPYTHON
#define SWIGPYTHON
+#endif
+
#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
@@ -102,9 +106,11 @@ template T SwigValueInit() {
#endif
/* exporting methods */
-#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-# ifndef GCC_HASCLASSVISIBILITY
-# define GCC_HASCLASSVISIBILITY
+#if defined(__GNUC__)
+# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# ifndef GCC_HASCLASSVISIBILITY
+# define GCC_HASCLASSVISIBILITY
+# endif
# endif
#endif
@@ -143,6 +149,19 @@ template T SwigValueInit() {
# define _SCL_SECURE_NO_DEPRECATE
#endif
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used. So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
@@ -651,16 +670,16 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
char d = *(c++);
unsigned char uu;
if ((d >= '0') && (d <= '9'))
- uu = ((d - '0') << 4);
+ uu = (unsigned char)((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
- uu = ((d - ('a'-10)) << 4);
+ uu = (unsigned char)((d - ('a'-10)) << 4);
else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
- uu |= (d - '0');
+ uu |= (unsigned char)(d - '0');
else if ((d >= 'a') && (d <= 'f'))
- uu |= (d - ('a'-10));
+ uu |= (unsigned char)(d - ('a'-10));
else
return (char *) 0;
*u = uu;
@@ -843,10 +862,6 @@ PyString_FromFormat(const char *fmt, ...) {
}
#endif
-/* Add PyObject_Del for old Pythons */
-#if PY_VERSION_HEX < 0x01060000
-# define PyObject_Del(op) PyMem_DEL((op))
-#endif
#ifndef PyObject_DEL
# define PyObject_DEL PyObject_Del
#endif
@@ -1312,7 +1327,7 @@ SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
/* Unpack the argument tuple */
-SWIGINTERN int
+SWIGINTERN Py_ssize_t
SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
{
if (!args) {
@@ -1326,7 +1341,7 @@ SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssi
}
if (!PyTuple_Check(args)) {
if (min <= 1 && max >= 1) {
- int i;
+ Py_ssize_t i;
objs[0] = args;
for (i = 1; i < max; ++i) {
objs[i] = 0;
@@ -1346,7 +1361,7 @@ SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssi
name, (min == max ? "" : "at most "), (int)max, (int)l);
return 0;
} else {
- int i;
+ Py_ssize_t i;
for (i = 0; i < l; ++i) {
objs[i] = PyTuple_GET_ITEM(args, i);
}
@@ -1532,6 +1547,23 @@ typedef struct {
#endif
} SwigPyObject;
+
+#ifdef SWIGPYTHON_BUILTIN
+
+SWIGRUNTIME PyObject *
+SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+ SwigPyObject *sobj = (SwigPyObject *)v;
+
+ if (!sobj->dict)
+ sobj->dict = PyDict_New();
+
+ Py_INCREF(sobj->dict);
+ return sobj->dict;
+}
+
+#endif
+
SWIGRUNTIME PyObject *
SwigPyObject_long(SwigPyObject *v)
{
@@ -1670,16 +1702,32 @@ SwigPyObject_dealloc(PyObject *v)
if (destroy) {
/* destroy is always a VARARGS method */
PyObject *res;
+
+ /* PyObject_CallFunction() has the potential to silently drop
+ the active active exception. In cases of unnamed temporary
+ variable or where we just finished iterating over a generator
+ StopIteration will be active right now, and this needs to
+ remain true upon return from SwigPyObject_dealloc. So save
+ and restore. */
+
+ PyObject *val = NULL, *type = NULL, *tb = NULL;
+ PyErr_Fetch(&val, &type, &tb);
+
if (data->delargs) {
- /* we need to create a temporary object to carry the destroy operation */
- PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
- res = SWIG_Python_CallFunctor(destroy, tmp);
- Py_DECREF(tmp);
+ /* we need to create a temporary object to carry the destroy operation */
+ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+ res = SWIG_Python_CallFunctor(destroy, tmp);
+ Py_DECREF(tmp);
} else {
- PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
- PyObject *mself = PyCFunction_GET_SELF(destroy);
- res = ((*meth)(mself, v));
+ PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+ PyObject *mself = PyCFunction_GET_SELF(destroy);
+ res = ((*meth)(mself, v));
}
+ if (!res)
+ PyErr_WriteUnraisable(destroy);
+
+ PyErr_Restore(val, type, tb);
+
Py_XDECREF(res);
}
#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
@@ -1703,6 +1751,7 @@ SwigPyObject_append(PyObject* v, PyObject* next)
next = tmp;
#endif
if (!SwigPyObject_Check(next)) {
+ PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject");
return NULL;
}
sobj->next = next;
@@ -1802,7 +1851,7 @@ swigobject_methods[] = {
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"},
@@ -1858,7 +1907,9 @@ SwigPyObject_TypeOnce(void) {
(unaryfunc)SwigPyObject_oct, /*nb_oct*/
(unaryfunc)SwigPyObject_hex, /*nb_hex*/
#endif
-#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */
+#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
@@ -1938,10 +1989,19 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_del */
#endif
#if PY_VERSION_HEX >= 0x02060000
- 0, /* tp_version */
+ 0, /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+ 0, /* tp_finalize */
#endif
#ifdef COUNT_ALLOCS
- 0,0,0,0 /* tp_alloc -> tp_next */
+ 0, /* tp_allocs */
+ 0, /* tp_frees */
+ 0, /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+ 0, /* tp_prev */
+#endif
+ 0 /* tp_next */
#endif
};
swigpyobject_type = tmp;
@@ -2117,10 +2177,19 @@ SwigPyPacked_TypeOnce(void) {
0, /* tp_del */
#endif
#if PY_VERSION_HEX >= 0x02060000
- 0, /* tp_version */
+ 0, /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+ 0, /* tp_finalize */
#endif
#ifdef COUNT_ALLOCS
- 0,0,0,0 /* tp_alloc -> tp_next */
+ 0, /* tp_allocs */
+ 0, /* tp_frees */
+ 0, /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+ 0, /* tp_prev */
+#endif
+ 0 /* tp_next */
#endif
};
swigpypacked_type = tmp;
@@ -2571,18 +2640,21 @@ SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int f
newobj = (SwigPyObject *) newobj->next;
newobj->next = next_self;
newobj = (SwigPyObject *)next_self;
+#ifdef SWIGPYTHON_BUILTIN
+ newobj->dict = 0;
+#endif
}
} else {
newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+#ifdef SWIGPYTHON_BUILTIN
+ newobj->dict = 0;
+#endif
}
if (newobj) {
newobj->ptr = ptr;
newobj->ty = type;
newobj->own = own;
newobj->next = 0;
-#ifdef SWIGPYTHON_BUILTIN
- newobj->dict = 0;
-#endif
return (PyObject*) newobj;
}
return SWIG_Py_Void();
@@ -2645,13 +2717,11 @@ PyModule_AddObject(PyObject *m, char *name, PyObject *o)
{
PyObject *dict;
if (!PyModule_Check(m)) {
- PyErr_SetString(PyExc_TypeError,
- "PyModule_AddObject() needs module as first arg");
+ PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg");
return SWIG_ERROR;
}
if (!o) {
- PyErr_SetString(PyExc_TypeError,
- "PyModule_AddObject() needs non-NULL value");
+ PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value");
return SWIG_ERROR;
}
@@ -2987,7 +3057,7 @@ static swig_module_info swig_module = {swig_types, 28, 0, 0, 0, 0};
#endif
#define SWIG_name "_freeswitch"
-#define SWIGVERSION 0x030002
+#define SWIGVERSION 0x030010
#define SWIG_VERSION SWIGVERSION
@@ -3010,27 +3080,35 @@ namespace swig {
SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
{
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
Py_XINCREF(_obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
}
SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
{
if (initial_ref) {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
Py_XINCREF(_obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
}
}
SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item)
{
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
Py_XINCREF(item._obj);
Py_XDECREF(_obj);
_obj = item._obj;
+ SWIG_PYTHON_THREAD_END_BLOCK;
return *this;
}
~SwigPtr_PyObject()
{
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
Py_XDECREF(_obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
}
operator PyObject *() const
@@ -3081,13 +3159,18 @@ SWIGINTERN int
SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
{
#if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+ if (PyBytes_Check(obj))
+#else
if (PyUnicode_Check(obj))
+#endif
#else
if (PyString_Check(obj))
#endif
{
char *cstr; Py_ssize_t len;
#if PY_VERSION_HEX>=0x03000000
+#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
if (!alloc && cptr) {
/* We can't allow converting without allocation, since the internal
representation of string in Python 3 is UCS-2/UCS-4 but we require
@@ -3096,8 +3179,9 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
return SWIG_RuntimeError;
}
obj = PyUnicode_AsUTF8String(obj);
- PyBytes_AsStringAndSize(obj, &cstr, &len);
if(alloc) *alloc = SWIG_NEWOBJ;
+#endif
+ PyBytes_AsStringAndSize(obj, &cstr, &len);
#else
PyString_AsStringAndSize(obj, &cstr, &len);
#endif
@@ -3117,27 +3201,58 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
#else
if (*alloc == SWIG_NEWOBJ)
#endif
- {
- *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
- *alloc = SWIG_NEWOBJ;
- }
- else {
+ {
+ *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+ *alloc = SWIG_NEWOBJ;
+ } else {
*cptr = cstr;
*alloc = SWIG_OLDOBJ;
}
} else {
- #if PY_VERSION_HEX>=0x03000000
- assert(0); /* Should never reach here in Python 3 */
- #endif
+#if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+ *cptr = PyBytes_AsString(obj);
+#else
+ assert(0); /* Should never reach here with Unicode strings in Python 3 */
+#endif
+#else
*cptr = SWIG_Python_str_AsChar(obj);
+#endif
}
}
if (psize) *psize = len + 1;
-#if PY_VERSION_HEX>=0x03000000
+#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
Py_XDECREF(obj);
#endif
return SWIG_OK;
} else {
+#if defined(SWIG_PYTHON_2_UNICODE)
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once"
+#endif
+#if PY_VERSION_HEX<0x03000000
+ if (PyUnicode_Check(obj)) {
+ char *cstr; Py_ssize_t len;
+ if (!alloc && cptr) {
+ return SWIG_RuntimeError;
+ }
+ obj = PyUnicode_AsUTF8String(obj);
+ if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
+ if (cptr) {
+ if (alloc) *alloc = SWIG_NEWOBJ;
+ *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+ }
+ if (psize) *psize = len + 1;
+
+ Py_XDECREF(obj);
+ return SWIG_OK;
+ } else {
+ Py_XDECREF(obj);
+ }
+ }
+#endif
+#endif
+
swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
if (pchar_descriptor) {
void* vptr = 0;
@@ -3166,13 +3281,17 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
} else {
#if PY_VERSION_HEX >= 0x03000000
-#if PY_VERSION_HEX >= 0x03010000
- return PyUnicode_DecodeUTF8(carray, static_cast< int >(size), "surrogateescape");
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+ return PyBytes_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
#else
- return PyUnicode_FromStringAndSize(carray, static_cast< int >(size));
+#if PY_VERSION_HEX >= 0x03010000
+ return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape");
+#else
+ return PyUnicode_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#endif
#endif
#else
- return PyString_FromStringAndSize(carray, static_cast< int >(size));
+ return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
#endif
}
} else {
@@ -3205,9 +3324,11 @@ SWIG_AsVal_double (PyObject *obj, double *val)
if (PyFloat_Check(obj)) {
if (val) *val = PyFloat_AsDouble(obj);
return SWIG_OK;
+#if PY_VERSION_HEX < 0x03000000
} else if (PyInt_Check(obj)) {
if (val) *val = PyInt_AsLong(obj);
return SWIG_OK;
+#endif
} else if (PyLong_Check(obj)) {
double v = PyLong_AsDouble(obj);
if (!PyErr_Occurred()) {
@@ -3281,16 +3402,20 @@ SWIG_CanCastAsInteger(double *d, double min, double max) {
SWIGINTERN int
SWIG_AsVal_long (PyObject *obj, long* val)
{
+#if PY_VERSION_HEX < 0x03000000
if (PyInt_Check(obj)) {
if (val) *val = PyInt_AsLong(obj);
return SWIG_OK;
- } else if (PyLong_Check(obj)) {
+ } else
+#endif
+ if (PyLong_Check(obj)) {
long v = PyLong_AsLong(obj);
if (!PyErr_Occurred()) {
if (val) *val = v;
return SWIG_OK;
} else {
PyErr_Clear();
+ return SWIG_OverflowError;
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3419,18 +3544,7 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
-#if PY_VERSION_HEX >= 0x03000000
- {
- long v = PyLong_AsLong(obj);
- if (!PyErr_Occurred()) {
- if (v < 0) {
- return SWIG_OverflowError;
- }
- } else {
- PyErr_Clear();
- }
- }
-#endif
+ return SWIG_OverflowError;
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -4755,12 +4869,14 @@ fail:
SWIGINTERN PyObject *_wrap_new_Stream(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[2];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[2] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 1) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -5180,12 +5296,14 @@ fail:
SWIGINTERN PyObject *_wrap_new_Event(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[3];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[3] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 2) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -7781,12 +7899,14 @@ fail:
SWIGINTERN PyObject *_wrap_CoreSession_collectDigits(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[4];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[4] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 3) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -8020,12 +8140,14 @@ fail:
SWIGINTERN PyObject *_wrap_CoreSession_getDigits(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[7];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[7] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 6) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -9511,12 +9633,14 @@ fail:
SWIGINTERN PyObject *_wrap_new_Session(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[3];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[3] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 2) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -9770,12 +9894,14 @@ fail:
SWIGINTERN PyObject *_wrap_Session_setInputCallback(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[4];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[4] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 3) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -9889,12 +10015,14 @@ fail:
SWIGINTERN PyObject *_wrap_Session_setHangupHook(PyObject *self, PyObject *args) {
- int argc;
- PyObject *argv[4];
- int ii;
+ Py_ssize_t argc;
+ PyObject *argv[4] = {
+ 0
+ };
+ Py_ssize_t ii;
if (!PyTuple_Check(args)) SWIG_fail;
- argc = args ? (int)PyObject_Length(args) : 0;
+ argc = args ? PyObject_Length(args) : 0;
for (ii = 0; (ii < 3) && (ii < argc); ii++) {
argv[ii] = PyTuple_GET_ITEM(args,ii);
}
@@ -10577,7 +10705,7 @@ SWIGRUNTIME void
SWIG_InitializeModule(void *clientdata) {
size_t i;
swig_module_info *module_head, *iter;
- int found, init;
+ int init;
/* check to see if the circular list has been setup, if not, set it up */
if (swig_module.next==0) {
@@ -10596,22 +10724,18 @@ SWIG_InitializeModule(void *clientdata) {
/* This is the first module loaded for this interpreter */
/* so set the swig module into the interpreter */
SWIG_SetModule(clientdata, &swig_module);
- module_head = &swig_module;
} else {
/* the interpreter has loaded a SWIG module, but has it loaded this one? */
- found=0;
iter=module_head;
do {
if (iter==&swig_module) {
- found=1;
- break;
+ /* Our module is already in the list, so there's nothing more to do. */
+ return;
}
iter=iter->next;
} while (iter!= module_head);
- /* if the is found in the list, then all is done and we may leave */
- if (found) return;
- /* otherwise we must add out module into the list */
+ /* otherwise we must add our module into the list */
swig_module.next = module_head->next;
module_head->next = &swig_module;
}
@@ -10930,10 +11054,19 @@ extern "C" {
0, /* tp_del */
#endif
#if PY_VERSION_HEX >= 0x02060000
- 0, /* tp_version */
+ 0, /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+ 0, /* tp_finalize */
#endif
#ifdef COUNT_ALLOCS
- 0,0,0,0 /* tp_alloc -> tp_next */
+ 0, /* tp_allocs */
+ 0, /* tp_frees */
+ 0, /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+ 0, /* tp_prev */
+#endif
+ 0 /* tp_next */
#endif
};
varlink_type = tmp;
@@ -11022,7 +11155,9 @@ extern "C" {
size_t i;
for (i = 0; methods[i].ml_name; ++i) {
const char *c = methods[i].ml_doc;
- if (c && (c = strstr(c, "swig_ptr: "))) {
+ if (!c) continue;
+ c = strstr(c, "swig_ptr: ");
+ if (c) {
int j;
swig_const_info *ci = 0;
const char *name = c + 10;
@@ -11124,6 +11259,7 @@ SWIG_init(void) {
PyObject *public_interface, *public_symbol;
PyObject *this_descr;
PyObject *thisown_descr;
+ PyObject *self = 0;
int i;
(void)builtin_pytype;
@@ -11131,6 +11267,7 @@ SWIG_init(void) {
(void)builtin_basetype;
(void)tuple;
(void)static_getset;
+ (void)self;
/* metatype is used to implement static member variables. */
metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
@@ -11150,6 +11287,7 @@ SWIG_init(void) {
#else
m = Py_InitModule((char *) SWIG_name, SwigMethods);
#endif
+
md = d = PyModule_GetDict(m);
(void)md;
diff --git a/src/mod/languages/mod_v8/gyp b/src/mod/languages/mod_v8/gyp
deleted file mode 100755
index 3d82e147f8..0000000000
--- a/src/mod/languages/mod_v8/gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python2
-
-# Copyright (c) 2009 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-
-# TODO(mark): sys.path manipulation is some temporary testing stuff.
-try:
- import gyp
-except ImportError, e:
- import os.path
- sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'pylib'))
- import gyp
-
-if __name__ == '__main__':
- sys.exit(gyp.main(sys.argv[1:]))
diff --git a/src/mod/languages/mod_v8/mod_v8.2010.vcxproj.filters b/src/mod/languages/mod_v8/mod_v8.2010.vcxproj.filters
deleted file mode 100644
index 42de878a39..0000000000
--- a/src/mod/languages/mod_v8/mod_v8.2010.vcxproj.filters
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
- BaseClasses
-
-
- BaseClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
- FSClasses
-
-
-
-
-
- BaseClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
- FSClasses\include
-
-
-
-
- {57f55a0b-1790-4632-95e6-19acbe9015d3}
-
-
- {dcda9b2f-890a-4820-84e3-4bbcf8f0b62c}
-
-
- {ed9652cf-79bd-4567-9a98-1ed5077d5805}
-
-
- {3efc073f-f052-4e3d-921c-8d6b6a5a7215}
-
-
-
\ No newline at end of file
diff --git a/src/mod/languages/mod_v8/scripts/build-v8-tarballs.sh b/src/mod/languages/mod_v8/scripts/build-v8-tarballs.sh
deleted file mode 100755
index d0ff656dbe..0000000000
--- a/src/mod/languages/mod_v8/scripts/build-v8-tarballs.sh
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-
-MY_CWD=$(pwd)
-
-report_error()
-{
- echo "$1"
-
- # Go back to the start directory and cleanup before we exit
- cd "$MY_CWD"
- rm -rf v8-$VERSION*
-
- exit 1
-}
-
-VERSION=$1
-
-if [ "$VERSION" = "" ]; then
- report_error "You must provide the version to build!"
-fi
-
-echo "Will build tarballs for V8 version $VERSION"
-
-echo "Cleaning up earlier builds..."
-rm -rf v8-$VERSION* || report_error "Failed to cleanup, missing rights?"
-
-# Get current trunk version (which is the latest stable release)
-echo "Cloning V8 git repo..."
-git clone git://github.com/v8/v8.git v8-$VERSION > /dev/null || report_error "Failed to git clone Google V8"
-cd v8-$VERSION > /dev/null || report_error "Failed to enter the cloned directory"
-echo "Checking out version $VERSION from local V8 repo"
-git checkout tags/$VERSION > /dev/null || report_error "Failed to get version $VERSION"
-
-# Download dependencies releated to this version
-echo "Downloading V8 dependencies"
-make dependencies > /dev/null || report_error "Failed to get V8 dependencies"
-
-# Cleanup files we don't need
-echo "Cleaning up .git and .svn directories"
-for f in $(find | grep "\.git$")
-do
- rm -rf "$f"
-done
-
-for f in $(find | grep "\.gitignore$")
-do
- rm -rf "$f"
-done
-
-for f in $(find | grep "\.svn$")
-do
- rm -rf "$f"
-done
-
-echo "Removing tests from build and packaging"
-rm -rf test
-rm -rf third_party/icu/source/test
-patch -p1 < ../remove-v8-tests.patch || report_error "Failed to apply build patch!"
-
-cd .. || report_error "Failed to change dir"
-
-echo "Creating new tarball..."
-tar cjpf v8-$VERSION.tar.bz2 v8-$VERSION || report_error "Failed to create tarball!"
-
-echo "cleaning up temporary data.."
-rm -rf v8-$VERSION || report_error "Failed to cleanup"
-
-echo "Finished building v8-$VERSION.tar.bz2"
-
-echo "Start building v8-$VERSION-win.tar.bz2"
-
-mkdir v8-$VERSION || report_error "Failed to create directory"
-cd v8-$VERSION || report_error "Failed to change dir"
-mkdir third_party || report_error "Failed to create directory"
-cd third_party || report_error "Failed to change dir"
-
-echo "Checking out files for Windows build..."
-svn co http://src.chromium.org/svn/trunk/tools/third_party/python_26 python_26 --revision 89111 > /dev/null || report_error "Failed to checkout python files"
-svn co http://src.chromium.org/svn/trunk/deps/third_party/cygwin cygwin --revision 231940 > /dev/null || report_error "Failed to checkout cygwin files"
-
-echo "Cleaning up .svn directories..."
-for f in $(find | grep "\.svn$")
-do
- rm -rf "$f"
-done
-
-cd ../.. || report_error "Failed to change dir"
-
-echo "Creating new tarball..."
-tar cjpf v8-$VERSION-win.tar.bz2 v8-$VERSION || report_error "Failed to create tarball"
-
-echo "Cleaning up..."
-rm -rf v8-$VERSION
diff --git a/src/mod/languages/mod_v8/scripts/remove-v8-tests.patch b/src/mod/languages/mod_v8/scripts/remove-v8-tests.patch
deleted file mode 100644
index 4cbf996c68..0000000000
--- a/src/mod/languages/mod_v8/scripts/remove-v8-tests.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 8f21f7c..79e7a07 100644
---- a/Makefile
-+++ b/Makefile
-@@ -233,7 +233,7 @@ NACL_ARCHES = nacl_ia32 nacl_x64
- # List of files that trigger Makefile regeneration:
- GYPFILES = build/all.gyp build/features.gypi build/standalone.gypi \
- build/toolchain.gypi samples/samples.gyp src/d8.gyp \
-- test/cctest/cctest.gyp tools/gyp/v8.gyp
-+ tools/gyp/v8.gyp
-
- # If vtunejit=on, the v8vtune.gyp will be appended.
- ifeq ($(vtunejit), on)
-diff --git a/build/all.gyp b/build/all.gyp
-index 5fbd8c2..9c2a4db 100644
---- a/build/all.gyp
-+++ b/build/all.gyp
-@@ -10,7 +10,6 @@
- 'dependencies': [
- '../samples/samples.gyp:*',
- '../src/d8.gyp:d8',
-- '../test/cctest/cctest.gyp:*',
- ],
- 'conditions': [
- ['component!="shared_library"', {
diff --git a/src/mod/languages/mod_v8/v8-build.patch b/src/mod/languages/mod_v8/v8-build.patch
deleted file mode 100644
index 61b8ecdade..0000000000
--- a/src/mod/languages/mod_v8/v8-build.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Makefile~ 2014-01-11 14:45:55.000000000 +0100
-+++ Makefile 2014-03-19 09:25:47.700136526 +0100
-@@ -292,7 +292,7 @@
- native: $(OUTDIR)/Makefile.native
- @$(MAKE) -C "$(OUTDIR)" -f Makefile.native \
- CXX="$(CXX)" LINK="$(LINK)" BUILDTYPE=Release \
-- builddir="$(shell pwd)/$(OUTDIR)/$@"
-+ builddir="$(OUTDIR)/$@"
-
- $(ANDROID_ARCHES): $(addprefix $$@.,$(MODES))
-
diff --git a/src/switch_core_io.c b/src/switch_core_io.c
index 0ccb215f26..7560465187 100644
--- a/src/switch_core_io.c
+++ b/src/switch_core_io.c
@@ -417,7 +417,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_set_flag(session, SSF_WARN_TRANSCODE);
}
- if (read_frame->codec || is_cng) {
+ if (read_frame->codec || (is_cng && session->plc)) {
session->raw_read_frame.datalen = session->raw_read_frame.buflen;
if (is_cng) {
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index 4591bfc2f5..5ec1909be9 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -4054,7 +4054,7 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t
sdp_attribute_t *attr = NULL, *attrs[2] = { 0 };
int i = 0, got_rtcp_mux = 0;
const char *val;
- int ice_seen = 0, cid = 0, ai = 0, attr_idx = 0, cand_seen = 0;
+ int ice_seen = 0, cid = 0, ai = 0, attr_idx = 0, cand_seen = 0, relay_ok = 0;
if (switch_true(switch_channel_get_variable_dup(smh->session->channel, "ignore_sdp_ice", SWITCH_FALSE, -1))) {
return SWITCH_STATUS_BREAK;
@@ -4240,12 +4240,19 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t
return SWITCH_STATUS_SUCCESS;
}
-
+ relay_ok = 0;
+
+ relay:
+
for (cid = 0; cid < 2; cid++) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG, "Searching for %s candidate.\n", cid ? "rtcp" : "rtp");
for (ai = 0; ai < engine->cand_acl_count; ai++) {
for (i = 0; i < engine->ice_in.cand_idx[cid]; i++) {
+ int is_relay = !strcmp(engine->ice_in.cands[i][cid].cand_type, "relay");
+
+ if (relay_ok != is_relay) continue;
+
if (switch_check_network_list_ip(engine->ice_in.cands[i][cid].con_addr, engine->cand_acl[ai])) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG,
"Choose %s candidate, index %d, %s:%d\n", cid ? "rtcp" : "rtp", i,
@@ -4283,8 +4290,13 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t
done_choosing:
-
if (!engine->ice_in.is_chosen[0]) {
+ if (!relay_ok) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG, "Look for Relay Candidates as last resort\n");
+ relay_ok = 1;
+ goto relay;
+ }
+
/* PUNT */
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG, "%s no suitable candidates found.\n",
switch_channel_get_name(smh->session->channel));
@@ -9078,7 +9090,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
}
- if (t_engine->ice_in.cands[t_engine->ice_in.chosen[1]][1].ready) {
+ if (t_engine->ice_in.cands[t_engine->ice_in.chosen[1]][1].ready && t_engine->ice_in.cands[t_engine->ice_in.chosen[0]][0].ready &&
+ !zstr(t_engine->ice_in.cands[t_engine->ice_in.chosen[1]][1].con_addr) &&
+ !zstr(t_engine->ice_in.cands[t_engine->ice_in.chosen[0]][0].con_addr)) {
if (t_engine->rtcp_mux > 0 && !strcmp(t_engine->ice_in.cands[t_engine->ice_in.chosen[1]][1].con_addr,
t_engine->ice_in.cands[t_engine->ice_in.chosen[0]][0].con_addr) &&
t_engine->ice_in.cands[t_engine->ice_in.chosen[1]][1].con_port == t_engine->ice_in.cands[t_engine->ice_in.chosen[0]][0].con_port) {
@@ -9404,7 +9418,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
}
- if (v_engine->ice_in.cands[v_engine->ice_in.chosen[1]][1].ready) {
+ if (v_engine->ice_in.cands[v_engine->ice_in.chosen[1]][1].ready && v_engine->ice_in.cands[v_engine->ice_in.chosen[0]][0].ready &&
+ !zstr(v_engine->ice_in.cands[v_engine->ice_in.chosen[1]][1].con_addr) &&
+ !zstr(v_engine->ice_in.cands[v_engine->ice_in.chosen[0]][0].con_addr)) {
if (v_engine->rtcp_mux > 0 && !strcmp(v_engine->ice_in.cands[v_engine->ice_in.chosen[1]][1].con_addr, v_engine->ice_in.cands[v_engine->ice_in.chosen[0]][0].con_addr)
&& v_engine->ice_in.cands[v_engine->ice_in.chosen[1]][1].con_port == v_engine->ice_in.cands[v_engine->ice_in.chosen[0]][0].con_port) {
diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c
index e5c493e803..49a10e06c3 100644
--- a/src/switch_core_sqldb.c
+++ b/src/switch_core_sqldb.c
@@ -2054,7 +2054,7 @@ static void *SWITCH_THREAD_FUNC switch_user_sql_thread(switch_thread_t *thread,
switch_sql_queue_manager_t *qm = (switch_sql_queue_manager_t *) obj;
uint32_t i;
- while (!qm->event_db) {
+ while (sanity && !qm->event_db) {
if (switch_cache_db_get_db_handle_dsn(&qm->event_db, qm->dsn) == SWITCH_STATUS_SUCCESS && qm->event_db)
break;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s Error getting db handle, Retrying\n", qm->name);
diff --git a/src/switch_core_video.c b/src/switch_core_video.c
index 4fbfbf3343..96a39a107f 100644
--- a/src/switch_core_video.c
+++ b/src/switch_core_video.c
@@ -218,7 +218,7 @@ SWITCH_DECLARE(switch_image_t *)switch_img_alloc(switch_image_t *img,
r = (switch_image_t *)vpx_img_alloc((vpx_image_t *)img, (vpx_img_fmt_t)fmt, d_w, d_h, align);
switch_assert(r);
switch_assert(r->d_w == d_w);
- switch_assert(r->d_h = d_h);
+ switch_assert(r->d_h == d_h);
return r;
#else
@@ -2196,6 +2196,11 @@ SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, switch_
} else {
width = pre_width;
}
+
+ if (width == 0 || height == 0) {
+ txtimg = NULL;
+ goto done;
+ }
//if (bg) {
// txtimg = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, width, height, 1);
@@ -2224,6 +2229,9 @@ SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, switch_
txtimg,
x, y,
txt, NULL, fg, bg, 0, 0);
+
+ done:
+
switch_img_txt_handle_destroy(&txthandle);
switch_safe_free(duptxt);
diff --git a/src/switch_cpp.cpp b/src/switch_cpp.cpp
index bec23291fb..3741ba2ffd 100644
--- a/src/switch_cpp.cpp
+++ b/src/switch_cpp.cpp
@@ -855,8 +855,8 @@ SWITCH_DECLARE(void) CoreSession::set_tts_params(char *tts_name_p, char *voice_n
sanity_check_noreturn;
switch_safe_free(tts_name);
switch_safe_free(voice_name);
- tts_name = strdup(tts_name_p);
- voice_name = strdup(voice_name_p);
+ tts_name = strdup(switch_str_nil(tts_name_p));
+ voice_name = strdup(switch_str_nil(voice_name_p));
}
SWITCH_DECLARE(int) CoreSession::collectDigits(int abs_timeout) {
diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c
index bb574ee828..2e9cd6e29a 100644
--- a/src/switch_ivr_async.c
+++ b/src/switch_ivr_async.c
@@ -40,6 +40,9 @@
struct switch_ivr_dmachine_binding {
char *digits;
+ char *repl;
+ int first_match;
+ char *substituted;
int32_t key;
uint8_t rmatch;
switch_ivr_dmachine_callback_t callback;
@@ -83,6 +86,7 @@ struct switch_ivr_dmachine {
uint8_t pinging;
};
+static switch_status_t speech_on_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf, switch_dtmf_direction_t direction);
SWITCH_DECLARE(switch_status_t) switch_ivr_dmachine_last_ping(switch_ivr_dmachine_t *dmachine)
{
@@ -258,6 +262,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_dmachine_bind(switch_ivr_dmachine_t *
switch_size_t len;
dm_binding_head_t *headp;
const char *msg = "";
+ char *repl = NULL;
+ char *digits_;
if (strlen(digits) > DMACHINE_MAX_DIGIT_LEN -1) {
return SWITCH_STATUS_FALSE;
@@ -286,16 +292,28 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_dmachine_bind(switch_ivr_dmachine_t *
binding = switch_core_alloc(dmachine->pool, sizeof(*binding));
- if (*digits == '~') {
+ digits_ = switch_core_strdup(dmachine->pool, digits);
+
+ if (*digits_ == '=') {
+ binding->first_match = 1;
+ digits_++;
+ }
+
+ if (*digits_ == '~') {
binding->is_regex = 1;
- digits++;
+ digits_++;
+ if ((repl = strchr(digits_, '~')) && *(repl+1) == '~') {
+ *repl++ = '\0';
+ *repl++ = '\0';
+ }
}
binding->key = key;
- binding->digits = switch_core_strdup(dmachine->pool, digits);
+ binding->digits = digits_;
binding->is_priority = is_priority;
binding->callback = callback;
binding->user_data = user_data;
+ binding->repl = repl;
if (headp->tail) {
headp->tail->next = binding;
@@ -349,13 +367,44 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
for(bp = dmachine->realm->binding_list; bp; bp = bp->next) {
if (bp->is_regex) {
- switch_status_t r_status = switch_regex_match(dmachine->digits, bp->digits);
+ if (bp->repl) {
+ int ovector[30] = { 0 };
+ int proceed = 0;
+ switch_regex_t *re = NULL;
- bp->rmatch = r_status == SWITCH_STATUS_SUCCESS;
+
+ proceed = switch_regex_perform(dmachine->digits, bp->digits, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
+
+ if (proceed) {
+ char *substituted = NULL;
+ switch_size_t len;
+
+ len = (strlen(dmachine->digits) + strlen(bp->digits) + 10) * proceed;
+ substituted = malloc(len);
+ switch_assert(substituted);
+ memset(substituted, 0, len);
+ switch_perform_substitution(re, proceed, bp->repl, dmachine->digits, substituted, len, ovector);
+
+ if (!bp->substituted || strcmp(substituted, bp->substituted)) {
+ bp->substituted = switch_core_strdup(dmachine->pool, substituted);
+ }
+ free(substituted);
+ switch_regex_safe_free(re);
+ bp->rmatch = 1;
+ } else {
+ bp->substituted = NULL;
+ bp->rmatch = 0;
+ }
+ } else {
+ switch_status_t r_status = switch_regex_match(dmachine->digits, bp->digits);
+ bp->rmatch = r_status == SWITCH_STATUS_SUCCESS;
+ }
rmatches++;
pmatches++;
+ if (bp->rmatch && bp->first_match) break;
+
} else {
if (!strncmp(dmachine->digits, bp->digits, strlen(dmachine->digits))) {
pmatches++;
@@ -383,7 +432,7 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
for(bp = dmachine->realm->binding_list; bp; bp = bp->next) {
if (bp->is_regex) {
if (bp->rmatch) {
- if ((bp->is_priority && ! ematches) || is_timeout || (bp == dmachine->realm->binding_list && !bp->next)) {
+ if (bp->first_match || (bp->is_priority && ! ematches) || is_timeout || (bp == dmachine->realm->binding_list && !bp->next)) {
best = DM_MATCH_EXACT;
exact_bp = bp;
break;
@@ -393,10 +442,10 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
} else {
int pmatch = !strncmp(dmachine->digits, bp->digits, strlen(dmachine->digits));
- if (!exact_bp && pmatch && (!rmatches || bp->is_priority || is_timeout) && !strcmp(bp->digits, dmachine->digits)) {
+ if (!exact_bp && pmatch && (bp->first_match || !rmatches || bp->is_priority || is_timeout) && !strcmp(bp->digits, dmachine->digits)) {
best = DM_MATCH_EXACT;
exact_bp = bp;
- if (bp->is_priority || dmachine->cur_digit_len == dmachine->max_digit_len) break;
+ if (bp->first_match || bp->is_priority || dmachine->cur_digit_len == dmachine->max_digit_len) break;
}
if (!(both_bp && partial_bp) && strlen(bp->digits) != strlen(dmachine->digits) && pmatch) {
@@ -434,7 +483,12 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
if (r_bp) {
dmachine->last_matching_binding = r_bp;
- switch_set_string(dmachine->last_matching_digits, dmachine->digits);
+
+ if (r_bp->substituted) {
+ switch_set_string(dmachine->last_matching_digits, r_bp->substituted);
+ } else {
+ switch_set_string(dmachine->last_matching_digits, dmachine->digits);
+ }
best = DM_MATCH_EXACT;
}
@@ -4624,7 +4678,12 @@ static switch_bool_t speech_callback(switch_media_bug_t *bug, void *user_data, s
case SWITCH_ABC_TYPE_CLOSE:
{
switch_status_t st;
-
+ switch_core_session_t *session = switch_core_media_bug_get_session(bug);
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+
+ switch_channel_set_private(channel, SWITCH_SPEECH_KEY, NULL);
+ switch_core_event_hook_remove_recv_dtmf(session, speech_on_dtmf);
+
switch_core_asr_close(sth->ah, &flags);
if (sth->mutex && sth->cond && sth->ready) {
if (switch_mutex_trylock(sth->mutex) == SWITCH_STATUS_SUCCESS) {
diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c
index 95ec9a4b2e..82f23cc3d3 100644
--- a/src/switch_ivr_bridge.c
+++ b/src/switch_ivr_bridge.c
@@ -2204,25 +2204,26 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_find_bridged_uuid(const char *uuid, c
}
-SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg)
+SWITCH_DECLARE(switch_status_t) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg)
{
switch_core_session_t *rsession, *bsession = NULL;
switch_channel_t *channel, *rchannel, *bchannel = NULL;
const char *buuid, *var;
char brto[SWITCH_UUID_FORMATTED_LENGTH + 1] = "";
+ switch_status_t status = SWITCH_STATUS_FALSE;
if (bleg) {
if (switch_ivr_find_bridged_uuid(uuid, brto, sizeof(brto)) == SWITCH_STATUS_SUCCESS) {
uuid = switch_core_session_strdup(session, brto);
} else {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "no uuid bridged to %s\n", uuid);
- return;
+ return status;
}
}
if (zstr(uuid) || !(rsession = switch_core_session_locate(uuid))) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "no uuid %s\n", uuid);
- return;
+ return status;
}
channel = switch_core_session_get_channel(session);
@@ -2236,14 +2237,14 @@ SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session
if ((var = switch_channel_get_variable(channel, "intercept_unbridged_only")) && switch_true(var)) {
if ((switch_channel_test_flag(rchannel, CF_BRIDGED))) {
switch_core_session_rwunlock(rsession);
- return;
+ return status;
}
}
if ((var = switch_channel_get_variable(channel, "intercept_unanswered_only")) && switch_true(var)) {
if ((switch_channel_test_flag(rchannel, CF_ANSWERED))) {
switch_core_session_rwunlock(rsession);
- return;
+ return status;
}
}
@@ -2275,7 +2276,7 @@ SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session
}
switch_channel_set_flag(rchannel, CF_INTERCEPTED);
- switch_ivr_uuid_bridge(switch_core_session_get_uuid(session), uuid);
+ status = switch_ivr_uuid_bridge(switch_core_session_get_uuid(session), uuid);
switch_core_session_rwunlock(rsession);
if (bsession) {
@@ -2283,7 +2284,7 @@ SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session
switch_core_session_rwunlock(bsession);
}
-
+ return status;
}
diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c
index b16dbaf388..9ebca40e8d 100644
--- a/src/switch_ivr_play_say.c
+++ b/src/switch_ivr_play_say.c
@@ -1307,38 +1307,22 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
continue;
}
} else if (!strncasecmp(file, "say:", 4)) {
- char *engine = NULL, *voice = NULL, *text = NULL;
+ const char *engine = NULL, *voice = NULL, *text = NULL;
+
alt = file + 4;
- dup = switch_core_session_strdup(session, alt);
- engine = dup;
+ text = alt;
+ engine = switch_channel_get_variable(channel, "tts_engine");
+ voice = switch_channel_get_variable(channel, "tts_voice");
- if (!zstr(engine)) {
- if ((voice = strchr(engine, ':'))) {
- *voice++ = '\0';
- if (!zstr(voice) && (text = strchr(voice, ':'))) {
- *text++ = '\0';
- }
- }
- }
-
- if (!zstr(engine) && !zstr(voice) && !zstr(text)) {
- if ((status = switch_ivr_speak_text(session, engine, voice, text, args)) != SWITCH_STATUS_SUCCESS) {
+ if (engine && text) {
+ if ((status = switch_ivr_speak_text(session, engine, voice, (char *)text, args)) != SWITCH_STATUS_SUCCESS) {
arg_recursion_check_stop(args);
return status;
}
} else {
- text = engine;
- engine = (char *) switch_channel_get_variable(channel, "tts_engine");
- voice = (char *) switch_channel_get_variable(channel, "tts_voice");
- if (engine && text) {
- if ((status = switch_ivr_speak_text(session, engine, voice, text, args)) != SWITCH_STATUS_SUCCESS) {
- arg_recursion_check_stop(args);
- return status;
- }
- } else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Args\n");
- }
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Args\n");
}
+
continue;
}
diff --git a/src/switch_jitterbuffer.c b/src/switch_jitterbuffer.c
index 7f5d444f42..7965413059 100644
--- a/src/switch_jitterbuffer.c
+++ b/src/switch_jitterbuffer.c
@@ -200,6 +200,8 @@ switch_jb_node_t *sort_nodes(switch_jb_node_t *list, int (*cmp)(const void *, co
}
}
+static inline void thin_frames(switch_jb_t *jb, int freq, int max);
+
static inline switch_jb_node_t *new_node(switch_jb_t *jb)
{
@@ -214,7 +216,7 @@ static inline switch_jb_node_t *new_node(switch_jb_t *jb)
}
if (!np) {
- int mult = 25;
+ int mult = 2;
if (jb->type != SJB_VIDEO) {
mult = 2;
@@ -223,14 +225,14 @@ static inline switch_jb_node_t *new_node(switch_jb_t *jb)
mult = jb->max_packet_len;
}
}
-
+
if (jb->allocated_nodes > jb->max_frame_len * mult) {
jb_debug(jb, 2, "ALLOCATED FRAMES TOO HIGH! %d\n", jb->allocated_nodes);
switch_jb_reset(jb);
switch_mutex_unlock(jb->list_mutex);
return NULL;
}
-
+
np = switch_core_alloc(jb->pool, sizeof(*np));
jb->allocated_nodes++;
np->next = jb->node_list;
@@ -391,24 +393,25 @@ static inline uint32_t jb_find_lowest_ts(switch_jb_t *jb)
static inline void thin_frames(switch_jb_t *jb, int freq, int max)
{
- switch_jb_node_t *node;
+ switch_jb_node_t *node, *this_node;
int i = -1;
int dropped = 0;
switch_mutex_lock(jb->list_mutex);
node = jb->node_list;
- for (node = jb->node_list; node && jb->complete_frames > jb->max_frame_len && dropped < max; node = node->next) {
-
- if (node->visible) {
+ while (node && dropped <= max) {
+ this_node = node;
+ node = node->next;
+
+ if (this_node->visible) {
i++;
} else {
continue;
}
if ((i % freq) == 0) {
- drop_ts(jb, node->packet.header.ts);
- node = jb->node_list;
+ drop_ts(jb, this_node->packet.header.ts);
dropped++;
}
}
@@ -418,7 +421,6 @@ static inline void thin_frames(switch_jb_t *jb, int freq, int max)
}
-
#if 0
static inline switch_jb_node_t *jb_find_highest_node(switch_jb_t *jb)
{
@@ -437,6 +439,7 @@ static inline switch_jb_node_t *jb_find_highest_node(switch_jb_t *jb)
return highest ? highest : NULL;
}
+
static inline uint32_t jb_find_highest_ts(switch_jb_t *jb)
{
switch_jb_node_t *highest = jb_find_highest_node(jb);
@@ -444,6 +447,17 @@ static inline uint32_t jb_find_highest_ts(switch_jb_t *jb)
return highest ? highest->packet.header.ts : 0;
}
+static inline void drop_newest_frame(switch_jb_t *jb)
+{
+ uint32_t ts = jb_find_highest_ts(jb);
+
+ drop_ts(jb, ts);
+ jb_debug(jb, 1, "Dropping highest frame ts:%u\n", ntohl(ts));
+}
+
+
+
+
static inline switch_jb_node_t *jb_find_penultimate_node(switch_jb_t *jb)
{
switch_jb_node_t *np, *highest = NULL, *second_highest = NULL;
@@ -572,15 +586,9 @@ static inline void drop_oldest_frame(switch_jb_t *jb)
jb_debug(jb, 1, "Dropping oldest frame ts:%u\n", ntohl(ts));
}
+
+
#if 0
-static inline void drop_newest_frame(switch_jb_t *jb)
-{
- uint32_t ts = jb_find_highest_ts(jb);
-
- drop_ts(jb, ts);
- jb_debug(jb, 1, "Dropping highest frame ts:%u\n", ntohl(ts));
-}
-
static inline void drop_second_newest_frame(switch_jb_t *jb)
{
switch_jb_node_t *second_newest = jb_find_penultimate_node(jb);
@@ -1241,6 +1249,7 @@ SWITCH_DECLARE(switch_status_t) switch_jb_put_packet(switch_jb_t *jb, switch_rtp
}
}
+
add_node(jb, packet, len);
if (switch_test_flag(jb, SJB_QUEUE_ONLY) && jb->complete_frames > jb->max_frame_len) {
@@ -1283,7 +1292,7 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
switch_jb_node_t *node = NULL;
switch_status_t status;
int plc = 0;
-
+
switch_mutex_lock(jb->mutex);
if (jb->complete_frames == 0) {
@@ -1350,10 +1359,10 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
jb->period_miss_pct = ((double)jb->period_miss_count / jb->period_count) * 100;
- if (jb->period_miss_pct > 60.0f) {
- jb_debug(jb, 2, "Miss percent %02f too high, resetting buffer.\n", jb->period_miss_pct);
- switch_jb_reset(jb);
- }
+ //if (jb->period_miss_pct > 60.0f) {
+ // jb_debug(jb, 2, "Miss percent %02f too high, resetting buffer.\n", jb->period_miss_pct);
+ // switch_jb_reset(jb);
+ //}
if ((status = jb_next_packet(jb, &node)) == SWITCH_STATUS_SUCCESS) {
jb_debug(jb, 2, "Found next frame cur ts: %u seq: %u\n", htonl(node->packet.header.ts), htons(node->packet.header.seq));
@@ -1397,7 +1406,7 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
case SWITCH_STATUS_NOTFOUND:
default:
if (jb->consec_miss_count > jb->frame_len) {
- switch_jb_reset(jb);
+ //switch_jb_reset(jb);
jb_frame_inc(jb, 1);
jb_debug(jb, 2, "%s", "Too many frames not found, RESIZE\n");
switch_goto_status(SWITCH_STATUS_RESTART, end);
@@ -1444,16 +1453,19 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
}
switch_mutex_unlock(jb->mutex);
-
- if (jb->complete_frames > jb->max_frame_len) {
- thin_frames(jb, 8, 25);
+
+ if (jb->type == SJB_VIDEO) {
+ if (jb->complete_frames > jb->max_frame_len * 2) {
+ jb_debug(jb, 2, "JB TOO BIG (%d), RESET\n", jb->complete_frames);
+ switch_jb_reset(jb);
+ }
+ } else {
+ int too_big = (int)(jb->max_frame_len * 1.5);
+ if (jb->visible_nodes > too_big && status == SWITCH_STATUS_SUCCESS) {
+ status = SWITCH_STATUS_TIMEOUT;
+ }
}
-
- if (jb->complete_frames > jb->max_frame_len * 2) {
- jb_debug(jb, 2, "JB TOO BIG (%d), RESET\n", jb->complete_frames);
- switch_jb_reset(jb);
- }
-
+
return status;
}
diff --git a/src/switch_rtp.c b/src/switch_rtp.c
index 2e3376ef6b..16aba214c5 100644
--- a/src/switch_rtp.c
+++ b/src/switch_rtp.c
@@ -477,6 +477,7 @@ struct switch_rtp {
uint8_t punts;
uint8_t clean;
uint32_t last_max_vb_frames;
+ int skip_timer;
#ifdef ENABLE_ZRTP
zrtp_session_t *zrtp_session;
zrtp_profile_t *zrtp_profile;
@@ -1330,6 +1331,10 @@ static int zrtp_send_rtp_callback(const zrtp_stream_t *stream, char *rtp_packet,
switch_size_t len = rtp_packet_length;
zrtp_status_t status = zrtp_status_ok;
+ if (!rtp_session->sock_output) {
+ return status;
+ }
+
switch_socket_sendto(rtp_session->sock_output, rtp_session->remote_addr, 0, rtp_packet, &len);
return status;
}
@@ -6292,8 +6297,12 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
case SWITCH_STATUS_BREAK:
break;
case SWITCH_STATUS_SUCCESS:
+ case SWITCH_STATUS_TIMEOUT:
default:
{
+ if (status == SWITCH_STATUS_TIMEOUT) {
+ rtp_session->skip_timer = 1;
+ }
rtp_session->stats.inbound.jb_packet_count++;
status = SWITCH_STATUS_SUCCESS;
rtp_session->last_rtp_hdr = rtp_session->recv_msg.header;
@@ -6477,7 +6486,7 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
for (i = 0; i < ntohs(extp->header.length) - 2; i++) {
- handle_nack(rtp_session, *nack);
+ handle_nack(rtp_session, nack[i]);
}
//switch_core_media_gen_key_frame(rtp_session->session);
@@ -6493,6 +6502,7 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
uint32_t lsr;
uint32_t packet_ssrc;
double rtt_now = 0;
+ uint8_t rtt_valid = 0;
int rtt_increase = 0, packet_loss_increase=0;
//if (msg->header.type == _RTCP_PT_SR && rtp_session->ice.ice_user) {
@@ -6502,7 +6512,7 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
now = switch_micro_time_now(); /* number of microseconds since 00:00:00 january 1, 1970 UTC */
sec = (uint32_t)(now/1000000); /* converted to second (NTP most significant bits) */
ntp_sec = sec+NTP_TIME_OFFSET; /* 32bits most significant */
- ntp_usec = (uint32_t)(now - (sec*1000000)); /* micro seconds */
+ ntp_usec = (uint32_t)(now - (((switch_time_t) sec) * 1000000)); /* micro seconds */
lsr_now = (uint32_t)(ntp_usec*0.065536) | (ntp_sec&0x0000ffff)<<16; // 0.065536 is used for convertion from useconds
if (msg->header.type == _RTCP_PT_SR) { /* Sender report */
@@ -6580,23 +6590,47 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
rtp_session->rtcp_frame.reports[i].jitter = ntohl(report->jitter);
rtp_session->rtcp_frame.reports[i].lsr = ntohl(report->lsr);
rtp_session->rtcp_frame.reports[i].dlsr = ntohl(report->dlsr);
+
if (rtp_session->rtcp_frame.reports[i].lsr && !rtp_session->flags[SWITCH_RTP_FLAG_RTCP_PASSTHRU]) {
+
switch_time_exp_gmt(&now_hr,now);
+
/* Calculating RTT = A - DLSR - LSR */
rtt_now = (double)(lsr_now - rtp_session->rtcp_frame.reports[i].dlsr - rtp_session->rtcp_frame.reports[i].lsr)/65536;
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3,
- "Receiving an RTCP packet\n[%04d-%02d-%02d %02d:%02d:%02d.%d] SSRC[0x%x]\n"
- "RTT[%f] = A[%u] - DLSR[%u] - LSR[%u]\n",
- 1900 + now_hr.tm_year, now_hr.tm_mday, now_hr.tm_mon, now_hr.tm_hour, now_hr.tm_min, now_hr.tm_sec, now_hr.tm_usec,
- rtp_session->rtcp_frame.reports[i].ssrc, rtt_now,
- lsr_now, rtp_session->rtcp_frame.reports[i].dlsr, rtp_session->rtcp_frame.reports[i].lsr);
- if (!rtp_session->rtcp_frame.reports[i].rtt_avg) {
- rtp_session->rtcp_frame.reports[i].rtt_avg = rtt_now;
+
+ /* Only account RTT if it didn't overflow. */
+ if (lsr_now > rtp_session->rtcp_frame.reports[i].dlsr + rtp_session->rtcp_frame.reports[i].lsr) {
+
+ rtt_valid = 1;
+
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3,
+ "Receiving an RTCP packet\n[%04d-%02d-%02d %02d:%02d:%02d.%d] SSRC[0x%x]\n"
+ "RTT[%f] = A[%u] - DLSR[%u] - LSR[%u]\n",
+ 1900 + now_hr.tm_year, now_hr.tm_mday, now_hr.tm_mon, now_hr.tm_hour, now_hr.tm_min, now_hr.tm_sec, now_hr.tm_usec,
+ rtp_session->rtcp_frame.reports[i].ssrc, rtt_now,
+ lsr_now, rtp_session->rtcp_frame.reports[i].dlsr, rtp_session->rtcp_frame.reports[i].lsr);
+ if (!rtp_session->rtcp_frame.reports[i].rtt_avg) {
+ rtp_session->rtcp_frame.reports[i].rtt_avg = rtt_now;
+ } else {
+ rtp_session->rtcp_frame.reports[i].rtt_avg = (double)((rtp_session->rtcp_frame.reports[i].rtt_avg * .7) + (rtt_now * .3 ));
+ }
} else {
- rtp_session->rtcp_frame.reports[i].rtt_avg = (double)((rtp_session->rtcp_frame.reports[i].rtt_avg * .7) + (rtt_now * .3 ));
+
+#ifdef DEBUG_RTCP
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING,
+ "Receiving RTCP packet\n[%04d-%02d-%02d %02d:%02d:%02d.%d] SSRC[0x%x]\n"
+ "Ignoring erroneous RTT[%f] = A[%u] - DLSR[%u] - LSR[%u]\n",
+ 1900 + now_hr.tm_year, now_hr.tm_mday, now_hr.tm_mon, now_hr.tm_hour, now_hr.tm_min, now_hr.tm_sec, now_hr.tm_usec,
+ rtp_session->rtcp_frame.reports[i].ssrc, rtt_now,
+ lsr_now, rtp_session->rtcp_frame.reports[i].dlsr, rtp_session->rtcp_frame.reports[i].lsr);
+#endif
}
+
+ rtt_valid = 0;
+ rtt_now = 0;
+
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3, "RTT average %f\n",
- rtp_session->rtcp_frame.reports[i].rtt_avg);
+ rtp_session->rtcp_frame.reports[i].rtt_avg);
}
if (rtp_session->flags[SWITCH_RTP_FLAG_ADJ_BITRATE_CAP] && rtp_session->flags[SWITCH_RTP_FLAG_ESTIMATORS] && !rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) {
@@ -6606,14 +6640,17 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3, "Current packet loss: [%d %%] Current RTT: [%f ms]\n", percent_fraction, rtt_now);
#endif
- switch_kalman_estimate(rtp_session->estimators[EST_RTT], rtt_now, EST_RTT);
+ if (rtt_valid) {
- if (switch_kalman_cusum_detect_change(rtp_session->detectors[EST_RTT], rtt_now, rtp_session->estimators[EST_RTT]->val_estimate_last)) {
- /* sudden change in the mean value of RTT */
+ switch_kalman_estimate(rtp_session->estimators[EST_RTT], rtt_now, EST_RTT);
+
+ if (switch_kalman_cusum_detect_change(rtp_session->detectors[EST_RTT], rtt_now, rtp_session->estimators[EST_RTT]->val_estimate_last)) {
+ /* sudden change in the mean value of RTT */
#ifdef DEBUG_ESTIMATORS_
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3,"Sudden change in the mean value of RTT !\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3,"Sudden change in the mean value of RTT !\n");
#endif
- rtt_increase = 1;
+ rtt_increase = 1;
+ }
}
switch_kalman_estimate(rtp_session->estimators[EST_LOSS], percent_fraction, EST_LOSS);
@@ -6657,7 +6694,7 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
(void *)&rtp_session->rtcp_frame.reports[i].loss_avg,
SCCT_NONE, NULL, NULL, NULL);
- } else if (!rtt_increase && rtp_session->estimators[EST_LOSS]->val_estimate_last >= rtp_session->rtcp_frame.reports[i].loss_avg ) {
+ } else if (rtt_valid && !rtt_increase && rtp_session->estimators[EST_LOSS]->val_estimate_last >= rtp_session->rtcp_frame.reports[i].loss_avg ) {
/* lossy because of congestion (queues full somewhere -> some packets are dropped , but RTT is good ), packet loss with many small gaps */
#ifdef DEBUG_ESTIMATORS_
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG3, "packet loss, but RTT is not bad\n");
@@ -7094,7 +7131,12 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
if (slept) {
switch_cond_next();
} else {
- switch_core_timer_next(&rtp_session->timer);
+ if (rtp_session->skip_timer) {
+ rtp_session->skip_timer = 0;
+ switch_cond_next();
+ } else {
+ switch_core_timer_next(&rtp_session->timer);
+ }
slept++;
}
@@ -8283,7 +8325,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session,
#ifdef DEBUG_TS_ROLLOVER
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "WRITE TS LAST:%u THIS:%u DELTA:%u\n", rtp_session->last_write_ts, this_ts, ts_delta);
#endif
- if (!switch_rtp_ready(rtp_session) || rtp_session->sending_dtmf) {
+ if (ts_delta == 0 || !switch_rtp_ready(rtp_session) || rtp_session->sending_dtmf) {
send = 0;
}
}
@@ -8804,6 +8846,7 @@ SWITCH_DECLARE(int) switch_rtp_write_frame(switch_rtp_t *rtp_session, switch_fra
data = frame->data;
len = frame->datalen;
ts = rtp_session->flags[SWITCH_RTP_FLAG_RAW_WRITE] ? (uint32_t) frame->timestamp : 0;
+ if (!ts) ts = rtp_session->last_write_ts + rtp_session->samples_per_interval;
}
/*
diff --git a/src/switch_utils.c b/src/switch_utils.c
index 0b480fcbea..bd21e7ee75 100644
--- a/src/switch_utils.c
+++ b/src/switch_utils.c
@@ -1405,12 +1405,12 @@ SWITCH_DECLARE(char *) switch_strip_commas(char *in, char *out, switch_size_t le
for (; p && *p; p++) {
if ((*p > 47 && *p < 58)) {
*q++ = *p;
- } else if (*p != ',') {
- ret = NULL;
- break;
- }
- if (++x > len) {
+ if (++x > len) {
+ ret = NULL;
+ break;
+ }
+ } else if (*p != ',') {
ret = NULL;
break;
}
@@ -1428,11 +1428,11 @@ SWITCH_DECLARE(char *) switch_strip_nonnumerics(char *in, char *out, switch_size
for (; p && *p; p++) {
if ((*p > 47 && *p < 58) || *p == '.' || *p == '-' || *p == '+') {
*q++ = *p;
- }
- if (++x > len) {
- ret = NULL;
- break;
+ if (++x > len) {
+ ret = NULL;
+ break;
+ }
}
}
diff --git a/src/switch_vad.c b/src/switch_vad.c
index c22ed2f352..8d12c3bdb1 100644
--- a/src/switch_vad.c
+++ b/src/switch_vad.c
@@ -75,17 +75,32 @@ SWITCH_DECLARE(switch_vad_t *) switch_vad_init(int sample_rate, int channels)
return vad;
}
-//Valid modes are 0 ("quality"), 1 ("low bitrate"), 2 ("aggressive"), and 3 * ("very aggressive"). The default mode is 0.
SWITCH_DECLARE(int) switch_vad_set_mode(switch_vad_t *vad, int mode)
{
#ifdef SWITCH_HAVE_FVAD
- int ret;
+ int ret = 0;
- if (mode < 0) return 0;
+ if (mode < 0 && vad->fvad) {
+ fvad_free(vad->fvad);
+ vad->fvad = NULL;
+ return ret;
+ } else if (mode > 3) {
+ mode = 3;
+ }
+
+ if (!vad->fvad) {
+ vad->fvad = fvad_new();
+
+ if (!vad->fvad) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "libfvad init error\n");
+ }
+ }
+
+ if (vad->fvad) {
+ ret = fvad_set_mode(vad->fvad, mode);
+ fvad_set_sample_rate(vad->fvad, vad->sample_rate);
+ }
- vad->fvad = fvad_new();
- ret = fvad_set_mode(vad->fvad, mode);
- fvad_set_sample_rate(vad->fvad, vad->sample_rate);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "libfvad started, mode = %d\n", mode);
return ret;
#else
@@ -210,7 +225,7 @@ SWITCH_DECLARE(void) switch_vad_destroy(switch_vad_t **vad)
if (*vad) {
#ifdef SWITCH_HAVE_FVAD
- if ((*vad)->fvad) free ((*vad)->fvad);
+ if ((*vad)->fvad) fvad_free ((*vad)->fvad);
#endif
free(*vad);
diff --git a/src/switch_vpx.c b/src/switch_vpx.c
index 02b5f3aadd..eff164eae4 100644
--- a/src/switch_vpx.c
+++ b/src/switch_vpx.c
@@ -51,6 +51,68 @@
#define SLICE_SIZE SWITCH_DEFAULT_VIDEO_SIZE
#define KEY_FRAME_MIN_FREQ 250000
+typedef struct my_vpx_cfg_s {
+ int lossless;
+ int cpuused;
+ int token_parts;
+ int static_thresh;
+ int noise_sensitivity;
+ int max_intra_bitrate_pct;
+ vp9e_tune_content tune_content;
+
+ vpx_codec_enc_cfg_t enc_cfg;
+ vpx_codec_dec_cfg_t dec_cfg;
+} my_vpx_cfg_t;
+
+#define SHOW(cfg, field) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-28s = %d\n", #field, cfg->field);
+
+static void show_config(my_vpx_cfg_t *my_cfg)
+{
+ vpx_codec_enc_cfg_t *cfg = &my_cfg->enc_cfg;
+
+ SHOW(my_cfg, lossless);
+ SHOW(my_cfg, cpuused);
+ SHOW(my_cfg, token_parts);
+ SHOW(my_cfg, static_thresh);
+ SHOW(my_cfg, noise_sensitivity);
+ SHOW(my_cfg, max_intra_bitrate_pct);
+ SHOW(my_cfg, tune_content);
+
+ SHOW(cfg, g_usage);
+ SHOW(cfg, g_threads);
+ SHOW(cfg, g_profile);
+ SHOW(cfg, g_w);
+ SHOW(cfg, g_h);
+ SHOW(cfg, g_bit_depth);
+ SHOW(cfg, g_input_bit_depth);
+ SHOW(cfg, g_timebase.num);
+ SHOW(cfg, g_timebase.den);
+ SHOW(cfg, g_error_resilient);
+ SHOW(cfg, g_pass);
+ SHOW(cfg, g_lag_in_frames);
+ SHOW(cfg, rc_dropframe_thresh);
+ SHOW(cfg, rc_resize_allowed);
+ SHOW(cfg, rc_scaled_width);
+ SHOW(cfg, rc_scaled_height);
+ SHOW(cfg, rc_resize_up_thresh);
+ SHOW(cfg, rc_resize_down_thresh);
+ SHOW(cfg, rc_end_usage);
+ SHOW(cfg, rc_target_bitrate);
+ SHOW(cfg, rc_min_quantizer);
+ SHOW(cfg, rc_max_quantizer);
+ SHOW(cfg, rc_undershoot_pct);
+ SHOW(cfg, rc_overshoot_pct);
+ SHOW(cfg, rc_buf_sz);
+ SHOW(cfg, rc_buf_initial_sz);
+ SHOW(cfg, rc_buf_optimal_sz);
+ SHOW(cfg, rc_2pass_vbr_bias_pct);
+ SHOW(cfg, rc_2pass_vbr_minsection_pct);
+ SHOW(cfg, rc_2pass_vbr_maxsection_pct);
+ SHOW(cfg, kf_mode);
+ SHOW(cfg, kf_min_dist);
+ SHOW(cfg, kf_max_dist);
+}
+
/* http://tools.ietf.org/html/draft-ietf-payload-vp8-10
The first octets after the RTP header are the VP8 payload descriptor, with the following structure.
@@ -267,6 +329,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_vpx_load);
SWITCH_MODULE_DEFINITION(CORE_VPX_MODULE, mod_vpx_load, NULL, NULL);
struct vpx_context {
+ int debug;
switch_codec_t *codec;
int is_vp9;
vp9_info_t vp9;
@@ -276,7 +339,7 @@ struct vpx_context {
unsigned int flags;
switch_codec_settings_t codec_settings;
unsigned int bandwidth;
- vpx_codec_enc_cfg_t config;
+ vpx_codec_enc_cfg_t config;
switch_time_t last_key_frame;
vpx_codec_ctx_t encoder;
@@ -314,6 +377,22 @@ struct vpx_context {
};
typedef struct vpx_context vpx_context_t;
+struct vpx_globals {
+ int debug;
+ uint32_t max_bitrate;
+ uint32_t rtp_slice_size;
+ uint32_t key_frame_min_freq;
+
+ char vp8_profile[20];
+ char vp9_profile[20];
+ char vp10_profile[20];
+
+ my_vpx_cfg_t vp8;
+ my_vpx_cfg_t vp9;
+ my_vpx_cfg_t vp10;
+};
+
+struct vpx_globals vpx_globals = { 0 };
static switch_status_t init_decoder(switch_codec_t *codec)
{
@@ -329,14 +408,11 @@ static switch_status_t init_decoder(switch_codec_t *codec)
// context->decoder_init = 0;
//}
- //cfg.threads = 1;//(switch_core_cpu_count() > 1) ? 2 : 1;
-
- cfg.threads = switch_core_cpu_count() / 2;
- if (cfg.threads > 4) cfg.threads = 4;
- if (cfg.threads < 1) cfg.threads = 1;
-
- if (!context->is_vp9) { // vp8 only
+ if (context->is_vp9) {
+ cfg.threads = vpx_globals.vp9.dec_cfg.threads;
+ } else {
// dec_flags = VPX_CODEC_USE_POSTPROC;
+ cfg.threads = vpx_globals.vp8.dec_cfg.threads;
}
if (vpx_codec_dec_init(&context->decoder, context->decoder_interface, &cfg, dec_flags) != VPX_CODEC_OK) {
@@ -377,7 +453,17 @@ static switch_status_t init_encoder(switch_codec_t *codec)
vpx_codec_enc_cfg_t *config = &context->config;
int token_parts = 1;
int cpus = switch_core_cpu_count();
- int sane, threads = 1;
+ vpx_codec_enc_cfg_t *vp8_enc_cfg = &vpx_globals.vp8.enc_cfg;
+ vpx_codec_enc_cfg_t *vp9_enc_cfg = &vpx_globals.vp9.enc_cfg;
+ my_vpx_cfg_t *my_cfg = NULL;
+
+ if (context->is_vp9) {
+ *config = *vp9_enc_cfg;
+ my_cfg = &vpx_globals.vp9;
+ } else {
+ *config = *vp8_enc_cfg;
+ my_cfg = &vpx_globals.vp8;
+ }
if (!context->codec_settings.video.width) {
context->codec_settings.video.width = 1280;
@@ -395,14 +481,11 @@ static switch_status_t init_encoder(switch_codec_t *codec)
context->bandwidth = context->codec_settings.video.bandwidth;
} else {
context->bandwidth = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 1, 15);
-
}
- sane = switch_calc_bitrate(1920, 1080, 5, 60);
-
- if (context->bandwidth > sane) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_WARNING, "BITRATE TRUNCATED FROM %d TO %d\n", context->bandwidth, sane);
- context->bandwidth = sane;
+ if (context->bandwidth > vpx_globals.max_bitrate) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_WARNING, "BITRATE TRUNCATED FROM %d TO %d\n", context->bandwidth, vpx_globals.max_bitrate);
+ context->bandwidth = vpx_globals.max_bitrate;
}
context->pkt = NULL;
@@ -413,29 +496,20 @@ static switch_status_t init_encoder(switch_codec_t *codec)
context->start_time = switch_micro_time_now();
- config->g_timebase.num = 1;
- config->g_timebase.den = 1000;//90000;
- config->g_pass = VPX_RC_ONE_PASS;
config->g_w = context->codec_settings.video.width;
config->g_h = context->codec_settings.video.height;
config->rc_target_bitrate = context->bandwidth;
- config->g_lag_in_frames = 0;
- config->kf_max_dist = 360;//2000;
- threads = cpus / 2;
- if (threads > 4) threads = 4;
- if (threads < 1) threads = 1;
- config->g_threads = threads;
+
+ token_parts = (cpus > 1) ? 3 : 0;
if (context->is_vp9) {
- //config->rc_dropframe_thresh = 2;
- token_parts = (cpus > 1) ? 3 : 0;
+ if (vpx_globals.vp9.token_parts > 0) {
+ token_parts = vpx_globals.vp9.token_parts;
+ }
if (context->lossless) {
config->rc_min_quantizer = 0;
config->rc_max_quantizer = 0;
- } else {
- config->rc_min_quantizer = 0;
- config->rc_max_quantizer = 63;
}
config->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_NOLAYERING;
@@ -444,63 +518,9 @@ static switch_status_t init_encoder(switch_codec_t *codec)
config->ts_periodicity = 1;
config->ts_layer_id[0] = 0;
} else {
-
- // settings
- config->g_profile = 2;
- config->g_error_resilient = VPX_ERROR_RESILIENT_PARTITIONS;
- token_parts = (cpus > 1) ? 3 : 0;
-
- // rate control settings
- config->rc_dropframe_thresh = 0;
- config->rc_end_usage = VPX_CBR;
- //config->g_pass = VPX_RC_ONE_PASS;
- config->kf_mode = VPX_KF_AUTO;
- config->kf_max_dist = 360;//1000;
-
- //config->kf_mode = VPX_KF_DISABLED;
- config->rc_resize_allowed = 1;
- //config->rc_min_quantizer = 0;
- //config->rc_max_quantizer = 63;
- config->rc_min_quantizer = 0;
- config->rc_max_quantizer = 63;
- //Rate control adaptation undershoot control.
- // This value, expressed as a percentage of the target bitrate,
- // controls the maximum allowed adaptation speed of the codec.
- // This factor controls the maximum amount of bits that can be
- // subtracted from the target bitrate in order to compensate for
- // prior overshoot.
- // Valid values in the range 0-1000.
- config->rc_undershoot_pct = 100;
- //Rate control adaptation overshoot control.
- // This value, expressed as a percentage of the target bitrate,
- // controls the maximum allowed adaptation speed of the codec.
- // This factor controls the maximum amount of bits that can be
- // added to the target bitrate in order to compensate for prior
- // undershoot.
- // Valid values in the range 0-1000.
- config->rc_overshoot_pct = 15;
- //Decoder Buffer Size.
- // This value indicates the amount of data that may be buffered
- // by the decoding application. Note that this value is expressed
- // in units of time (milliseconds). For example, a value of 5000
- // indicates that the client will buffer (at least) 5000ms worth
- // of encoded data. Use the target bitrate (rc_target_bitrate) to
- // convert to bits/bytes, if necessary.
- config->rc_buf_sz = 5000;
- //Decoder Buffer Initial Size.
- // This value indicates the amount of data that will be buffered
- // by the decoding application prior to beginning playback.
- // This value is expressed in units of time (milliseconds).
- // Use the target bitrate (rc_target_bitrate) to convert to
- // bits/bytes, if necessary.
- config->rc_buf_initial_sz = 1000;
- //Decoder Buffer Optimal Size.
- // This value indicates the amount of data that the encoder should
- // try to maintain in the decoder's buffer. This value is expressed
- // in units of time (milliseconds).
- // Use the target bitrate (rc_target_bitrate) to convert to
- // bits/bytes, if necessary.
- config->rc_buf_optimal_sz = 1000;
+ if (vpx_globals.vp8.token_parts > 0) {
+ token_parts = vpx_globals.vp8.token_parts;
+ }
}
if (context->encoder_init) {
@@ -510,45 +530,10 @@ static switch_status_t init_encoder(switch_codec_t *codec)
}
} else if (context->flags & SWITCH_CODEC_FLAG_ENCODE) {
- // #define SHOW(field) fprintf(stderr, " %-28s = %d\n", #field, config->field);
-
-#ifdef SHOW
- fprintf(stderr, "Codec: %s\n", vpx_codec_iface_name(context->encoder_interface));
-
- SHOW(g_usage);
- SHOW(g_threads);
- SHOW(g_profile);
- SHOW(g_w);
- SHOW(g_h);
- SHOW(g_bit_depth);
- SHOW(g_input_bit_depth);
- SHOW(g_timebase.num);
- SHOW(g_timebase.den);
- SHOW(g_error_resilient);
- SHOW(g_pass);
- SHOW(g_lag_in_frames);
- SHOW(rc_dropframe_thresh);
- SHOW(rc_resize_allowed);
- SHOW(rc_scaled_width);
- SHOW(rc_scaled_height);
- SHOW(rc_resize_up_thresh);
- SHOW(rc_resize_down_thresh);
- SHOW(rc_end_usage);
- SHOW(rc_target_bitrate);
- SHOW(rc_min_quantizer);
- SHOW(rc_max_quantizer);
- SHOW(rc_undershoot_pct);
- SHOW(rc_overshoot_pct);
- SHOW(rc_buf_sz);
- SHOW(rc_buf_initial_sz);
- SHOW(rc_buf_optimal_sz);
- SHOW(rc_2pass_vbr_bias_pct);
- SHOW(rc_2pass_vbr_minsection_pct);
- SHOW(rc_2pass_vbr_maxsection_pct);
- SHOW(kf_mode);
- SHOW(kf_min_dist);
- SHOW(kf_max_dist);
-#endif
+ if (vpx_globals.debug) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: %s\n", vpx_codec_iface_name(context->encoder_interface));
+ show_config(my_cfg);
+ }
if (vpx_codec_enc_init(&context->encoder, context->encoder_interface, config, 0 & VPX_CODEC_USE_OUTPUT_PARTITION) != VPX_CODEC_OK) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s init error: [%d:%s]\n", vpx_codec_iface_name(context->encoder_interface), context->encoder.err, context->encoder.err_detail);
@@ -557,34 +542,24 @@ static switch_status_t init_encoder(switch_codec_t *codec)
context->encoder_init = 1;
+ vpx_codec_control(&context->encoder, VP8E_SET_TOKEN_PARTITIONS, token_parts);
+
if (context->is_vp9) {
- if (context->lossless) {
+ if (context->lossless || vpx_globals.vp9.lossless) {
vpx_codec_control(&context->encoder, VP9E_SET_LOSSLESS, 1);
- vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, -6);
- } else {
- vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, -8);
}
- vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, 1000);
- vpx_codec_control(&context->encoder, VP8E_SET_TOKEN_PARTITIONS, token_parts);
- vpx_codec_control(&context->encoder, VP9E_SET_TUNE_CONTENT, VP9E_CONTENT_SCREEN);
-
+ vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, vpx_globals.vp9.cpuused);
+ vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, vpx_globals.vp9.static_thresh);
+ vpx_codec_control(&context->encoder, VP9E_SET_TUNE_CONTENT, vpx_globals.vp9.tune_content);
} else {
- // The static threshold imposes a change threshold on blocks below which they will be skipped by the encoder.
- vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, 100);
- //Set cpu usage, a bit lower than normal (-6) but higher than android (-12)
- vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, -6);
- vpx_codec_control(&context->encoder, VP8E_SET_TOKEN_PARTITIONS, token_parts);
+ vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, vpx_globals.vp8.static_thresh);
+ vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, vpx_globals.vp8.cpuused);
+ vpx_codec_control(&context->encoder, VP8E_SET_NOISE_SENSITIVITY, vpx_globals.vp8.noise_sensitivity);
- // Enable noise reduction
- vpx_codec_control(&context->encoder, VP8E_SET_NOISE_SENSITIVITY, 1);
- //Set max data rate for Intra frames.
- // This value controls additional clamping on the maximum size of a keyframe.
- // It is expressed as a percentage of the average per-frame bitrate, with the
- // special (and default) value 0 meaning unlimited, or no additional clamping
- // beyond the codec's built-in algorithm.
- // For example, to allocate no more than 4.5 frames worth of bitrate to a keyframe, set this to 450.
- //vpx_codec_control(&context->encoder, VP8E_SET_MAX_INTRA_BITRATE_PCT, 0);
+ if (vpx_globals.vp8.max_intra_bitrate_pct) {
+ vpx_codec_control(&context->encoder, VP8E_SET_MAX_INTRA_BITRATE_PCT, vpx_globals.vp8.max_intra_bitrate_pct);
+ }
}
}
@@ -625,11 +600,6 @@ static switch_status_t switch_vpx_init(switch_codec_t *codec, switch_codec_flag_
codec->fmtp_out = switch_core_strdup(codec->memory_pool, codec->fmtp_in);
}
- if (vpx_codec_enc_config_default(context->encoder_interface, &context->config, 0) != VPX_CODEC_OK) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Encoder config Error\n");
- return SWITCH_STATUS_FALSE;
- }
-
context->codec_settings.video.width = 320;
context->codec_settings.video.height = 240;
@@ -684,7 +654,7 @@ static switch_status_t consume_partition(vpx_context_t *context, switch_frame_t
// if !extended
hdrlen = 1;
body = ((uint8_t *)frame->data) + hdrlen;
- packet_size = SLICE_SIZE;
+ packet_size = vpx_globals.rtp_slice_size;
payload_size = packet_size - hdrlen;
// else add extended TBD
@@ -826,7 +796,7 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
height = frame->img->h;
}
- if (context->config.g_w != width || context->config.g_h != height) {
+ if (context->codec_settings.video.width != width || context->codec_settings.video.height != height) {
context->codec_settings.video.width = width;
context->codec_settings.video.height = height;
reset_codec_encoder(codec);
@@ -834,7 +804,6 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
context->need_key_frame = 3;
}
-
if (!context->encoder_init) {
if (init_encoder(codec) != SWITCH_STATUS_SUCCESS) {
return SWITCH_STATUS_FALSE;
@@ -854,7 +823,7 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
if (context->need_key_frame > 0) {
// force generate a key frame
- if (!context->last_key_frame || (now - context->last_key_frame) > KEY_FRAME_MIN_FREQ) {
+ if (!context->last_key_frame || (now - context->last_key_frame) > vpx_globals.key_frame_min_freq) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "VPX KEYFRAME GENERATED\n");
vpx_flags |= VPX_EFLAG_FORCE_KF;
context->need_key_frame = 0;
@@ -864,8 +833,8 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
context->framecount++;
- pts = (now - context->start_time) / 1000;
- //pts = frame->timestamp;
+ //pts = (now - context->start_time) / 1000;
+ pts = frame->timestamp;
dur = context->last_ms ? (now - context->last_ms) / 1000 : pts;
@@ -895,11 +864,10 @@ static switch_status_t buffer_vp8_packets(vpx_context_t *context, switch_frame_t
uint8_t DES;
// uint8_t PID;
int len;
-#if 0
- int key = 0;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
- "VIDEO VPX: seq: %d ts: %u len: %ld %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x mark: %d\n",
+ if (context->debug > 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, context->debug,
+ "VIDEO VPX: seq: %d ts: %u len: %u %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x mark: %d\n",
frame->seq, frame->timestamp, frame->datalen,
*((uint8_t *)data), *((uint8_t *)data + 1),
*((uint8_t *)data + 2), *((uint8_t *)data + 3),
@@ -907,8 +875,7 @@ static switch_status_t buffer_vp8_packets(vpx_context_t *context, switch_frame_t
*((uint8_t *)data + 6), *((uint8_t *)data + 7),
*((uint8_t *)data + 8), *((uint8_t *)data + 9),
*((uint8_t *)data + 10), frame->m);
-#endif
-
+ }
DES = *data;
data++;
@@ -986,8 +953,8 @@ static switch_status_t buffer_vp9_packets(vpx_context_t *context, switch_frame_t
vp9_payload_descriptor_t *desc = (vp9_payload_descriptor_t *)vp9;
int len = 0;
-#ifdef DEBUG_VP9
- switch_log_printf(SWITCH_CHANNEL_LOG, frame->m ? SWITCH_LOG_ERROR : SWITCH_LOG_INFO,
+ if (context->debug > 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, frame->m ? SWITCH_LOG_ERROR : SWITCH_LOG_INFO,
"[%02x %02x %02x %02x] m=%d len=%4d seq=%d ts=%u ssrc=%u "
"have_pid=%d "
"have_p_layer=%d "
@@ -1006,7 +973,7 @@ static switch_status_t buffer_vp9_packets(vpx_context_t *context, switch_frame_t
desc->end,
desc->have_ss,
desc->zero);
-#endif
+ }
vp9++;
@@ -1121,12 +1088,12 @@ static switch_status_t switch_vpx_decode(switch_codec_t *codec, switch_frame_t *
switch_status_t status = SWITCH_STATUS_SUCCESS;
int is_start = 0, is_keyframe = 0, get_refresh = 0;
-#if 0
- vp9_payload_descriptor_t *desc = (vp9_payload_descriptor_t *)frame->data;
- uint8_t *data = frame->data;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%02x %02x %02x %02x m=%d start=%d end=%d m=%d len=%d\n",
- *data, *(data+1), *(data+2), *(data+3), frame->m, desc->start, desc->end, frame->m, frame->datalen);
-#endif
+ if (context->debug > 0 && context->debug < 4) {
+ vp9_payload_descriptor_t *desc = (vp9_payload_descriptor_t *)frame->data;
+ uint8_t *data = frame->data;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%02x %02x %02x %02x m=%d start=%d end=%d m=%d len=%d\n",
+ *data, *(data+1), *(data+2), *(data+3), frame->m, desc->start, desc->end, frame->m, frame->datalen);
+ }
if (context->is_vp9) {
is_keyframe = IS_VP9_KEY_FRAME(*(unsigned char *)frame->data);
@@ -1145,10 +1112,6 @@ static switch_status_t switch_vpx_decode(switch_codec_t *codec, switch_frame_t *
} else { // vp8
is_start = (*(unsigned char *)frame->data & 0x10);
is_keyframe = IS_VP8_KEY_FRAME((uint8_t *)frame->data);
-
-#ifdef DEBUG_VP9
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "VP8\n");
-#endif
}
if (!is_keyframe && context->got_key_frame <= 0) {
@@ -1161,7 +1124,9 @@ static switch_status_t switch_vpx_decode(switch_codec_t *codec, switch_frame_t *
}
}
- // if (is_keyframe) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "got key %d\n", context->got_key_frame);
+ if (context->debug > 0 && is_keyframe) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "GOT KEY FRAME %d\n", context->got_key_frame);
+ }
if (context->need_decoder_reset != 0) {
vpx_codec_destroy(&context->decoder);
@@ -1349,6 +1314,29 @@ static switch_status_t switch_vpx_control(switch_codec_t *codec,
}
}
break;
+ case SCC_CODEC_SPECIFIC:
+ {
+ const char *command = (const char *)cmd_data;
+
+ if (ctype == SCCT_INT) {
+ } else if (ctype == SCCT_STRING && !zstr(command)) {
+ if (!strcasecmp(command, "VP8E_SET_CPUUSED")) {
+ vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, *(int *)cmd_arg);
+ } else if (!strcasecmp(command, "VP8E_SET_TOKEN_PARTITIONS")) {
+ vpx_codec_control(&context->encoder, VP8E_SET_TOKEN_PARTITIONS, *(int *)cmd_arg);
+ } else if (!strcasecmp(command, "VP8E_SET_NOISE_SENSITIVITY")) {
+ vpx_codec_control(&context->encoder, VP8E_SET_NOISE_SENSITIVITY, *(int *)cmd_arg);
+ }
+ }
+
+ }
+ break;
+ case SCC_DEBUG:
+ {
+ int32_t level = *((uint32_t *) cmd_data);
+ context->debug = level;
+ }
+ break;
default:
break;
}
@@ -1386,12 +1374,354 @@ static switch_status_t switch_vpx_destroy(switch_codec_t *codec)
return SWITCH_STATUS_SUCCESS;
}
+#define UINTVAL(v) (v > 0 ? v : 0);
+
+static void load_config()
+{
+ switch_xml_t cfg = NULL, xml = NULL;
+
+ vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &vpx_globals.vp8.enc_cfg, 0);
+ vpx_codec_enc_config_default(vpx_codec_vp9_cx(), &vpx_globals.vp9.enc_cfg, 0);
+
+ switch_set_string(vpx_globals.vp8_profile, "vp8");
+ switch_set_string(vpx_globals.vp9_profile, "vp9");
+ switch_set_string(vpx_globals.vp10_profile, "vp10");
+
+ vpx_globals.max_bitrate = 0;
+ vpx_globals.vp8.cpuused = -6;
+ vpx_globals.vp9.cpuused = -6;
+ vpx_globals.vp10.cpuused = -6;
+
+ xml = switch_xml_open_cfg("vpx.conf", &cfg, NULL);
+
+ if (xml) {
+ switch_xml_t settings = switch_xml_child(cfg, "settings");
+ switch_xml_t profiles = switch_xml_child(cfg, "profiles");
+
+ if (settings) {
+ switch_xml_t param;
+
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ const char *name = switch_xml_attr(param, "name");
+ const char *value = switch_xml_attr(param, "value");
+
+ if (zstr(name) || zstr(value)) continue;
+
+ if (!strcmp(name, "max-bitrate")) {
+ vpx_globals.max_bitrate = switch_parse_bandwidth_string(value);
+ } else if (!strcmp(name, "rtp-slice-size")) {
+ int val = atoi(value);
+ vpx_globals.rtp_slice_size = UINTVAL(val);
+ } else if (!strcmp(name, "key-frame-min-freq")) {
+ int val = atoi(value);
+ vpx_globals.key_frame_min_freq = UINTVAL(val);
+ vpx_globals.key_frame_min_freq *= 1000;
+ } else if (!strcmp(name, "dec-threads")) {
+ vpx_globals.vp8.dec_cfg.threads = switch_parse_cpu_string(value);
+ vpx_globals.vp9.dec_cfg.threads = switch_parse_cpu_string(value);
+ vpx_globals.vp10.dec_cfg.threads = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "enc-threads")) {
+ vpx_globals.vp8.enc_cfg.g_threads = switch_parse_cpu_string(value);
+ vpx_globals.vp9.enc_cfg.g_threads = switch_parse_cpu_string(value);
+ vpx_globals.vp10.enc_cfg.g_threads = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "vp8-profile")) {
+ switch_set_string(vpx_globals.vp8_profile, value);
+ } else if (!strcmp(name, "vp9-profile")) {
+ switch_set_string(vpx_globals.vp9_profile, value);
+ } else if (!strcmp(name, "vp10-profile")) {
+ switch_set_string(vpx_globals.vp10_profile, value);
+ }
+ }
+ }
+
+ if (profiles) {
+ switch_xml_t profile = switch_xml_child(profiles, "profile");
+
+ for (; profile; profile = profile->next) {
+ switch_xml_t param = NULL;
+ const char *profile_name = switch_xml_attr(profile, "name");
+ vpx_codec_dec_cfg_t *dec_cfg = NULL;
+ vpx_codec_enc_cfg_t *enc_cfg = NULL;
+ my_vpx_cfg_t *my_cfg = NULL;
+
+ if (zstr(profile_name)) continue;
+
+ if (!strcmp(profile_name, vpx_globals.vp8_profile)) {
+ my_cfg = &vpx_globals.vp8;
+ } else if (!strcmp(profile_name, vpx_globals.vp9_profile)) {
+ my_cfg = &vpx_globals.vp9;
+ } else if (!strcmp(profile_name, vpx_globals.vp10_profile)) {
+ my_cfg = &vpx_globals.vp10;
+ }
+
+ if (!my_cfg) continue;
+
+ dec_cfg = &my_cfg->dec_cfg;
+ enc_cfg = &my_cfg->enc_cfg;
+
+ for (param = switch_xml_child(profile, "param"); param; param = param->next) {
+ const char *name = switch_xml_attr(param, "name");
+ const char *value = switch_xml_attr(param, "value");
+ int val;
+
+ if (!enc_cfg || !dec_cfg) break;
+ if (zstr(name) || zstr(value)) continue;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: %s = %s\n", profile_name, name, value);
+
+ val = atoi(value);
+
+ if (!strcmp(name, "dec-threads")) {
+ dec_cfg->threads = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "enc-threads")) {
+ enc_cfg->g_threads = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "g-profile")) {
+ enc_cfg->g_profile = UINTVAL(val);
+ } else if (!strcmp(name, "g-timebase")) {
+ int num = 0;
+ int den = 0;
+ char *slash = strchr(value, '/');
+
+ num = UINTVAL(val);
+
+ if (slash) {
+ slash++;
+ den = atoi(slash);
+
+ if (den < 0) den = 0;
+ }
+
+ if (num && den) {
+ enc_cfg->g_timebase.num = num;
+ enc_cfg->g_timebase.den = den;
+ }
+ } else if (!strcmp(name, "g-error-resilient")) {
+ char *s = strdup(value);
+ vpx_codec_er_flags_t res = 0;
+
+ if (s) {
+ int argc;
+ char *argv[10];
+ int i;
+
+ argc = switch_separate_string(s, '|', argv, (sizeof(argv) / sizeof(argv[0])));
+
+ for (i = 0; i < argc; i++) {
+ if (!strcasecmp(argv[i], "DEFAULT")) {
+ res |= VPX_ERROR_RESILIENT_DEFAULT;
+ } else if (!strcasecmp(argv[i], "PARTITIONS")) {
+ res |= VPX_ERROR_RESILIENT_PARTITIONS;
+ }
+ }
+
+ free(s);
+ enc_cfg->g_error_resilient = res;
+ }
+ } else if (!strcmp(name, "g-pass")) {
+ int pass = 0;
+
+ if (!strcasecmp(value, "ONE_PASS")) {
+ pass = VPX_RC_ONE_PASS;
+ } else if (!strcasecmp(value, "FIRST_PASS")) {
+ pass = VPX_RC_FIRST_PASS;
+ } else if (!strcasecmp(value, "LAST_PASS")) {
+ pass = VPX_RC_FIRST_PASS;
+ }
+
+ enc_cfg->g_pass = pass;
+ } else if (!strcmp(name, "g-lag-in-frames")) {
+ enc_cfg->g_lag_in_frames = UINTVAL(val);
+ } else if (!strcmp(name, "rc_dropframe_thresh")) {
+ enc_cfg->rc_dropframe_thresh = UINTVAL(val);
+ } else if (!strcmp(name, "rc-resize-allowed")) {
+ enc_cfg->rc_resize_allowed = UINTVAL(val);
+ } else if (!strcmp(name, "rc-scaled-width")) {
+ enc_cfg->rc_scaled_width = UINTVAL(val);
+ } else if (!strcmp(name, "rc-scaled-height")) {
+ enc_cfg->rc_scaled_height = UINTVAL(val);
+ } else if (!strcmp(name, "rc-resize-up-thresh")) {
+ enc_cfg->rc_resize_up_thresh = UINTVAL(val);
+ } else if (!strcmp(name, "rc-resize-down-thresh")) {
+ enc_cfg->rc_resize_down_thresh = UINTVAL(val);
+ } else if (!strcmp(name, "rc-end-usage")) {
+ int mode = 0;
+
+ if (!strcasecmp(value, "VBR")) {
+ mode = VPX_VBR;
+ } else if (!strcasecmp(value, "CBR")) {
+ mode = VPX_CBR;
+ } else if (!strcasecmp(value, "CQ")) {
+ mode = VPX_CQ;
+ } else if (!strcasecmp(value, "Q")) {
+ mode = VPX_Q;
+ }
+ enc_cfg->rc_end_usage = mode;
+ } else if (!strcmp(name, "rc-target-bitrate")) {
+ int br = switch_parse_bandwidth_string(value);
+
+ if (br > 0) {
+ enc_cfg->rc_target_bitrate = br;
+ }
+ } else if (!strcmp(name, "rc-min-quantizer")) {
+ enc_cfg->rc_min_quantizer = UINTVAL(val);
+ } else if (!strcmp(name, "rc-max-quantizer")) {
+ enc_cfg->rc_max_quantizer = UINTVAL(val);
+ } else if (!strcmp(name, "rc-undershoot-pct")) {
+ enc_cfg->rc_undershoot_pct = UINTVAL(val);
+ } else if (!strcmp(name, "rc-overshoot-pct")) {
+ enc_cfg->rc_overshoot_pct = UINTVAL(val);
+ } else if (!strcmp(name, "rc-buf-sz")) {
+ enc_cfg->rc_buf_sz = UINTVAL(val);
+ } else if (!strcmp(name, "rc-buf-initial-sz")) {
+ enc_cfg->rc_buf_initial_sz = UINTVAL(val);
+ } else if (!strcmp(name, "rc-buf-optimal-sz")) {
+ enc_cfg->rc_buf_optimal_sz = UINTVAL(val);
+ } else if (!strcmp(name, "rc-2pass-vbr-bias-pct")) {
+ enc_cfg->rc_2pass_vbr_bias_pct = UINTVAL(val);
+ } else if (!strcmp(name, "rc-2pass-vbr-minsection-pct")) {
+ enc_cfg->rc_2pass_vbr_minsection_pct = UINTVAL(val);
+ } else if (!strcmp(name, "rc-2pass-vbr-maxsection-pct")) {
+ enc_cfg->rc_2pass_vbr_maxsection_pct = UINTVAL(val);
+ } else if (!strcmp(name, "kf-mode")) {
+ int mode = 0;
+
+ if (!strcasecmp(value, "AUTO")) {
+ mode = VPX_KF_AUTO;
+ } else if (!strcasecmp(value, "DISABLED")) {
+ mode = VPX_KF_DISABLED;
+ }
+
+ enc_cfg->kf_mode = mode;
+ } else if (!strcmp(name, "kf-min-dist")) {
+ enc_cfg->kf_min_dist = UINTVAL(val);
+ } else if (!strcmp(name, "kf-max-dist")) {
+ enc_cfg->kf_max_dist = UINTVAL(val);
+ } else if (!strcmp(name, "ss-number-layers")) {
+ enc_cfg->ss_number_layers = UINTVAL(val);
+ } else if (!strcmp(name, "ts-number-layers")) {
+ enc_cfg->ts_number_layers = UINTVAL(val);
+ } else if (!strcmp(name, "ts-periodicity")) {
+ enc_cfg->ts_periodicity = UINTVAL(val);
+ } else if (!strcmp(name, "temporal-layering-mode")) {
+ enc_cfg->temporal_layering_mode = UINTVAL(val);
+ } else if (!strcmp(name, "lossless")) {
+ my_cfg->lossless = UINTVAL(val);
+ } else if (!strcmp(name, "cpuused")) {
+ if (my_cfg == &vpx_globals.vp8) {
+ if (val < -16) val = -16;
+ if (val > 16) val = 16;
+ } else if (my_cfg == &vpx_globals.vp9) {
+ if (val < -8) val = -8;
+ if (val > 8) val = 8;
+ }
+
+ my_cfg->cpuused = val;
+ } else if (!strcmp(name, "token-parts")) {
+ my_cfg->token_parts = switch_parse_cpu_string(value);
+ } else if (!strcmp(name, "static-thresh")) {
+ my_cfg->static_thresh = UINTVAL(val);
+ } else if (!strcmp(name, "noise-sensitivity")) {
+ my_cfg->noise_sensitivity = UINTVAL(val);
+ } else if (!strcmp(name, "losmax-intra-bitrate-pct")) {
+ my_cfg->max_intra_bitrate_pct = UINTVAL(val);
+ } else if (!strcmp(name, "tune-content")) {
+ uint32_t tune = VP9E_CONTENT_DEFAULT;
+
+ if (!strcasecmp(value, "SCREEN")) {
+ tune = VP9E_CONTENT_SCREEN;
+ }
+
+ my_cfg->tune_content = tune;
+ }
+ } // for param
+ } // for profile
+ } // profiles
+
+ switch_xml_free(xml);
+ } // xml
+
+ if (vpx_globals.max_bitrate <= 0) {
+ vpx_globals.max_bitrate = switch_calc_bitrate(1920, 1080, 5, 60);
+ }
+
+ if (vpx_globals.rtp_slice_size < 500 || vpx_globals.rtp_slice_size > 1500) {
+ vpx_globals.rtp_slice_size = SLICE_SIZE;
+ }
+
+ if (vpx_globals.key_frame_min_freq < 10000 || vpx_globals.key_frame_min_freq > 3 * 1000000) {
+ vpx_globals.key_frame_min_freq = KEY_FRAME_MIN_FREQ;
+ }
+
+ if (!vpx_globals.vp8.enc_cfg.g_threads) vpx_globals.vp8.enc_cfg.g_threads = 1;
+ if (!vpx_globals.vp8.dec_cfg.threads) vpx_globals.vp8.dec_cfg.threads = switch_parse_cpu_string("cpu/2/4");
+ if (!vpx_globals.vp9.enc_cfg.g_threads) vpx_globals.vp9.enc_cfg.g_threads = vpx_globals.vp8.enc_cfg.g_threads;
+ if (!vpx_globals.vp9.dec_cfg.threads) vpx_globals.vp9.dec_cfg.threads = vpx_globals.vp8.dec_cfg.threads;
+ if (!vpx_globals.vp10.enc_cfg.g_threads) vpx_globals.vp10.enc_cfg.g_threads = vpx_globals.vp8.enc_cfg.g_threads;
+ if (!vpx_globals.vp10.dec_cfg.threads) vpx_globals.vp10.dec_cfg.threads = vpx_globals.vp8.dec_cfg.threads;
+}
+
+#define VPX_API_SYNTAX ">"
+SWITCH_STANDARD_API(vpx_api_function)
+{
+ if (session) {
+ return SWITCH_STATUS_FALSE;
+ }
+
+ if (zstr(cmd)) {
+ goto usage;
+ }
+
+ if (!strcasecmp(cmd, "reload")) {
+ const char *err;
+
+ switch_xml_reload(&err);
+ stream->write_function(stream, "Reload XML [%s]\n", err);
+
+ load_config();
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "rtp-slice-size", vpx_globals.rtp_slice_size);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "key-frame-min-freq", vpx_globals.key_frame_min_freq);
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp8-dec-threads", vpx_globals.vp8.dec_cfg.threads);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp9-dec-threads", vpx_globals.vp9.dec_cfg.threads);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp10-dec-threads", vpx_globals.vp10.dec_cfg.threads);
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: %s\n", vpx_codec_iface_name(vpx_codec_vp8_cx()));
+ show_config(&vpx_globals.vp8);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: %s\n", vpx_codec_iface_name(vpx_codec_vp9_cx()));
+ show_config(&vpx_globals.vp9);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: VP10\n");
+ show_config(&vpx_globals.vp10);
+
+ stream->write_function(stream, "+OK\n");
+ } else if (!strcasecmp(cmd, "debug")) {
+ stream->write_function(stream, "+OK debug %s\n", vpx_globals.debug ? "on" : "off");
+ } else if (!strcasecmp(cmd, "debug on")) {
+ vpx_globals.debug = 1;
+ stream->write_function(stream, "+OK debug on\n");
+ } else if (!strcasecmp(cmd, "debug off")) {
+ vpx_globals.debug = 0;
+ stream->write_function(stream, "+OK debug off\n");
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+
+ usage:
+ stream->write_function(stream, "USAGE: %s\n", VPX_API_SYNTAX);
+ return SWITCH_STATUS_SUCCESS;
+}
+
SWITCH_MODULE_LOAD_FUNCTION(mod_vpx_load)
{
switch_codec_interface_t *codec_interface;
+ switch_api_interface_t *vpx_api_interface;
+
+ memset(&vpx_globals, 0, sizeof(struct vpx_globals));
+ load_config();
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
SWITCH_ADD_CODEC(codec_interface, "VP8 Video");
switch_core_codec_add_video_implementation(pool, codec_interface, 99, "VP8", NULL,
switch_vpx_init, switch_vpx_encode, switch_vpx_decode, switch_vpx_control, switch_vpx_destroy);
@@ -1399,6 +1729,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_vpx_load)
switch_core_codec_add_video_implementation(pool, codec_interface, 99, "VP9", NULL,
switch_vpx_init, switch_vpx_encode, switch_vpx_decode, switch_vpx_control, switch_vpx_destroy);
+ SWITCH_ADD_API(vpx_api_interface, "vpx",
+ "VPX API", vpx_api_function, VPX_API_SYNTAX);
+
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;
}
diff --git a/w32/apr.vsprops b/w32/apr.vsprops
deleted file mode 100644
index bfaa0c7f05..0000000000
--- a/w32/apr.vsprops
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/w32/module_debug.vsprops b/w32/module_debug.vsprops
deleted file mode 100644
index cd30c6df81..0000000000
--- a/w32/module_debug.vsprops
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
diff --git a/w32/module_release.vsprops b/w32/module_release.vsprops
deleted file mode 100644
index 37bd11c4a1..0000000000
--- a/w32/module_release.vsprops
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
diff --git a/w32/modules.vsprops b/w32/modules.vsprops
deleted file mode 100644
index b80640adce..0000000000
--- a/w32/modules.vsprops
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
diff --git a/w32/winlibs.vsprops b/w32/winlibs.vsprops
deleted file mode 100644
index 00ee4b0381..0000000000
--- a/w32/winlibs.vsprops
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/w32/xmlrpc.vsprops b/w32/xmlrpc.vsprops
deleted file mode 100644
index 580545ba3b..0000000000
--- a/w32/xmlrpc.vsprops
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-