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 @@ - .=======================================================================================================. -| ____ _ ____ | -| / ___| |_ _ ___ / ___|___ _ __ | -| | | | | | | |/ _ \ | / _ \| '_ \ | -| | |___| | |_| | __/ |__| (_) | | | | | -| \____|_|\__,_|\___|\____\___/|_| |_| | +| _ _ ____ _ ____ | +| / \ _ __ _ __ _ _ __ _| | / ___| |_ _ ___ / ___|___ _ __ | +| / _ \ | '_ \| '_ \| | | |/ _` | | | | | | | | |/ _ \ | / _ \| '_ \ | +| / ___ \| | | | | | | |_| | (_| | | | |___| | |_| | __/ |__| (_) | | | | | +| /_/ \_\_| |_|_| |_|\__,_|\__,_|_| \____|_|\__,_|\___|\____\___/|_| |_| | | | -| _____ _ _ ____ __ | -| |_ _|__| | ___ _ __ | |__ ___ _ __ _ _ / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ | -| | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ | -| | | __/ | __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ | -| |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, | \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| | -| |_| |___/ | -| _____ _ _ | -| | ____|_ _____ _ __ _ _ / \ _ _ __ _ _ _ ___| |_ | -| | _| \ \ / / _ \ '__| | | | / _ \| | | |/ _` | | | / __| __| | -| | |___ \ V / __/ | | |_| | / ___ \ |_| | (_| | |_| \__ \ |_ | -| |_____| \_/ \___|_| \__, | /_/ \_\__,_|\__, |\__,_|___/\__| | -| |___/ |___/ | -| ____ _ ____ | -| __ ____ ____ __ / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ | -| \ \ /\ / /\ \ /\ / /\ \ /\ / / | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ | -| \ V V / \ V V / \ V V / _ | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | | -| \_/\_/ \_/\_/ \_/\_/ (_) \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| | +| ____ _____ ____ ____ __ | +| | _ \_ _/ ___| / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ | +| | |_) || || | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ | +| | _ < | || |___ | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ | +| |_| \_\|_| \____| \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| | +| | +| ____ _ ____ | +| / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ | +| | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ | +| | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | | +| \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| | | | .=======================================================================================================. - - 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 @@ - - - - -