]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
apply changes from mod_h323-patch.diff by Peter Olsson.
authorroot <root@proxy-2.(none)>
Fri, 23 Jul 2010 08:25:48 +0000 (12:25 +0400)
committerroot <root@proxy-2.(none)>
Fri, 23 Jul 2010 08:25:48 +0000 (12:25 +0400)
src/mod/endpoints/mod_h323/Makefile
src/mod/endpoints/mod_h323/changes.txt
src/mod/endpoints/mod_h323/h323.conf.xml
src/mod/endpoints/mod_h323/mod_h323.cpp
src/mod/endpoints/mod_h323/mod_h323.h

index 8cb68189bb3b62ccf6d288bf1898abcb312e8099..8287b34cad32d66975711dc05710db0fab04c445 100644 (file)
@@ -1,5 +1,5 @@
 BASE=../../../..
-LOCAL_CFLAGS+=-g -ggdb  -I/usr/include/ptlib -I/usr/include/openh323  -I. -DPTRACING=1 -D_REENTRANT -fno-exceptions
+LOCAL_CFLAGS+=-g -ggdb  -I/usr/local/include/ptlib -I/usr/local/include/openh323  -I. -DPTRACING=1 -D_REENTRANT -fno-exceptions
 LOCAL_LDFLAGS= -lopenh323 -lpt -lrt 
 
 include $(BASE)/build/modmake.rules
index 0db6dfac077076793931ba9bd23e40990fdc0958..5bc4c1a03e3781e3588e95c851afc984d1dfc3ef 100644 (file)
@@ -1,3 +1,4 @@
+apply changes from mod_h323-patch.diff by Peter Olsson.
 some t.38 and lockinng improvements.
 replace ptrace with switch_log_printf.
 initial t.38 support.
index a176855ef693a3eddceafb084ace138d5304a43b..df2056767c1d4dd7bba8ab81e8b90ef5523e1d46 100644 (file)
@@ -4,6 +4,9 @@
     <param name="context" value="default"/>
     <param name="dialplan" value="XML"/>
     <param name="codec-prefs" value="PCMA,PCMU,GSM,G729"/>
+    <param name="use-rtp-timer" value="true"/> <!-- enable RTP timer - should always be enabled -->
+    <param name="rtp-timer-name" value="soft"/> <!-- Timer name, soft is default -->
+    <!-- <param name="ptime-override-value" value="20"/> --> <!-- Override negotiated ptime value with this value -->
     <param name="gk-address" value=""/>    <!-- empty to disable, "*" to search LAN -->
     <param name="gk-identifer" value=""/>  <!-- optional name of gk -->
     <param name="gk-interface" value=""/>  <!-- mandatory listener interface name -->
@@ -15,7 +18,6 @@
     <param name="progress-indication" value="8"/> <!-- optional - PI value in progress message-->
     <param name="alerting-indication" value="8"/> <!-- optional - PI value in alerting message-->
     <param name="endpoint-name" value="fs"/>
-    <param name="fax-old-asn" value="true"/>
   </settings>
   <listeners>
     <listener name="default">
index 4c194a9cf8b2402972f8a665f7254dddeb228d86..cfd84e93f297926cbb3618b24a64b0e9a5a583ee 100644 (file)
@@ -1,19 +1,40 @@
-/*
-       Version 0.0.50
+/* 
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2010, Anthony Minessale II <anthm@freeswitch.org>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthm@freeswitch.org>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ *
+ * mod_h323.cpp -- H323 endpoint
+ *
+ *     Version 0.0.55
 */
 
 #include "mod_h323.h"
 
-
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_string, mod_h323_globals.codec_string);
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_context, mod_h323_globals.context);
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, mod_h323_globals.dialplan);
+SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_rtp_timer_name, mod_h323_globals.rtp_timer_name);
 
 
-SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load);
-SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_h323_shutdown);
-SWITCH_MODULE_DEFINITION(mod_h323, mod_h323_load, mod_h323_shutdown, NULL);
-
 
 #define CF_NEED_FLUSH (1 << 1)
 struct mod_h323_globals mod_h323_globals = { 0 };
@@ -24,19 +45,19 @@ static switch_call_cause_t create_outgoing_channel(switch_core_session_t *sessio
 
 static const char modulename[] = "h323";
 static const char* h323_formats[] = {
-    "G.711-ALaw-64k", "PCMA",
-    "G.711-uLaw-64k", "PCMU",
-    "GSM-06.10", "GSM",
-    "G.723", "G723",
-    "G.729B", "G729b",
-    "G.729", "G729",
-    "G.729A", "G729a",
-    "G.729A/B", "G729ab",
-    "G.723.1", "G723.1",
-    "G.723.1(5.3k)", "G723.1-5k3",
-    "G.723.1A(5.3k)", "G723.1a-5k3",
-    "G.723.1A(6.3k)", "G723.1a-6k3",
-    0
+       "G.711-ALaw-64k", "PCMA",
+       "G.711-uLaw-64k", "PCMU",
+       "GSM-06.10", "GSM",
+       "G.723", "G723",
+       "G.729B", "G729b",
+       "G.729", "G729",
+       "G.729A", "G729a",
+       "G.729A/B", "G729ab",
+       "G.723.1", "G723.1",
+       "G.723.1(5.3k)", "G723.1-5k3",
+       "G.723.1A(5.3k)", "G723.1a-5k3",
+       "G.723.1A(6.3k)", "G723.1a-6k3",
+       0
 };
 
 static char encodingName_COR[7] = "t38";
@@ -84,72 +105,92 @@ static switch_status_t on_hangup(switch_core_session_t *session);
 static switch_status_t on_destroy(switch_core_session_t *session);
 
 static switch_io_routines_t h323fs_io_routines = {
-    /*.outgoing_channel */ create_outgoing_channel,
-    /*.read_frame */ FSH323Connection::read_audio_frame,
-    /*.write_frame */ FSH323Connection::write_audio_frame,
-    /*.kill_channel */ FSH323Connection::kill_channel,
-    /*.send_dtmf */ FSH323Connection::send_dtmf,
-    /*.receive_message */ FSH323Connection::receive_message,
-    /*.receive_event */ FSH323Connection::receive_event,
-    /*.state_change */ FSH323Connection::state_change,
-    /*.read_video_frame */ FSH323Connection::read_video_frame,
-    /*.write_video_frame */ FSH323Connection::write_video_frame
+       /*.outgoing_channel */ create_outgoing_channel,
+       /*.read_frame */ FSH323Connection::read_audio_frame,
+       /*.write_frame */ FSH323Connection::write_audio_frame,
+       /*.kill_channel */ FSH323Connection::kill_channel,
+       /*.send_dtmf */ FSH323Connection::send_dtmf,
+       /*.receive_message */ FSH323Connection::receive_message,
+       /*.receive_event */ FSH323Connection::receive_event,
+       /*.state_change */ FSH323Connection::state_change,
+       /*.read_video_frame */ FSH323Connection::read_video_frame,
+       /*.write_video_frame */ FSH323Connection::write_video_frame
 };
 
 static switch_state_handler_table_t h323fs_event_handlers = {
-    /*.on_init */ FSH323Connection::on_init,
-    /*.on_routing */ FSH323Connection::on_routing,
-    /*.on_execute */ FSH323Connection::on_execute,
-    /*.on_hangup */ on_hangup,
-    /*.on_exchange_media */ FSH323Connection::on_exchange_media,
-    /*.on_soft_execute */ FSH323Connection::on_soft_execute,
-    /*.on_consume_media*/ NULL,
-    /*.on_hibernate*/ NULL,
-    /*.on_reset*/ NULL,
-    /*.on_park*/ NULL,
-    /*.on_reporting*/ NULL,
-    /*.on_destroy*/ on_destroy
+       /*.on_init */ FSH323Connection::on_init,
+       /*.on_routing */ FSH323Connection::on_routing,
+       /*.on_execute */ FSH323Connection::on_execute,
+       /*.on_hangup */ on_hangup,
+       /*.on_exchange_media */ FSH323Connection::on_exchange_media,
+       /*.on_soft_execute */ FSH323Connection::on_soft_execute,
+       /*.on_consume_media*/ NULL,
+       /*.on_hibernate*/ NULL,
+       /*.on_reset*/ NULL,
+       /*.on_park*/ NULL,
+       /*.on_reporting*/ NULL,
+       /*.on_destroy*/ on_destroy
 };
 
-//static FSProcess *h323_process = NULL;
-SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load){
+SWITCH_BEGIN_EXTERN_C
+/*******************************************************************************/
+
+static switch_memory_pool_t *module_pool = NULL;
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_h323_shutdown);
+SWITCH_MODULE_DEFINITION(mod_h323, mod_h323_load, mod_h323_shutdown, NULL);
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Starting loading mod_h323\n");
-    *module_interface = switch_loadable_module_create_module_interface(pool, modname);
-                       
-    if (!*module_interface) {
-        return SWITCH_STATUS_MEMERR;
-    }
 
-    h323_process = new FSProcess();
-    if (h323_process == NULL) {
-        return SWITCH_STATUS_MEMERR;
-    }
+       *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+       if (!*module_interface) {
+               return SWITCH_STATUS_MEMERR;
+       }
+
+       module_pool = pool;
+
+       h323_process = new FSProcess();
 
-    if (h323_process->Initialise(*module_interface)) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "H323 mod initialized and running\n");
-        return SWITCH_STATUS_SUCCESS;
-    }
+       if (h323_process == NULL) {
+               return SWITCH_STATUS_MEMERR;
+       }
 
-    delete h323_process;
-    h323_process = NULL;
-    return SWITCH_STATUS_FALSE;
+       if (h323_process->Initialise(*module_interface)) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "H323 mod initialized and running\n");
+               return SWITCH_STATUS_SUCCESS;
+       }
+
+       delete h323_process;
+       h323_process = NULL;
+
+       return SWITCH_STATUS_FALSE;
 }
 
-SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_h323_shutdown){
-    
-    switch_safe_free(mod_h323_globals.context);
-    switch_safe_free(mod_h323_globals.dialplan);
-    switch_safe_free(mod_h323_globals.codec_string);
-    delete h323_process;
-    h323_process = NULL;
-    return SWITCH_STATUS_SUCCESS;
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_h323_shutdown)
+{
+       switch_safe_free(mod_h323_globals.context);
+       switch_safe_free(mod_h323_globals.dialplan);
+       switch_safe_free(mod_h323_globals.codec_string);
+
+       delete h323_process;
+       h323_process = NULL;
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
-void h_timer(unsigned sec){
+SWITCH_END_EXTERN_C
+/*******************************************************************************/
+
+void h_timer(unsigned sec)
+{
        timeval timeout;
        timeout.tv_sec = sec;
        timeout.tv_usec = 0; 
-       select(NULL, NULL, NULL, NULL, &timeout);
+       select(0, NULL, NULL, NULL, &timeout);
 }
 
 
@@ -265,8 +306,8 @@ class FSTrace : public ostream {
 
 #endif
 
-PString GetH245CodecName(const H323Capability* cap){
-       
+PString GetH245CodecName(const H323Capability* cap)
+{
        switch (cap->GetSubType()) {
                case H245_AudioCapability::e_g711Alaw64k:
                case H245_AudioCapability::e_g711Alaw56k:
@@ -297,43 +338,48 @@ PString GetH245CodecName(const H323Capability* cap){
 }
 
 FSProcess::FSProcess()
-  : PLibraryProcess("Test", "mod_h323", 1, 0, AlphaCode, 1)
-  , m_h323endpoint(NULL){
-  
+       : PProcess("FreeSWITCH", "mod_h323", 1, 0, AlphaCode, 1)
+       , m_h323endpoint(NULL)
+{
        PTrace::SetLevel(4);
-    PTrace::SetOptions(PTrace::TraceLevel);
-    PTrace::SetStream(new FSTrace);
+       PTrace::SetOptions(PTrace::TraceLevel);
+       PTrace::SetStream(new FSTrace);
 }
 
-FSProcess::~FSProcess(){
-  delete m_h323endpoint;
+FSProcess::~FSProcess()
+{
+       delete m_h323endpoint;
 }
 
-bool FSProcess::Initialise(switch_loadable_module_interface_t *iface){
-  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "======>FSProcess::Initialise [%p]\n", this);
+bool FSProcess::Initialise(switch_loadable_module_interface_t *iface)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "======>FSProcess::Initialise [%p]\n", this);
        
-  m_h323endpoint = new FSH323EndPoint();
-  return m_h323endpoint != NULL && m_h323endpoint->Initialise(iface);
+       m_h323endpoint = new FSH323EndPoint();
+       return m_h323endpoint != NULL && m_h323endpoint->Initialise(iface);
 }
 
-bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSManager::Initialise [%p]\n",this);
-    ReadConfig(false);
-
+bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSManager::Initialise [%p]\n", this);
+       ReadConfig(false);
 
+       /* Update tracing level for h323 */
+       PTrace::SetLevel(mod_h323_globals.trace_level);
+       PTrace::SetOptions(PTrace::TraceLevel);
 
-    m_freeswitch = (switch_endpoint_interface_t *) switch_loadable_module_create_interface(iface, SWITCH_ENDPOINT_INTERFACE);
-    m_freeswitch->interface_name = modulename;
-    m_freeswitch->io_routines = &h323fs_io_routines;
-    m_freeswitch->state_handler = &h323fs_event_handlers;
+       m_freeswitch = (switch_endpoint_interface_t *) switch_loadable_module_create_interface(iface, SWITCH_ENDPOINT_INTERFACE);
+       m_freeswitch->interface_name = modulename;
+       m_freeswitch->io_routines = &h323fs_io_routines;
+       m_freeswitch->state_handler = &h323fs_event_handlers;
                        
        PString codec = ((const char *)mod_h323_globals.codec_string);
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Config capabilliti %s \n",(const char *)codec);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Config capability %s \n", (const char *)codec);
 
        if (!codec.IsEmpty()) {         
                const char** f = h323_formats;
                for (; *f; f += 2) {                    
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Find capabilliti %s to %s\n",f[1],(const char *)codec);
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Find capability %s to %s\n",f[1], (const char *)codec);
                        if (codec.Find(f[1]) != P_MAX_INDEX) {
                                PString tmp = f[0];
                                tmp += "*{sw}";
@@ -356,96 +402,110 @@ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){
                        }               
                }
        }
-       if (m_fax_old_asn){
+
+       if (m_fax_old_asn) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "--->fax_old_asn\n");
                SetT38_IFP_PRE();
                SetCapability(0, 0, new FSH323_T38Capability(OpalT38_IFP_PRE));
-       }else{
+       } else {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "--->fax_asn\n");
                SetCapability(0, 0, new FSH323_T38Capability(OpalT38_IFP_COR));
        }
                
-    AddAllUserInputCapabilities(0,1);
+       AddAllUserInputCapabilities(0, 1);
        
-    DisableFastStart(!m_faststart);
-    DisableH245Tunneling(!m_h245tunneling);
-    DisableH245inSetup(!m_h245insetup);
-    DisableDetectInBandDTMF(!m_dtmfinband);
-    SetLocalUserName(m_endpointname);
+       DisableFastStart(!m_faststart);
+       DisableH245Tunneling(!m_h245tunneling);
+       DisableH245inSetup(!m_h245insetup);
+       DisableDetectInBandDTMF(!m_dtmfinband);
+       if (!m_endpointname.IsEmpty())
+               SetLocalUserName(m_endpointname);
         
-    if (m_listeners.empty()) {
-        StartListener("");
-    } else {
-        for (std::list < FSListener >::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) {
-            if (!StartListener(it->listenAddress)) {
-                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Cannot start listener for %s\n", (const char*)(it->name));
-            }
-        }
-    }
+       if (m_listeners.empty()) {
+               StartListener("");
+       } else {
+               for (std::list < FSListener >::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) {
+                       if (!StartListener(it->listenAddress)) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Cannot start listener for %s\n", (const char*)(it->name));
+                       }
+               }
+       }
 
-    if (!m_gkAddress.IsEmpty() && !m_gkIdentifer.IsEmpty() && !m_gkInterface.IsEmpty()) {
+       if (!m_gkAddress.IsEmpty() && !m_gkIdentifer.IsEmpty() && !m_gkInterface.IsEmpty()) {
                m_thread = new FSGkRegThread(this,&m_gkAddress,&m_gkIdentifer,&m_gkInterface,m_gkretry);
                m_thread->SetAutoDelete();
                m_thread->Resume();
-    }
+       }
        
-    return TRUE;
+       return TRUE;
 }
 
-switch_status_t FSH323EndPoint::ReadConfig(int reload){
+switch_status_t FSH323EndPoint::ReadConfig(int reload)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::ReadConfig [%p]\n",this);
-    const char *cf = "h323.conf";
-    switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+       const char *cf = "h323.conf";
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
 
        switch_memory_pool_t *pool = NULL;
-    if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
-        return status;
-    }
-
-    set_global_context("default");
-    set_global_dialplan("XML");
-
-    switch_event_t *params = NULL;
-    switch_event_create(&params, SWITCH_EVENT_REQUEST_PARAMS);
-    switch_assert(params);
-    switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "profile", switch_str_nil(""));
-    switch_xml_t cfg;
-    switch_xml_t xml = switch_xml_open_cfg(cf, &cfg, params);
-    if (xml == NULL) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
-        return SWITCH_STATUS_FALSE;
-    }
-
-    switch_xml_t xmlSettings = switch_xml_child(cfg, "settings");
+       
+       if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
+               return status;
+       }
+
+       set_global_context("default");
+       set_global_dialplan("XML");
+
+       switch_event_t *params = NULL;
+       switch_event_create(&params, SWITCH_EVENT_REQUEST_PARAMS);
+       switch_assert(params);
+       switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "profile", switch_str_nil(""));
+       switch_xml_t cfg;
+       switch_xml_t xml = switch_xml_open_cfg(cf, &cfg, params);
+
+       if (xml == NULL) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
+               return SWITCH_STATUS_FALSE;
+       }
+
+       switch_xml_t xmlSettings = switch_xml_child(cfg, "settings");
        m_pi = 8;
        m_ai = 0;
        m_endpointname = "FreeSwitch";
-    if (xmlSettings) {
-        for (switch_xml_t xmlParam = switch_xml_child(xmlSettings, "param"); xmlParam != NULL; xmlParam = xmlParam->next) {
-            const char *var = switch_xml_attr_soft(xmlParam, "name");
-            const char *val = switch_xml_attr_soft(xmlParam, "value");
-
-            if (!strcasecmp(var, "trace-level")) {
-                int level = atoi(val);
-                if (level > 0) {
-                    mod_h323_globals.trace_level = level;
-                }
-            } else if (!strcasecmp(var, "context")) {
-                set_global_context(val);
-            } else if (!strcasecmp(var, "dialplan")) {
-                set_global_dialplan(val);
-            } else if (!strcasecmp(var, "codec-prefs")) {
-                set_global_codec_string(val);
-            } else if (!strcasecmp(var, "jitter-size")) {
-                char * next;
-                unsigned minJitter = strtoul(val, &next, 10);
-                if (minJitter >= 10) {
-                    unsigned maxJitter = minJitter;
-                    if (*next == ',')
-                      maxJitter = atoi(next+1);
-                    SetAudioJitterDelay(minJitter, maxJitter); // In milliseconds
-                } else{
+       mod_h323_globals.ptime_override_value = -1;
+
+       if (xmlSettings) {
+               for (switch_xml_t xmlParam = switch_xml_child(xmlSettings, "param"); xmlParam != NULL; xmlParam = xmlParam->next) {
+                       const char *var = switch_xml_attr_soft(xmlParam, "name");
+                       const char *val = switch_xml_attr_soft(xmlParam, "value");
+
+                       if (!strcasecmp(var, "trace-level")) {
+                               int level = atoi(val);
+                               if (level > 0) {
+                                       mod_h323_globals.trace_level = level;
+                               }
+                       } else if (!strcasecmp(var, "context")) {
+                               set_global_context(val);
+                       } else if (!strcasecmp(var, "dialplan")) {
+                               set_global_dialplan(val);
+                       } else if (!strcasecmp(var, "codec-prefs")) {
+                               set_global_codec_string(val);
+                       } else if (!strcasecmp(var, "use-rtp-timer")) {
+                               mod_h323_globals.use_rtp_timer = switch_true(val);
+                       } else if (!strcasecmp(var, "rtp-timer-name")) {
+                               set_global_rtp_timer_name(val);
+                       } else if (!strcasecmp(var, "ptime-override-value")) {
+                               mod_h323_globals.ptime_override_value = atoi(val);
+                       } else if (!strcasecmp(var, "jitter-size")) {
+                               char * next;
+                               unsigned minJitter = strtoul(val, &next, 10);
+                               if (minJitter >= 10) {
+                                       unsigned maxJitter = minJitter;
+                                       if (*next == ',')
+                                               maxJitter = atoi(next+1);
+                                       SetAudioJitterDelay(minJitter, maxJitter); // In milliseconds
+                               } else {
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set zero Jitter buffer\n");
                                        SetAudioJitterDelay(0, 0);
                                }
@@ -457,15 +517,15 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
                                m_h245insetup = switch_true(val);
                        } else if (!strcasecmp(var, "dtmfinband")) {
                                m_dtmfinband = switch_true(val);
-            } else if (!strcasecmp(var, "gk-address")) {
-                m_gkAddress = val;
-            } else if (!strcasecmp(var, "gk-identifer")) {
-                m_gkIdentifer = val;
-            } else if (!strcasecmp(var, "endpoint-name")) {
-                m_endpointname = val;
-            } else if (!strcasecmp(var, "gk-interface")) {
-                m_gkInterface = val;
-            } else if (!strcasecmp(var, "gk-prefix")) {
+                       } else if (!strcasecmp(var, "gk-address")) {
+                               m_gkAddress = val;
+                       } else if (!strcasecmp(var, "gk-identifer")) {
+                               m_gkIdentifer = val;
+                       } else if (!strcasecmp(var, "endpoint-name")) {
+                               m_endpointname = val;
+                       } else if (!strcasecmp(var, "gk-interface")) {
+                               m_gkInterface = val;
+                       } else if (!strcasecmp(var, "gk-prefix")) {
                                m_gkPrefixes.AppendString(val);
                        } else if (!strcasecmp(var, "gk-retry")) {
                                m_gkretry = atoi(val);
@@ -476,44 +536,47 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
                        } else if (!strcasecmp(var, "fax-old-asn")) {
                                m_fax_old_asn = switch_true(val);
                        }                       
-        }
-    }
+               }
+       }
 
-    switch_xml_t xmlListeners = switch_xml_child(cfg, "listeners");
-    if (xmlListeners != NULL) {
-        for (switch_xml_t xmlListener = switch_xml_child(xmlListeners, "listener"); xmlListener != NULL; xmlListener = xmlListener->next) {
+       switch_xml_t xmlListeners = switch_xml_child(cfg, "listeners");
+       if (xmlListeners != NULL) {
+               for (switch_xml_t xmlListener = switch_xml_child(xmlListeners, "listener"); xmlListener != NULL; xmlListener = xmlListener->next) {
 
-            m_listeners.push_back(FSListener());
-            FSListener & listener = m_listeners.back();
+                       m_listeners.push_back(FSListener());
+                       FSListener & listener = m_listeners.back();
 
-            listener.name = switch_xml_attr_soft(xmlListener, "name");
-            if (listener.name.IsEmpty())
-                listener.name = "unnamed";
+                       listener.name = switch_xml_attr_soft(xmlListener, "name");
+                       if (listener.name.IsEmpty())
+                               listener.name = "unnamed";
 
-            PIPSocket::Address ip;
-            WORD port = 1720;
+                       PIPSocket::Address ip;
+                       WORD port = 1720;
 
-            for (switch_xml_t xmlParam = switch_xml_child(xmlListener, "param"); xmlParam != NULL; xmlParam = xmlParam->next) {
-                const char *var = switch_xml_attr_soft(xmlParam, "name");
-                const char *val = switch_xml_attr_soft(xmlParam, "value");
+                       for (switch_xml_t xmlParam = switch_xml_child(xmlListener, "param"); xmlParam != NULL; xmlParam = xmlParam->next) {
+                               const char *var = switch_xml_attr_soft(xmlParam, "name");
+                               const char *val = switch_xml_attr_soft(xmlParam, "value");
 
-                if (!strcasecmp(var, "h323-ip"))
-                    ip = val;
-                else if (!strcasecmp(var, "h323-port"))
-                    port = (WORD) atoi(val);
-            }
+                               if (!strcasecmp(var, "h323-ip"))
+                                       ip = val;
+                               else if (!strcasecmp(var, "h323-port"))
+                                       port = (WORD) atoi(val);
+                       }
 
-            listener.listenAddress = new H323ListenerTCP(*this,ip,port);
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created Listener '%s'\n", (const char *) listener.name);
-        }
-    }
+                       listener.listenAddress = new H323ListenerTCP(*this, ip, port);
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created Listener '%s'\n", (const char *) listener.name);
+               }
+       }
+
+       switch_event_destroy(&params);
 
-    switch_event_destroy(&params);
+       if (xml)
+               switch_xml_free(xml);
 
-    if (xml)
-        switch_xml_free(xml);
+       if (mod_h323_globals.use_rtp_timer && !mod_h323_globals.rtp_timer_name)
+               set_global_rtp_timer_name("soft");
 
-    return status;
+       return status;
 }
 
 FSH323EndPoint::FSH323EndPoint()
@@ -528,42 +591,45 @@ FSH323EndPoint::FSH323EndPoint()
        terminalType = e_GatewayOnly;
 }      
 
-FSH323EndPoint::~FSH323EndPoint(){
+FSH323EndPoint::~FSH323EndPoint()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::~FSH323EndPoint [%p]\n",this);
        StopGkClient();
-       ClearAllCalls(H323Connection::EndedByLocalUser,false);
+       ClearAllCalls(H323Connection::EndedByLocalUser, false);
 }
 
 H323Connection  *FSH323EndPoint::CreateConnection(
        unsigned callReference,
        void* userData,
        H323Transport* transport,
-       H323SignalPDU* setupPDU){
+       H323SignalPDU* setupPDU)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::CreateConnection callReference = %u  userDate = %p [%p]\n",callReference,userData,this);
 
-       if ((switch_caller_profile_t *)userData){
+       if ((switch_caller_profile_t *)userData) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------> SWITCH_CALL_DIRECTION_OUTBOUND\n");
-       } else{
+       } else {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------> SWITCH_CALL_DIRECTION_INBOUND\n");
        }
        
-    switch_core_session_t *fsSession = switch_core_session_request(GetSwitchInterface(), 
-                                       (switch_caller_profile_t *)userData ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND, NULL);
-    if (fsSession == NULL)
-        return NULL;
+       switch_core_session_t *fsSession = switch_core_session_request(GetSwitchInterface(), 
+                               (switch_caller_profile_t *)userData ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND, NULL);
+       if (fsSession == NULL)
+               return NULL;
        
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------> fsSession = %p\n",fsSession);
-    switch_channel_t *fsChannel = switch_core_session_get_channel(fsSession);
+       switch_channel_t *fsChannel = switch_core_session_get_channel(fsSession);
 
        if (fsChannel == NULL) {
-        switch_core_session_destroy(&fsSession);
-        return NULL;
+               switch_core_session_destroy(&fsSession);
+               return NULL;
        }
        
-  return new FSH323Connection(*this,transport,callReference,(switch_caller_profile_t *)userData, fsSession, fsChannel);
+       return new FSH323Connection(*this, transport, callReference, (switch_caller_profile_t *)userData, fsSession, fsChannel);
 }
 
-bool FSH323EndPoint::OnSetGatewayPrefixes(PStringList & prefixes) const{
+bool FSH323EndPoint::OnSetGatewayPrefixes(PStringList & prefixes) const
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::OnSetGatewayPrefixes [%p]\n",this);
        if(m_gkPrefixes.GetSize() > 0) {
 //             PTRACE(4, "mod_h323\tOnSetGatewayPrefixes " << m_gkPrefixes);
@@ -573,16 +639,18 @@ bool FSH323EndPoint::OnSetGatewayPrefixes(PStringList & prefixes) const{
        return false;
 }
 
-void FSH323EndPoint::StartGkClient(int retry, PString* gkAddress,PString* gkIdentifer,PString* gkInterface){
+void FSH323EndPoint::StartGkClient(int retry, PString* gkAddress,PString* gkIdentifer,PString* gkInterface)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::StartGkClient [%p]\n",this);
-       while(!UseGatekeeper(m_gkAddress, m_gkIdentifer, m_gkInterface) && retry > 0 ){
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
-                          "Could not start gatekeeper: gw name=\"%s\", addr=\"%s\", id=\"%s\", if=\"%s\"\n",
-                                                 (const char *)m_endpointname,
-                          (const char *)m_gkAddress,
-                          (const char *)m_gkIdentifer,
-                          (const char *)m_gkInterface);
-                                       if (m_stop_gk) {
+
+       while (!UseGatekeeper(m_gkAddress, m_gkIdentifer, m_gkInterface) && retry > 0) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
+                       "Could not start gatekeeper: gw name=\"%s\", addr=\"%s\", id=\"%s\", if=\"%s\"\n",
+                       (const char *)m_endpointname,
+                       (const char *)m_gkAddress,
+                       (const char *)m_gkIdentifer,
+                       (const char *)m_gkInterface);
+               if (m_stop_gk) {
                        m_stop_gk = false;
                        return;
                }               
@@ -594,15 +662,18 @@ void FSH323EndPoint::StartGkClient(int retry, PString* gkAddress,PString* gkIden
                }
                RemoveGatekeeper();
        }
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Started gatekeeper: %s\n",
                                                        (const char *)GetGatekeeper()->GetName());      
        m_thread = NULL;
 }
 
-void FSH323EndPoint::StopGkClient(){
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::StopGkClient [%p]\n",this);
+void FSH323EndPoint::StopGkClient()
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::StopGkClient [%p]\n", this);
+
        if (m_thread) {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stop gatekeeper thread\n");             
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stop gatekeeper thread\n");
                m_stop_gk = true;
                
                while (m_stop_gk){
@@ -611,83 +682,88 @@ void FSH323EndPoint::StopGkClient(){
                }
                RemoveGatekeeper();
                m_thread = NULL;
-    }
+       }
 }
 
-
 FSH323Connection::FSH323Connection(FSH323EndPoint& endpoint, H323Transport* transport, unsigned callReference,  switch_caller_profile_t *outbound_profile, switch_core_session_t *fsSession, switch_channel_t *fsChannel)
        : H323Connection(endpoint,callReference)
        , m_endpoint(&endpoint)
        , m_fsSession(fsSession)
-    , m_fsChannel(fsChannel)
+       , m_fsChannel(fsChannel)
        , m_callOnPreAnswer(false)
        , m_startRTP(false)
-       , m_rxChennel(false)
-       , m_txChennel(false)
-       , m_ChennelAnswer(false)
-       , m_ChennelProgress(false)
+       , m_rxChannel(false)
+       , m_txChannel(false)
+       , m_ChannelAnswer(false)
+       , m_ChannelProgress(false)
        , m_select_dtmf(0)
        , m_active_sessionID(0)
-       , m_active_chennel_fax(false)
+       , m_active_channel_fax(false)
        , m_rtp_resetting(0)
        , m_isRequst_fax(false)
-       , m_channel_hangup(false){
+       , m_channel_hangup(false)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::FSH323Connection [%p]\n",this);
 
-    h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_alloc(m_fsSession, sizeof(*tech_pvt));
-    tech_pvt->me = this;
-    switch_core_session_set_private(m_fsSession, tech_pvt);
+       h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_alloc(m_fsSession, sizeof(*tech_pvt));
+       tech_pvt->me = this;
+       switch_core_session_set_private(m_fsSession, tech_pvt);
        
        switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(m_fsSession));
        switch_mutex_init(&tech_pvt->h323_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(m_fsSession));
        switch_mutex_init(&tech_pvt->h323_io_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(m_fsSession));
        
-    if (outbound_profile != NULL) {
-        SetLocalPartyName(outbound_profile->caller_id_number);
-        SetDisplayName(outbound_profile->caller_id_name);
+       if (outbound_profile != NULL) {
+               SetLocalPartyName(outbound_profile->caller_id_number);
+               SetDisplayName(outbound_profile->caller_id_name);
 
-        switch_caller_profile_t *caller_profile = switch_caller_profile_clone(m_fsSession, outbound_profile);
-        switch_channel_set_caller_profile(m_fsChannel, caller_profile);
+               switch_caller_profile_t *caller_profile = switch_caller_profile_clone(m_fsSession, outbound_profile);
+               switch_channel_set_caller_profile(m_fsChannel, caller_profile);
 
-        PString name = "h323/";
-        name += outbound_profile->destination_number;
-        switch_channel_set_name(m_fsChannel, name);
+               PString name = "h323/";
+               name += outbound_profile->destination_number;
+               switch_channel_set_name(m_fsChannel, name);
 
-        switch_channel_set_flag(m_fsChannel, CF_OUTBOUND);
-        switch_channel_set_state(m_fsChannel, CS_INIT);
-    }
+               switch_channel_set_flag(m_fsChannel, CF_OUTBOUND);
+               switch_channel_set_state(m_fsChannel, CS_INIT);
+       }
        
        m_RTPlocalPort = switch_rtp_request_port((const char *)m_RTPlocalIP.AsString());
 }      
 
-FSH323Connection::~FSH323Connection(){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::~FSH323Connection  [%p]\n",this);
+FSH323Connection::~FSH323Connection()
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::~FSH323Connection  [%p]\n",this);
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
        if ((m_rtp_resetting == 1)) {
-                       switch_core_session_unlock_codec_read(m_fsSession);
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
-                       switch_core_session_unlock_codec_write(m_fsSession);
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_write [%p]\n",m_fsSession);
+               switch_core_session_unlock_codec_read(m_fsSession);
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
+               switch_core_session_unlock_codec_write(m_fsSession);
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_write [%p]\n",m_fsSession);
        }
-    tech_pvt->me = NULL;       
+       tech_pvt->me = NULL;
 //     switch_mutex_unlock(tech_pvt->h323_mutex);
 //     switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
 }      
 
-void FSH323Connection::OnSetLocalCapabilities(){
+void FSH323Connection::OnSetLocalCapabilities()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnSetLocalCapabilities() [%p]\n",this);
        H323Connection::OnSetLocalCapabilities();
        SetLocalCapabilities();
 }
 
-bool FSH323Connection::SetLocalCapabilities(){
+bool FSH323Connection::SetLocalCapabilities()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::SetLocalCapabilities() Size local capability = %d [%p]\n",localCapabilities.GetSize(),this);
-    if (!mod_h323_globals.codec_string)
+
+       if (!mod_h323_globals.codec_string)
                return false;
     
-    bool nocodecs = true;
-    bool changed = false;
-    for (int i = 0; i < localCapabilities.GetSize(); i++) {
+       bool nocodecs = true;
+       bool changed = false;
+
+       for (int i = 0; i < localCapabilities.GetSize(); i++) {
                const char* format = 0;
                PString fname;
                decodeCapability(localCapabilities[i],&format,0,&fname);
@@ -704,39 +780,45 @@ bool FSH323Connection::SetLocalCapabilities(){
                                }
                                localCapabilities.Remove(fname);
                                i--;
-                       } else  nocodecs = false;
+                       } else
+                               nocodecs = false;
                }
-    }
-    if (nocodecs) {
+       }
+
+       if (nocodecs) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No codecs remaining for H323 connection [%p]\n",this);
                changed = false;
                ClearCall(EndedByCapabilityExchange);           
-    }
-    return changed;
+       }
+
+       return changed;
 }
 
-bool FSH323Connection::decodeCapability(const H323Capability& capability, const char** dataFormat, int* payload, PString* capabName){
+bool FSH323Connection::decodeCapability(const H323Capability& capability, const char** dataFormat, int* payload, PString* capabName)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::decodeCapability [%p]\n",this);
-    PString fname((const char *)capability.GetFormatName());
+
+       PString fname((const char *)capability.GetFormatName());
   
-    if (fname.Find("{sw}") == (fname.GetLength() - 4))
+       if (fname.Find("{sw}") == (fname.GetLength() - 4))
                fname = fname.Mid(0,fname.GetLength()-4);
-    if (fname.Find("{hw}") == (fname.GetLength() - 4))
+       if (fname.Find("{hw}") == (fname.GetLength() - 4))
                fname = fname.Mid(0,fname.GetLength()-4);
                
-    OpalMediaFormat oformat(fname, false);
-    int pload = oformat.GetPayloadType();
-    const char *format = 0;
-    const char** f = h323_formats;
-    for (; *f; f += 2) {
+       OpalMediaFormat oformat(fname, false);
+       int pload = oformat.GetPayloadType();
+       const char *format = 0;
+       const char** f = h323_formats;
+
+       for (; *f; f += 2) {
                if (fname.Find(*f) == 0) {
                        format = f[1];
                        break;
                }
-    }
+       }
     
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"capability '%s' format '%s' %d",(const char*)fname,format,pload);
-    if (format) {
+       if (format) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"capability '%s' format '%s' %d",(const char*)fname,format,pload);
                if (capabName)
                        *capabName = fname;
                if (dataFormat)
@@ -744,46 +826,51 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const
                if (payload)
                        *payload = pload;
                return true;
-    }
-    return false;
+       }
+
+       return false;
 }
 
 H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString &caller,
-    const H323SignalPDU &setupPDU, H323SignalPDU &connectPDU){
+    const H323SignalPDU &setupPDU, H323SignalPDU &connectPDU)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnAnswerCall caller = %s [%p]\n",(const char*)caller,this);
        
        if (m_fsSession == NULL) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Session request failed.\n");
-        return H323Connection::AnswerCallDenied;
-    }
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Session request failed.\n");
+               return H323Connection::AnswerCallDenied;
+       }
 
-    switch_core_session_add_stream(m_fsSession, NULL);
+       switch_core_session_add_stream(m_fsSession, NULL);
 
-    switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
-    if (channel == NULL) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Session does not have a channel\n");
-        return H323Connection::AnswerCallDenied;
-    }
+       switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
+       if (channel == NULL) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Session does not have a channel\n");
+               return H323Connection::AnswerCallDenied;
+       }
 
        const Q931& q931 = setupPDU.GetQ931();
        const H225_Setup_UUIE& setup = setupPDU.m_h323_uu_pdu.m_h323_message_body;
-    const H225_ArrayOf_AliasAddress& address = setup.m_destinationAddress;
-    for (int i = 0; i<address.GetSize(); i++)
+       const H225_ArrayOf_AliasAddress& address = setup.m_destinationAddress;
+
+       for (int i = 0; i<address.GetSize(); i++)
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"address index = %d value = %s",i,(const char *)H323GetAliasAddressString(address[i]));
+
        PString called;
-    if (address.GetSize() > 0)
+
+       if (address.GetSize() > 0)
                called = (const char *)H323GetAliasAddressString(address[0]);
-    if (!called.IsEmpty())
+       if (!called.IsEmpty())
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"Called number or alias = %s\n",(const char*)called);
-    else {
+       else {
                PString callnam;
                if (q931.GetCalledPartyNumber(callnam)) {
                        called=(const char *)callnam;                   
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"Called-Party-Number = %s\n",(const char*)called);
                }
-    }
+       }
        
-    switch_caller_profile_t *caller_profile = switch_caller_profile_new(switch_core_session_get_pool(m_fsSession),
+       switch_caller_profile_t *caller_profile = switch_caller_profile_new(switch_core_session_get_pool(m_fsSession),
                                                                         NULL,
                                                                         /** username */
                                                                         mod_h323_globals.dialplan,
@@ -807,10 +894,11 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString
                                                                         called
                                                                         /** destination_number */
                                                                         );
-    if (caller_profile == NULL) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not create caller profile\n");
-        return H323Connection::AnswerCallDenied;
-    }
+       if (caller_profile == NULL) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not create caller profile\n");
+               return H323Connection::AnswerCallDenied;
+       }
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Created switch caller profile:\n"
                "  username               = %s\n"
                "  dialplan           = %s\n"
@@ -830,22 +918,23 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString
                ,caller_profile->destination_number);
 
 
-    switch_channel_set_caller_profile(channel, caller_profile);
+       switch_channel_set_caller_profile(channel, caller_profile);
 
-    char name[256] = "h323/";
-    switch_copy_string(name + 5, caller_profile->destination_number, sizeof(name)-5);
-    switch_channel_set_name(channel, name);
-    switch_channel_set_state(channel, CS_INIT);
+       char name[256] = "h323/";
+       switch_copy_string(name + 5, caller_profile->destination_number, sizeof(name)-5);
+       switch_channel_set_name(channel, name);
+       switch_channel_set_state(channel, CS_INIT);
 
-    if (switch_core_session_thread_launch(m_fsSession) != SWITCH_STATUS_SUCCESS) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not launch session thread\n");
-        return H323Connection::AnswerCallDenied;
-    }
+       if (switch_core_session_thread_launch(m_fsSession) != SWITCH_STATUS_SUCCESS) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not launch session thread\n");
+               return H323Connection::AnswerCallDenied;
+       }
 
        return H323Connection::AnswerCallDeferred;
 }
 
-H323Channel* FSH323Connection::CreateRealTimeLogicalChannel(const H323Capability& capability,H323Channel::Directions dir,unsigned sessionID,const H245_H2250LogicalChannelParameters* param, RTP_QOS * rtpqos){
+H323Channel* FSH323Connection::CreateRealTimeLogicalChannel(const H323Capability& capability,H323Channel::Directions dir,unsigned sessionID,const H245_H2250LogicalChannelParameters* param, RTP_QOS * rtpqos)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::CreateRealTimeLogicalChannel [%p]\n",this);
        
        H323TransportAddress m_h323transportadd = GetSignallingChannel()->GetLocalAddress();
@@ -854,19 +943,22 @@ H323Channel* FSH323Connection::CreateRealTimeLogicalChannel(const H323Capability
        return new FSH323_ExternalRTPChannel(*this, capability, dir, sessionID,m_RTPlocalIP,m_RTPlocalPort);
 }
 
-PBoolean FSH323Connection::OnStartLogicalChannel(H323Channel & channel){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnStartLogicalChannel chennel = %p [%p]\n",&channel,this);
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnStartLogicalChannel connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
+PBoolean FSH323Connection::OnStartLogicalChannel(H323Channel & channel)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnStartLogicalChannel chennel = %p [%p]\n",&channel,this);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnStartLogicalChannel connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
        return connectionState != ShuttingDownConnection;
 }
 
-PBoolean FSH323Connection::OnCreateLogicalChannel(const H323Capability& capability, H323Channel::Directions dir, unsigned& errorCode){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnCreateLogicalChannel ('%s',%s) [%p]\n",(const char *)capability.GetFormatName(),GetDirections[dir],this);
+PBoolean FSH323Connection::OnCreateLogicalChannel(const H323Capability& capability, H323Channel::Directions dir, unsigned& errorCode)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnCreateLogicalChannel ('%s',%s) [%p]\n",(const char *)capability.GetFormatName(),GetDirections[dir],this);
     
        return H323Connection::OnCreateLogicalChannel(capability,dir,errorCode);
 }
 
-void FSH323Connection::OnReceivedReleaseComplete(const H323SignalPDU & pdu){
+void FSH323Connection::OnReceivedReleaseComplete(const H323SignalPDU & pdu)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedReleaseComplete  value = %d\n",(switch_call_cause_t)pdu.GetQ931().GetCause());
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
        if ((tech_pvt->me != NULL) && (m_rtp_resetting == 1)) {
@@ -877,39 +969,44 @@ void FSH323Connection::OnReceivedReleaseComplete(const H323SignalPDU & pdu){
        }
        tech_pvt->me = NULL;
        switch_channel_hangup(switch_core_session_get_channel(m_fsSession),(switch_call_cause_t)pdu.GetQ931().GetCause()); 
+
        return H323Connection::OnReceivedReleaseComplete(pdu);
 }
 
 bool FSH323Connection::OnReceivedProgress(const H323SignalPDU &pdu)
 {
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedProgress [%p]\n",this);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedProgress [%p]\n", this);
        H323Connection::OnReceivedProgress(pdu);
-       if ((m_rxChennel && m_txChennel) || (m_ChennelProgress && m_rxChennel))
+       if ((m_rxChannel && m_txChannel) || (m_ChannelProgress && m_rxChannel))
                switch_channel_mark_pre_answered(m_fsChannel);
        else{
-               m_ChennelProgress = true;
+               m_ChannelProgress = true;
        }
        return true;
 }
 
-bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU){
-
+bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedSignalSetup [%p]\n",this);
-       if (!H323Connection::OnReceivedSignalSetup(setupPDU)) return false;
+
+       if (!H323Connection::OnReceivedSignalSetup(setupPDU))
+               return false;
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> after FSH323Connection::OnReceivedSignalSetup connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
        H323SignalPDU callProceedingPDU;
        H225_CallProceeding_UUIE & callProceeding = callProceedingPDU.BuildCallProceeding(*this);
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> after callProceedingPDU.BuildCallProceeding connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
        if (connectionState == ShuttingDownConnection){
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> connectionState = ShuttingDownConnection [%p]\n",this);
                return false; 
        }
-       
-       if (SendFastStartAcknowledge(callProceeding.m_fastStart)){
-                                       callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_fastStart);
+
+       if (SendFastStartAcknowledge(callProceeding.m_fastStart)) {
+               callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_fastStart);
        } else {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"SendFastStartAcknowledge = FALSE\n");
-               if (connectionState == ShuttingDownConnection){
+               if (connectionState == ShuttingDownConnection) {
                        return true;
                }
                earlyStart = TRUE;
@@ -921,36 +1018,41 @@ bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU){
                        controlChannel->SetUpTransportPDU(callProceeding.m_h245Address, TRUE);
                }
        }
-       if (connectionState == ShuttingDownConnection){
-                       return true;
-       }                               
-       
-       if (!WriteSignalPDU(callProceedingPDU)){
-        return false;
+       if (connectionState == ShuttingDownConnection) {
+               return true;
        }
+
+       if (!WriteSignalPDU(callProceedingPDU)) {
+               return false;
+       }
+
        return true;            
 }
 
-bool FSH323Connection::OnReceivedCallProceeding(const H323SignalPDU & pdu){
+bool FSH323Connection::OnReceivedCallProceeding(const H323SignalPDU & pdu)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnReceivedCallProceeding [%p]\n",this);
        unsigned pi;
 
-       
        if (!pdu.GetQ931().GetProgressIndicator(pi))
                pi = 0;
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----------->OnAlerting PI = %u",pi);
-       if (pi > 0){
-               if ((m_rxChennel && m_txChennel) || (m_ChennelProgress && m_rxChennel))
+       if (pi > 0) {
+               if ((m_rxChannel && m_txChannel) || (m_ChannelProgress && m_rxChannel))
                        switch_channel_mark_pre_answered(m_fsChannel);
-               else{
-                       m_ChennelProgress = true;
+               else {
+                       m_ChannelProgress = true;
                }
        }
+
        return H323Connection::OnReceivedCallProceeding(pdu);
 }
 
-bool FSH323Connection::OnSendCallProceeding(H323SignalPDU & callProceedingPDU){
+bool FSH323Connection::OnSendCallProceeding(H323SignalPDU & callProceedingPDU)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnSendCallProceeding fastStartState = %s [%p]\n",FastStartStateNames[fastStartState],this);    
+
        return false;
 //     return true;
 }
@@ -958,20 +1060,23 @@ bool FSH323Connection::OnSendCallProceeding(H323SignalPDU & callProceedingPDU){
 bool FSH323Connection::OnSendReleaseComplete(H323SignalPDU & pdu)
 {
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnSendReleaseComplete cause = %u\n",(switch_call_cause_t)pdu.GetQ931().GetCause());    
+
        switch_channel_hangup(m_fsChannel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);                      
        return H323Connection::OnSendReleaseComplete(pdu);
 }
 
-PBoolean FSH323Connection::OpenLogicalChannel(const H323Capability& capability, unsigned sessionID, H323Channel::Directions dir){
+PBoolean FSH323Connection::OpenLogicalChannel(const H323Capability& capability, unsigned sessionID, H323Channel::Directions dir)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OpenLogicalChannel ('%s', %d, %s) [%p]\n",(const char *)capability.GetFormatName(),sessionID,GetDirections[dir],this);
-    return H323Connection::OpenLogicalChannel(capability,sessionID,dir);
+
+       return H323Connection::OpenLogicalChannel(capability,sessionID,dir);
 }
 
 
 bool FSH323Connection::OnReceivedCapabilitySet(const H323Capabilities & remoteCaps,
                                                        const H245_MultiplexCapability * muxCap,
-                                                       H245_TerminalCapabilitySetReject & reject){
-       
+                                                       H245_TerminalCapabilitySetReject & reject)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedCapabilitySet [%p]\n",this);
        if (connectionState == ShuttingDownConnection)
                return false;
@@ -994,9 +1099,8 @@ bool FSH323Connection::OnReceivedCapabilitySet(const H323Capabilities & remoteCa
        return connectionState != ShuttingDownConnection;                                               
 }
 
-
-bool FSH323Connection::OnAlerting(const H323SignalPDU &alertingPDU, const PString &user){
-       
+bool FSH323Connection::OnAlerting(const H323SignalPDU &alertingPDU, const PString &user)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnAlerting user = %s [%p]\n",(const char *)user,this);
        unsigned pi;
        switch_status_t status = switch_channel_mark_ring_ready(m_fsChannel);
@@ -1005,18 +1109,18 @@ bool FSH323Connection::OnAlerting(const H323SignalPDU &alertingPDU, const PStrin
        if (!alertingPDU.GetQ931().GetProgressIndicator(pi))
                pi = 0;
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----------->OnAlerting PI = %u\n",pi);
-       if (pi > 0){
-               if ((m_rxChennel && m_txChennel) || (m_ChennelProgress && m_rxChennel))
+       if (pi > 0) {
+               if ((m_rxChannel && m_txChannel) || (m_ChannelProgress && m_rxChannel))
                        switch_channel_mark_pre_answered(m_fsChannel);
-               else{
-                       m_ChennelProgress = true;
+               else {
+                       m_ChannelProgress = true;
                }
        }
        return ( status == SWITCH_STATUS_SUCCESS);
 }
 
-void FSH323Connection::AnsweringCall(AnswerCallResponse response){
-
+void FSH323Connection::AnsweringCall(AnswerCallResponse response)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::AnsweringCall [%p]\n",this);
        
        switch (response) {
@@ -1029,7 +1133,7 @@ void FSH323Connection::AnsweringCall(AnswerCallResponse response){
                        if (!mediaWaitForConnect) {
                                // create a new facility PDU if doing AnswerDeferredWithMedia
                                H323SignalPDU want245PDU;
-                               H225_Progress_UUIE & prog = want245PDU.BuildProgress(*this);
+                               //H225_Progress_UUIE & prog = want245PDU.BuildProgress(*this);
                                PBoolean sendPDU = TRUE;
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"mediaWaitForConnect = FALSE\n");
 /*                             if (SendFastStartAcknowledge(prog.m_fastStart)){
@@ -1107,16 +1211,18 @@ void FSH323Connection::AnsweringCall(AnswerCallResponse response){
        } 
 }
 
-void FSH323Connection::OnEstablished(){
-
+void FSH323Connection::OnEstablished()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnEstablished [%p]\n",this);
        if(m_startRTP)          
                switch_channel_mark_answered(m_fsChannel);
-       else m_ChennelAnswer = true;
-       if (m_active_chennel_fax)
+       else
+               m_ChannelAnswer = true;
+
+       if (m_active_channel_fax)
                RequestModeChangeT38("T.38\nT.38");
        else 
-               m_active_chennel_fax = true;
+               m_active_channel_fax = true;
 }
 PBoolean FSH323Connection::OnRequestModeChange(const H245_RequestMode & pdu,
                                          H245_RequestModeAck & /*ack*/,
@@ -1138,7 +1244,8 @@ PBoolean FSH323Connection::OnRequestModeChange(const H245_RequestMode & pdu,
        return false;
 }
 
-void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
+void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnModeChanged [%p]\n",this);
        for (PINDEX i = 0; i < newMode.GetSize(); i++) {
                H323Capability * capability = localCapabilities.FindCapability(newMode[i]);
@@ -1150,7 +1257,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
                                if (type.m_application.GetTag() == H245_DataMode_application::e_t38fax){
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"ttype.m_application.GetTag() = H245_DataMode_application::e_t38fax\n");
                                        H245_DataMode_application_t38fax & fax = type.m_application;
-                                       H245_DataProtocolCapability & proto = fax.m_t38FaxProtocol; 
+                                       //H245_DataProtocolCapability & proto = fax.m_t38FaxProtocol;
                                        const H245_T38FaxProfile & profile = fax.m_t38FaxProfile;
                                        switch_t38_options_t* t38_options = (switch_t38_options_t*)switch_channel_get_private(m_fsChannel, "t38_options");
 
@@ -1160,7 +1267,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
                                        }
                                        t38_options->T38VendorInfo = "0 0 0";
                                        
-                                       t38_options->T38FaxVersion = profile.m_version;
+                                       t38_options->T38FaxVersion = (uint16_t)profile.m_version;
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38FaxVersion:%lu\n",(unsigned long)profile.m_version);
                                        t38_options->T38MaxBitRate = type.m_bitRate*100;
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38MaxBitRate:%d\n",t38_options->T38MaxBitRate);
@@ -1188,7 +1295,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
                                                t38_options->T38FaxUdpEC = "t38UDPRedundancy";
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38FaxUdpEC:%s\n",t38_options->T38FaxUdpEC);
                                        const char *uuid = switch_channel_get_variable(m_fsChannel, SWITCH_SIGNAL_BOND_VARIABLE); 
-                                       if (uuid != NULL){
+                                       if (uuid != NULL) {
                                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"uuid:%s\n",uuid);
                                                switch_channel_set_private(switch_core_session_get_channel(switch_core_session_locate(switch_channel_get_variable(m_fsChannel, SWITCH_SIGNAL_BOND_VARIABLE))), "t38_options", t38_options);
                                        
@@ -1215,41 +1322,49 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
        H323Connection::OnModeChanged(newMode);
 }
 
-bool FSH323Connection::OnSendSignalSetup(H323SignalPDU & setupPDU){
+bool FSH323Connection::OnSendSignalSetup(H323SignalPDU & setupPDU)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnSendSignalSetup [%p]\n",this);
        setupPDU.GetQ931().SetBearerCapabilities(Q931::TransferSpeech, 1); 
        return true;
 }
 
-void FSH323Connection::setRemoteAddress(const char* remoteIP, WORD remotePort){
+void FSH323Connection::setRemoteAddress(const char* remoteIP, WORD remotePort)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::setRemoteAddress remoteIP = %s , remotePort = %d [%p]\n",remoteIP,remotePort,this);
-    if (!m_remotePort) {
+
+       if (!m_remotePort) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Got remote RTP address %s:%d [%p]\n",remoteIP,remotePort,this);
                m_remotePort = remotePort;
                m_remoteAddr = remoteIP;
-    }
+       }
 }
 
-switch_status_t FSH323Connection::on_execute(){
+switch_status_t FSH323Connection::on_execute()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_execute [%p]\n",this);
     
-    return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::on_routing(){
+switch_status_t FSH323Connection::on_routing()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_routing [%p]\n",this);
    
-    return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::kill_channel(int sig){
+switch_status_t FSH323Connection::kill_channel(int sig)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::kill_channel sig = %d [%p]\n",sig,this);
+
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
+
        if (!tech_pvt) {
                return SWITCH_STATUS_FALSE;
        }
        
-    switch (sig) {
+       switch (sig) {
                case SWITCH_SIG_BREAK:
                        if (switch_rtp_ready(tech_pvt->rtp_session)) {
                                switch_rtp_break(tech_pvt->rtp_session);
@@ -1270,15 +1385,17 @@ switch_status_t FSH323Connection::kill_channel(int sig){
                                switch_rtp_kill_socket(tech_pvt->rtp_session);
                        }
                        break;
-    }
+       }
 
-    return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::send_dtmf(const switch_dtmf_t *dtmf){
+switch_status_t FSH323Connection::send_dtmf(const switch_dtmf_t *dtmf)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::send_dtmf [%p]\n",this);
-    SendUserInputTone(dtmf->digit, dtmf->duration);
-    return SWITCH_STATUS_SUCCESS;
+
+       SendUserInputTone(dtmf->digit, dtmf->duration);
+       return SWITCH_STATUS_SUCCESS;
 }
 
 void FSH323Connection::SendUserInputTone(char tone, unsigned duration, unsigned logicalChannel, unsigned rtpTimestamp)
@@ -1309,39 +1426,43 @@ void FSH323Connection::OnUserInputString(const PString &value)
        }
 }
 
-void FSH323Connection::CleanUpOnCall(){
+void FSH323Connection::CleanUpOnCall()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::CleanUpOnCall [%p]\n",this);
        connectionState = ShuttingDownConnection;
 }
 
-switch_status_t FSH323Connection::receive_message(switch_core_session_message_t *msg)
-       h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
+switch_status_t FSH323Connection::receive_message(switch_core_session_message_t *msg)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::receive_message MSG = %d\n",msg->message_id);
-       
-    switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
-
-    switch (msg->message_id) {
-    case SWITCH_MESSAGE_INDICATE_BRIDGE:
-    case SWITCH_MESSAGE_INDICATE_UNBRIDGE:
-    case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC:
-        switch_channel_set_private_flag(channel, CF_NEED_FLUSH);
-        break;
-    default:
-        break;
-    }
-
-    switch (msg->message_id) {
+
+       switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
+       h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
+
+       switch (msg->message_id) {
+               case SWITCH_MESSAGE_INDICATE_BRIDGE:
+               case SWITCH_MESSAGE_INDICATE_UNBRIDGE:
+               case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC:
+                       switch_channel_set_private_flag(channel, CF_NEED_FLUSH);
+                       break;
+               default:
+                       break;
+       }
+
+       switch (msg->message_id) {
                case SWITCH_MESSAGE_INDICATE_RINGING:   {
-                        AnsweringCall(AnswerCallPending);
+                       AnsweringCall(AnswerCallPending);
                        break;
                }
                case SWITCH_MESSAGE_INDICATE_DEFLECT:   {
+                       if (msg->string_arg != NULL)
+                               TransferCall(msg->string_arg);
                        break;
                }
                case SWITCH_MESSAGE_INDICATE_PROGRESS:  {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
                        switch_mutex_lock(tech_pvt->h323_mutex);
-                       if (m_txChennel && m_rxChennel){
+                       if (m_txChannel && m_rxChannel){
                                m_callOnPreAnswer = true;
                        }
                        switch_mutex_unlock(tech_pvt->h323_mutex);
@@ -1349,7 +1470,7 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
                        AnsweringCall(AnswerCallPending);
                        AnsweringCall(AnswerCallDeferredWithMedia);
                        
-                       if (m_txChennel && m_rxChennel){
+                       if (m_txChannel && m_rxChannel){
                                if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) {
                                        switch_channel_mark_pre_answered(m_fsChannel);
                                }
@@ -1370,13 +1491,13 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
                        AnsweringCall(H323Connection::AnswerCallNow);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Media started on connection [%p]\n",this);
                
-                       if (m_txChennel && m_rxChennel){
+                       if (m_txChannel && m_rxChannel){
                                if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) {
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-------------------->switch_channel_mark_answered(m_fsChannel) [%p]\n",this);                                   
                                        switch_channel_mark_answered(m_fsChannel);
                                }
                        } else{
-                               m_ChennelAnswer =  true;
+                               m_ChannelAnswer =  true;
                                if (fastStartState == FastStartDisabled){
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-------------------->m_txAudioOpened.Wait START [%p]\n",this);
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-------------------->m_rxAudioOpened.Wait START [%p]\n",this);
@@ -1396,10 +1517,10 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
                                m_isRequst_fax = true;
                        switch_mutex_unlock(tech_pvt->h323_mutex);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
-                       if (m_active_chennel_fax)
+                       if (m_active_channel_fax)
                                RequestModeChangeT38("T.38\nT.38");
                        else 
-                               m_active_chennel_fax = true;
+                               m_active_channel_fax = true;
                        break;
                }
                case SWITCH_MESSAGE_INDICATE_UDPTL_MODE:{
@@ -1422,57 +1543,143 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
                default:{
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Received message id = %d [%p]\n", msg->message_id,this);
                }       
-    }
-    return SWITCH_STATUS_SUCCESS;
+       }
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::receive_event(switch_event_t *event){
+switch_status_t FSH323Connection::receive_event(switch_event_t *event)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::receive_event event id = %d [%p]\n",event->event_id,this);
-//    PTRACE(4, "mod_h323\tReceived event " << event->event_id << " on connection " << *this);
-    return SWITCH_STATUS_SUCCESS;
+//     PTRACE(4, "mod_h323\tReceived event " << event->event_id << " on connection " << *this);
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::state_change(){
+switch_status_t FSH323Connection::state_change()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::state_change [%p]\n",this);
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"State changed on connection [%p]\n",this);
-    return SWITCH_STATUS_SUCCESS;
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"State changed on connection [%p]\n",this);
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::on_init(){
+switch_status_t FSH323Connection::on_init()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_init [%p]\n",this);
-    switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
-    if (channel == NULL) {
-        return SWITCH_STATUS_FALSE;
-    }
 
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Started routing for connection [%p]\n",this);
-    switch_channel_set_state(channel, CS_ROUTING);
-    return SWITCH_STATUS_SUCCESS;
+       switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
+       if (channel == NULL) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Started routing for connection [%p]\n",this);
+       switch_channel_set_state(channel, CS_ROUTING);
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::on_exchange_media(){
+switch_status_t FSH323Connection::on_exchange_media()
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_exchange_media [%p]\n",this);
     
-    return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::on_soft_execute(){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_soft_execute [%p]\n",this);
+switch_status_t FSH323Connection::on_soft_execute()
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_soft_execute [%p]\n",this);
        
-    return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::read_audio_frame(switch_frame_t **frame, switch_io_flag_t flags, int stream_id){
+switch_status_t FSH323Connection::read_audio_frame(switch_frame_t **frame, switch_io_flag_t flags, int stream_id)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_audio_frame [%p]\n",this);
+
+       /*switch_channel_t *channel = NULL;
+       h323_private_t *tech_pvt = NULL;
+       int payload = 0;
+
+       channel = m_fsChannel;
+       assert(channel != NULL);
+
+       tech_pvt = (h323_private_t *)switch_core_session_get_private(m_fsSession);
+       assert(tech_pvt != NULL);
+
+       while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) {
+               if (switch_channel_ready(channel)) {
+                       switch_yield(10000);
+               } else {
+                       PTRACE(4, "mod_h323\t<======FSH323Connection::read_audio_frame " << this);
+                       return SWITCH_STATUS_GENERR;
+               }
+       }
+
+       tech_pvt->read_frame.datalen = 0;
+       switch_set_flag_locked(tech_pvt, TFLAG_READING);
+
+       switch_status_t status;
+
+       switch_assert(tech_pvt->rtp_session != NULL);
+       tech_pvt->read_frame.datalen = 0;
+
+
+       while (tech_pvt->read_frame.datalen == 0) {
+               tech_pvt->read_frame.flags = SFF_NONE;
+
+               status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame, flags);
+               if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+                       PTRACE(4, "mod_h323\t<======FSH323Connection::read_audio_frame " << this);
+                       return SWITCH_STATUS_FALSE;
+               }
+
+               payload = tech_pvt->read_frame.payload;
+
+               if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) {
+                       switch_dtmf_t dtmf = { 0 };
+                       switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, &dtmf);
+                       switch_channel_queue_dtmf(channel, &dtmf);
+               }
+
+               if (tech_pvt->read_frame.datalen > 0) {
+                       size_t bytes = 0;
+                       int frames = 1;
+
+                       if (!switch_test_flag((&tech_pvt->read_frame), SFF_CNG)) {
+                               if ((bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_packet)) {
+                                       frames = (tech_pvt->read_frame.datalen / bytes);
+                               }
+                               tech_pvt->read_frame.samples = (int) (frames * tech_pvt->read_codec.implementation->samples_per_packet);
+                       }
+                       break;
+               }
+       }
+
+       switch_clear_flag_locked(tech_pvt, TFLAG_READING);
+
+       if (tech_pvt->read_frame.datalen == 0) {
+               *frame = NULL;
+               PTRACE(4, "mod_h323\t<======FSH323Connection::read_audio_frame " << this);
+               return SWITCH_STATUS_GENERR;
+       }
+
+       *frame = &tech_pvt->read_frame;
+
+       PTRACE(4, "mod_h323\t<======FSH323Connection::read_audio_frame " << this);
+       return SWITCH_STATUS_SUCCESS;*/
+
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
        tech_pvt->read_frame.flags = 0;
 
        switch_set_flag_locked(tech_pvt, TFLAG_READING);
-    if (!switch_channel_ready(m_fsChannel)) {
+
+       if (!switch_channel_ready(m_fsChannel)) {
                switch_clear_flag_locked(tech_pvt, TFLAG_READING);              
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_audio_frame END\n");
-           return SWITCH_STATUS_FALSE;
-    }
+               return SWITCH_STATUS_FALSE;
+       }
+
        switch_mutex_lock(tech_pvt->h323_io_mutex);
        if (switch_test_flag(tech_pvt, TFLAG_IO)) {
                if (!switch_core_codec_ready(&tech_pvt->read_codec )) {
@@ -1490,7 +1697,9 @@ switch_status_t FSH323Connection::read_audio_frame(switch_frame_t **frame, switc
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_audio_frame END\n\n");
                        return status;                  
                }
-       //      PTRACE(4, "mod_h323\t--------->\n source = "<<tech_pvt->read_frame.source<< "\n packetlen = "<<tech_pvt->read_frame.packetlen<<"\n datalen = "<<tech_pvt->read_frame.datalen<<"\n samples = "<<tech_pvt->read_frame.samples<<"\n rate = "<<tech_pvt->read_frame.rate<<"\n payload = "<<(int)tech_pvt->read_frame.payload<<"\n timestamp = "<<tech_pvt->read_frame.timestamp<<"\n seq = "<<tech_pvt->read_frame.seq<<"\n ssrc = "<<tech_pvt->read_frame.ssrc);
+
+//             PTRACE(4, "mod_h323\t--------->\n source = "<<tech_pvt->read_frame.source<< "\n packetlen = "<<tech_pvt->read_frame.packetlen<<"\n datalen = "<<tech_pvt->read_frame.datalen<<"\n samples = "<<tech_pvt->read_frame.samples<<"\n rate = "<<tech_pvt->read_frame.rate<<"\n payload = "<<(int)tech_pvt->read_frame.payload<<"\n timestamp = "<<tech_pvt->read_frame.timestamp<<"\n seq = "<<tech_pvt->read_frame.seq<<"\n ssrc = "<<tech_pvt->read_frame.ssrc);
+
                if (tech_pvt->read_frame.flags & SFF_CNG) {
                        tech_pvt->read_frame.buflen = sizeof(m_buf);
                        tech_pvt->read_frame.data = m_buf;
@@ -1500,34 +1709,62 @@ switch_status_t FSH323Connection::read_audio_frame(switch_frame_t **frame, switc
                        tech_pvt->read_frame.m = SWITCH_FALSE;
                        tech_pvt->read_frame.seq = 0;
                        tech_pvt->read_frame.ssrc = 0;
-                       tech_pvt->read_frame.codec = &tech_pvt->read_codec ;
+                       /* The codec has alrady been set here */ //tech_pvt->read_frame.codec = &tech_pvt->read_codec ;
                } else {
-                       tech_pvt->read_frame.codec = &tech_pvt->read_codec ;
+                       /* The codec has alrady been set here */ //tech_pvt->read_frame.codec = &tech_pvt->read_codec ;
                }
-       }else{          
+       } else {
                switch_mutex_unlock(tech_pvt->h323_io_mutex);
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"--------->TFLAG_IO OFF\n");
                switch_yield(10000);
        }
+
        switch_mutex_unlock(tech_pvt->h323_io_mutex);
        switch_clear_flag_locked(tech_pvt, TFLAG_READING);
        
-    *frame = &tech_pvt->read_frame;
+       *frame = &tech_pvt->read_frame;
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_audio_frame END\n\n");
-    return SWITCH_STATUS_SUCCESS;
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
-switch_status_t FSH323Connection::write_audio_frame(switch_frame_t *frame, switch_io_flag_t flags, int stream_id){
+switch_status_t FSH323Connection::write_audio_frame(switch_frame_t *frame, switch_io_flag_t flags, int stream_id)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame [%p]\n",this);
        
+       /*switch_channel_t *channel = NULL;
+       h323_private_t *tech_pvt = NULL;
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
+       
+       channel = switch_core_session_get_channel(m_fsSession);
+       assert(channel != NULL);
+
+       tech_pvt = (h323_private_t *)switch_core_session_get_private(m_fsSession);
+       assert(tech_pvt != NULL);
+
+#if SWITCH_BYTE_ORDER == __BIG_ENDIAN
+       if (switch_test_flag(tech_pvt, TFLAG_LINEAR)) {
+               switch_swap_linear(frame->data, (int) frame->datalen / 2);
+       }
+#endif
+
+       switch_set_flag_locked(tech_pvt, TFLAG_WRITING);
+
+       switch_rtp_write_frame(tech_pvt->rtp_session, frame);
+
+       switch_clear_flag_locked(tech_pvt, TFLAG_WRITING);
+
+       PTRACE(4, "mod_h323\t<======FSH323Connection::write_audio_frame " << this);
+       return status;*/
+
        switch_status_t status = SWITCH_STATUS_SUCCESS;
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
        switch_assert(tech_pvt != NULL);
        
        if (!switch_channel_ready(m_fsChannel)) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame END\n\n");
-        return SWITCH_STATUS_FALSE;
-    }  
+               return SWITCH_STATUS_FALSE;
+       }
        
        while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) {
                if (switch_channel_ready(m_fsChannel)) {
@@ -1545,120 +1782,119 @@ switch_status_t FSH323Connection::write_audio_frame(switch_frame_t *frame, switc
 
        if ((frame->flags & SFF_CNG)) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame END\n\n");
-        return SWITCH_STATUS_SUCCESS;
-    }
+               return SWITCH_STATUS_SUCCESS;
+       }
+
        switch_set_flag_locked(tech_pvt, TFLAG_WRITING);
        
-       if (switch_rtp_write_frame(tech_pvt->rtp_session, frame)< 0) {
+       if (switch_rtp_write_frame(tech_pvt->rtp_session, frame) < 0) {
                status = SWITCH_STATUS_GENERR;
        }
        
        switch_clear_flag_locked(tech_pvt, TFLAG_WRITING);
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame END\n\n");
+
        return status;
 }
 
-switch_status_t FSH323Connection::read_video_frame(switch_frame_t **frame, switch_io_flag_t flag, int stream_id){
+switch_status_t FSH323Connection::read_video_frame(switch_frame_t **frame, switch_io_flag_t flag, int stream_id)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_video_frame [%p]\n",this);
+       return SWITCH_STATUS_FALSE; /* Not yet implemented */
 }
 
-switch_status_t FSH323Connection::write_video_frame(switch_frame_t *frame, switch_io_flag_t flag, int stream_id){
+switch_status_t FSH323Connection::write_video_frame(switch_frame_t *frame, switch_io_flag_t flag, int stream_id)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_video_frame [%p]\n",this);
+       return SWITCH_STATUS_FALSE; /* Not yet implemented */
 }
 
 ///////////////////////////////////////////////////////////////////////
 
-FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel( 
-    FSH323Connection& connection,
-    const H323Capability& capability,
-    Directions direction, 
-    unsigned sessionID,
-       const PIPSocket::Address& ip, 
-       WORD dataPort)
-    : H323_ExternalRTPChannel(connection, capability, direction, sessionID,ip,dataPort)
+FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel(FSH323Connection& connection,
+                                                       const H323Capability& capability,
+                                                       Directions direction, 
+                                                       unsigned sessionID,
+                                                       const PIPSocket::Address& ip, 
+                                                       WORD dataPort)
+       : H323_ExternalRTPChannel(connection, capability, direction, sessionID,ip,dataPort)
        , m_conn(&connection)
        , m_fsSession(connection.GetSession())
        , m_capability(&capability)
        , m_RTPlocalPort(dataPort)
-       , m_sessionID(sessionID){ 
-
-       h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
+       , m_sessionID(sessionID)
+{ 
        m_RTPlocalIP = (const char *)ip.AsString();
        SetExternalAddress(H323TransportAddress(ip, dataPort), H323TransportAddress(ip, dataPort+1));
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel sessionID = %d :%s addr = %s:%d [%p]\n",sessionID,GetDirections[GetDirection()],(const char*)m_RTPlocalIP,m_RTPlocalPort,this);        
-       
-       memset(&m_readFrame, 0, sizeof(m_readFrame));
-    m_readFrame.codec = m_switchCodec;
-    m_readFrame.flags = SFF_RAW_RTP;
-       
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel sessionID = %d :%s addr = %s:%d [%p]\n",sessionID,GetDirections[GetDirection()],(const char*)m_RTPlocalIP,m_RTPlocalPort,this);     
+
        m_fsChannel = switch_core_session_get_channel(m_fsSession);
-    //SetExternalAddress(H323TransportAddress(localIpAddress, m_RTPlocalPort), H323TransportAddress(localIpAddress, m_RTPlocalPort+1));
+       //SetExternalAddress(H323TransportAddress(localIpAddress, m_RTPlocalPort), H323TransportAddress(localIpAddress, m_RTPlocalPort+1));
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------->capability.GetPayloadType() return = %s\n",((capability.GetPayloadType() <= RTP_DataFrame::LastKnownPayloadType)?PayloadTypesNames[capability.GetPayloadType()]:"[pt=128]"));
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------->capability.GetFormatName() return = %s\n",(const char*)(capability.GetFormatName()));
        
        PString fname((const char *)capability.GetFormatName());
   
-    if (fname.Find("{sw}") == (fname.GetLength() - 4))
+       if (fname.Find("{sw}") == (fname.GetLength() - 4))
                fname = fname.Mid(0,fname.GetLength()-4);
-    if (fname.Find("{hw}") == (fname.GetLength() - 4))
+       if (fname.Find("{hw}") == (fname.GetLength() - 4))
                fname = fname.Mid(0,fname.GetLength()-4);
        
        OpalMediaFormat format(fname, FALSE);
        m_format = &format;
-       payloadCode = format.GetPayloadType();
+       payloadCode = (BYTE)format.GetPayloadType();
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------->payloadCode = %d\n",(int)payloadCode);
 }
 
 
-FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel(){
-       h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel  %s [%p]\n",GetDirections[GetDirection()],this);              
+FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel()
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel  %s [%p]\n",GetDirections[GetDirection()],this);           
        if (m_rtp_resetting) {
                switch_core_session_unlock_codec_read(m_fsSession);
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
                switch_core_session_unlock_codec_write(m_fsSession);
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_write [%p]\n",m_fsSession);      
        }
-       
 }
 
-PBoolean FSH323_ExternalRTPChannel::Start(){
+PBoolean FSH323_ExternalRTPChannel::Start()
+{
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
        switch_mutex_lock(tech_pvt->h323_mutex);
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::Start() [%p]\n",this);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::Start() [%p]\n",this);
+
        const char *err = NULL;
        switch_rtp_flag_t flags;
        char * timer_name = NULL;
        const char *var;
-       
-       
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->m_sessionID = %d  m_active_sessionID = %d\n",sessionID,m_conn->m_active_sessionID);    
-       if (!(m_conn && H323_ExternalRTPChannel::Start())){             
+       if (!(m_conn && H323_ExternalRTPChannel::Start())) {
                switch_mutex_unlock(tech_pvt->h323_mutex);
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
                return false;
        }
        
-       if ((tech_pvt->me == NULL)||((tech_pvt->me != NULL) && tech_pvt->me->m_channel_hangup)){                
+       if ((tech_pvt->me == NULL) || ((tech_pvt->me != NULL) && tech_pvt->me->m_channel_hangup)) {
                switch_mutex_unlock(tech_pvt->h323_mutex);
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
                return false;
        }
        
-       if ((m_conn->m_active_sessionID != 0) && (m_conn->m_active_sessionID != sessionID)){
+       if ((m_conn->m_active_sessionID != 0) && (m_conn->m_active_sessionID != sessionID)) {
                if (switch_core_codec_ready(&tech_pvt->read_codec) || switch_core_codec_ready(&tech_pvt->write_codec)) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->Changing Codec to %s\n",(const char*)GetH245CodecName(m_capability));
-                       m_conn->m_rxChennel = false;
-                       m_conn->m_txChennel = false;
+                       m_conn->m_rxChannel = false;
+                       m_conn->m_txChannel = false;
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_lock_codec_read [%p]\n",m_fsSession);
                        switch_core_session_lock_codec_read(m_fsSession);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_lock_codec_write [%p]\n",m_fsSession);
                        switch_core_session_lock_codec_write(m_fsSession);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_io_mutex_lock\n");
                        switch_mutex_lock(tech_pvt->h323_io_mutex);
-                       switch_clear_flag_locked(tech_pvt, TFLAG_IO);                   
+                       switch_clear_flag_locked(tech_pvt, TFLAG_IO);
                        switch_mutex_unlock(tech_pvt->h323_io_mutex);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_io_mutex_unlock\n");
                        m_conn->m_rtp_resetting = 1;
@@ -1674,8 +1910,13 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
                }
        }
        m_conn->m_active_sessionID = sessionID;
-       bool isAudio;
+       bool isAudio = false;
+       switch_codec_t *codec = NULL;
        unsigned m_codec_ms = m_capability->GetTxFramesInPacket();
+
+       if (mod_h323_globals.ptime_override_value > -1)
+               m_codec_ms = mod_h323_globals.ptime_override_value;
+
        switch (m_capability->GetMainType()){
                case H323Capability::e_Audio:{
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->H323Capability::e_Audio\n");
@@ -1696,7 +1937,6 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
                }
                default:break;
        }
-       H323Codec *codec = GetCodec();
                
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->GetFrameSize() return = %u\n",(unsigned)m_format->GetFrameSize());
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->GetFrameTime() return = %u\n",m_format->GetFrameTime());
@@ -1705,73 +1945,77 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->m_capability->GetFormatName() return =  %s\n",(const char*)(m_capability->GetFormatName()));
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->GetH245CodecName() return =  %s\n",(const char*)GetH245CodecName(m_capability));
        
-       if (GetDirection() == IsReceiver){
-               m_switchCodec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec;
-        m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer;
-               m_conn->m_rxChennel = true;
-       }else{
-               m_switchCodec = isAudio ? &tech_pvt->write_codec : &tech_pvt->vid_write_codec;
-               m_conn->m_txChennel = true;
-               if (m_conn->m_callOnPreAnswer){
-                       m_switchCodec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec;
-                       m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer;
+       if (GetDirection() == IsReceiver) {
+               codec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec;
+               //m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer;
+               m_conn->m_rxChannel = true;
+       } else {
+               codec = isAudio ? &tech_pvt->write_codec : &tech_pvt->vid_write_codec;
+               m_conn->m_txChannel = true;
+               if (m_conn->m_callOnPreAnswer) {
+                       codec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec;
+                       //m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer;
                }
        }
        
-       if (switch_core_codec_init(m_switchCodec, GetH245CodecName(m_capability), NULL, // FMTP
-                               8000, m_codec_ms, 1,  // Channels
-                               SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,   // Settings
-                               switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
+       tech_pvt->read_frame.codec = &tech_pvt->read_codec; /* Set codec here - no need to set it every time a frame is read */
+
+       if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, // FMTP
+               8000, m_codec_ms, 1,  // Channels
+               SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,   // Settings
+               switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
         
-        if (switch_core_codec_init(m_switchCodec, GetH245CodecName(m_capability), NULL, // FMTP
-                                   8000, 0, 1,  // Channels
-                                   SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,   // Settings
-                                   switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
+               if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, // FMTP
+                       8000, 0, 1,  // Channels
+                       SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,   // Settings
+                       switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
+
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"%s      Cannot initialise %s  %s codec for connection [%p]\n",switch_channel_get_name(m_fsChannel), ((GetDirection() == IsReceiver)? " read" : " write")
                                , GetMainTypes[m_capability->GetMainType()],(const char*)(m_capability->GetFormatName()),this);
-            switch_channel_hangup(m_fsChannel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
+                       switch_channel_hangup(m_fsChannel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
                        switch_mutex_unlock(tech_pvt->h323_mutex);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
-            return false;
-        }
+                       return false;
+               }
+
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"%s  Unsupported ptime of %u on %s %s codec %s  for connection [%p]\n",switch_channel_get_name(m_fsChannel),m_codec_ms,((GetDirection() == IsReceiver)? " read" : " write")
-                       ,GetMainTypes[m_capability->GetMainType()],(const char*)(m_capability->GetFormatName()),this);
-    }
+                       , GetMainTypes[m_capability->GetMainType()],(const char*)(m_capability->GetFormatName()),this);
+       }
 
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"%s initialise %s codec %s for connection [%p]\n",switch_channel_get_name(m_fsChannel),((GetDirection() == IsReceiver)? " read" : " write")
-               ,GetMainTypes[m_capability->GetMainType()],(const char*)(m_capability->GetFormatName()),this);
-       
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"%s initialise %s codec %s for connection [%p]\n",switch_channel_get_name(m_fsChannel),((GetDirection() == IsReceiver)? " read" : " write")
+               , GetMainTypes[m_capability->GetMainType()],(const char*)(m_capability->GetFormatName()),this);
        
-        if (GetDirection() == IsReceiver) {
-        m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
-
-        if (isAudio) {
-            switch_core_session_set_read_codec(m_fsSession, m_switchCodec);
-            if (switch_core_timer_init(m_switchTimer,
-                                       "soft",
-                                       m_switchCodec->implementation->microseconds_per_packet / 1000,
-                                       m_switchCodec->implementation->samples_per_packet,
-                                       switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
-                switch_core_codec_destroy(m_switchCodec);
-                m_switchCodec = NULL;
+       if (GetDirection() == IsReceiver) {
+               //m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
+               
+               if (isAudio) {
+                       switch_core_session_set_read_codec(m_fsSession, codec);
+                       /*if (switch_core_timer_init(m_switchTimer,
+                               "soft",
+                               codec->implementation->microseconds_per_packet / 1000,
+                               codec->implementation->samples_per_packet,
+                               switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
+                               
+                               switch_core_codec_destroy(codec);
+                               codec = NULL;
                                switch_mutex_unlock(tech_pvt->h323_mutex);
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
-                return false;
-            }
-                       switch_channel_set_variable(m_fsChannel,"timer_name","soft");
-                       if (m_conn->m_ChennelProgress)
-                               switch_core_session_set_write_codec(m_fsSession, m_switchCodec);
-        } else {
-            switch_core_session_set_video_read_codec(m_fsSession, m_switchCodec);
-            switch_channel_set_flag(m_fsChannel, CF_VIDEO);
-        }
-    } else {
-        if (isAudio) {
-            switch_core_session_set_write_codec(m_fsSession, m_switchCodec);
+                               return false;
+                       }
+                       switch_channel_set_variable(m_fsChannel,"timer_name", "soft");*/
+                       if (m_conn->m_ChannelProgress)
+                               switch_core_session_set_write_codec(m_fsSession, codec);
+               } else {
+                       switch_core_session_set_video_read_codec(m_fsSession, codec);
+                       switch_channel_set_flag(m_fsChannel, CF_VIDEO);
+               }
+       } else {
+               if (isAudio) {
+                       switch_core_session_set_write_codec(m_fsSession, codec);
                        if (m_conn->m_callOnPreAnswer){
-                               m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
-                               switch_core_session_set_read_codec(m_fsSession, m_switchCodec);
-                               if (switch_core_timer_init(m_switchTimer,
+                               //m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
+                               switch_core_session_set_read_codec(m_fsSession, codec);
+                               /*if (switch_core_timer_init(m_switchTimer,
                                                                   "soft",
                                                                   m_switchCodec->implementation->microseconds_per_packet / 1000,
                                                                   m_switchCodec->implementation->samples_per_packet,
@@ -1782,26 +2026,26 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
                                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
                                                return false;
                                }
-                               switch_channel_set_variable(m_fsChannel,"timer_name","soft");
+                               switch_channel_set_variable(m_fsChannel,"timer_name","soft");*/
                        }       
-        } else {
-            switch_core_session_set_video_write_codec(m_fsSession, m_switchCodec);
-            switch_channel_set_flag(m_fsChannel, CF_VIDEO);
-        }
-    }
+               } else {
+                       switch_core_session_set_video_write_codec(m_fsSession, codec);
+                       switch_channel_set_flag(m_fsChannel, CF_VIDEO);
+               }
+       }
        
-//    PTRACE(4, "mod_h323\tSet " << ((GetDirection() == IsReceiver)? " read" : " write") << ' '
-//           << m_capability->GetMainType() << " codec to << " << m_capability << " for connection " << *this);
+//     PTRACE(4, "mod_h323\tSet " << ((GetDirection() == IsReceiver)? " read" : " write") << ' '
+//             << m_capability->GetMainType() << " codec to << " << m_capability << " for connection " << *this);
                
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Set %s %s codec to %s  for connection [%p]\n",((GetDirection() == IsReceiver)? " read" : " write")
                ,GetMainTypes[m_capability->GetMainType()],(const char*)m_capability->GetFormatName(),this);
                
        PIPSocket::Address remoteIpAddress;
-    GetRemoteAddress(remoteIpAddress,m_RTPremotePort); 
+       GetRemoteAddress(remoteIpAddress,m_RTPremotePort);      
        m_RTPremoteIP = (const char *)remoteIpAddress.AsString();
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->tech_pvt->rtp_session = [%p]\n",tech_pvt->rtp_session);
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->samples_per_packet = %lu\n",m_switchCodec->implementation->samples_per_packet);
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->actual_samples_per_second = %lu\n",m_switchCodec->implementation->actual_samples_per_second);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->samples_per_packet = %lu\n", codec->implementation->samples_per_packet);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->actual_samples_per_second = %lu\n", codec->implementation->actual_samples_per_second);
        
        bool ch_port = false;
        if (tech_pvt->rtp_session != NULL){
@@ -1824,25 +2068,35 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
        
        if ((!m_conn->m_startRTP)) {                    
                flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_DATAWAIT|SWITCH_RTP_FLAG_AUTO_CNG|SWITCH_RTP_FLAG_RAW_WRITE);
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->timer_name = %s\n",switch_channel_get_variable(m_fsChannel, "timer_name"));
-               if ((var = switch_channel_get_variable(m_fsChannel, "timer_name"))) {
-                       timer_name = (char *) var;
+
+               if (mod_h323_globals.use_rtp_timer) {
+                       flags |= SWITCH_RTP_FLAG_USE_TIMER;
+                       timer_name = mod_h323_globals.rtp_timer_name;
+               } else {
+                       if ((var = switch_channel_get_variable(m_fsChannel, "timer_name"))) {
+                               timer_name = (char *) var;
+                               flags |= SWITCH_RTP_FLAG_USE_TIMER;
+                       }
                }
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->timer_name = %s\n",timer_name);
+
+               if (timer_name)
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->timer_name = %s\n", timer_name);
+
                tech_pvt->rtp_session = switch_rtp_new((const char *)m_RTPlocalIP,
-                                                                                          m_RTPlocalPort,
-                                                                                          (const char *)m_RTPremoteIP,
-                                                                                          m_RTPremotePort,
-                                                                                          (switch_payload_t)payloadCode,
-                                                                                          m_switchCodec->implementation->samples_per_packet,   
-                                                                                          m_codec_ms * 1000,
-                                                                                          (switch_rtp_flag_t) flags, timer_name, &err,
-                                                                                          switch_core_session_get_pool(m_fsSession));
+                                                       m_RTPlocalPort,
+                                                       (const char *)m_RTPremoteIP,
+                                                       m_RTPremotePort,
+                                                       (switch_payload_t)payloadCode,
+                                                       codec->implementation->samples_per_packet,      
+                                                       codec->implementation->microseconds_per_packet,
+                                                       flags, timer_name, &err,
+                                                       switch_core_session_get_pool(m_fsSession));
+
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->tech_pvt->rtp_session = %p\n",tech_pvt->rtp_session);
                m_conn->m_startRTP = true;
                if (switch_rtp_ready(tech_pvt->rtp_session)) {
                        switch_channel_set_flag(m_fsChannel, CF_FS_RTP);
-               }else{
+               } else {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "AUDIO RTP REPORTS ERROR: [%s]\n", switch_str_nil(err));
                        switch_channel_hangup(m_fsChannel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);                      
                        switch_mutex_unlock(tech_pvt->h323_mutex);
@@ -1850,6 +2104,7 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
                        return SWITCH_STATUS_FALSE;
                }
        }
+
        if (ch_port){
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_io_mutex_lock\n");
                switch_mutex_lock(tech_pvt->h323_io_mutex);
@@ -1859,8 +2114,8 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
                switch_core_session_unlock_codec_read(m_fsSession);
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
        }
-       
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->External RTP address %s:%u\n",(const char*)m_RTPremoteIP,m_RTPremotePort);
+
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->External RTP address %s:%u\n",(const char*)m_RTPremoteIP,m_RTPremotePort);
        
        if (GetDirection() == IsReceiver) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_io_mutex_lock\n");
@@ -1871,35 +2126,35 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
        }
        
        if (m_conn->m_rtp_resetting) {
-               if (GetDirection() == IsReceiver)
+               if (GetDirection() == IsReceiver) {
                        switch_core_session_unlock_codec_read(m_fsSession);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
-               }else{
+               } else {
                        switch_core_session_unlock_codec_write(m_fsSession);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_write [%p]\n",m_fsSession);
-                       if (m_conn->m_callOnPreAnswer){
+                       if (m_conn->m_callOnPreAnswer) {
                                switch_core_session_unlock_codec_read(m_fsSession);     
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
                        }
                }
        }
        
-       if (GetDirection() == IsReceiver) m_conn->m_rxAudioOpened.Signal();
-       else m_conn->m_txAudioOpened.Signal();                             
+       if (GetDirection() == IsReceiver)
+               m_conn->m_rxAudioOpened.Signal();
+       else
+               m_conn->m_txAudioOpened.Signal();                             
        
-       if ( m_conn->m_ChennelAnswer && m_conn->m_rxChennel &&  m_conn->m_txChennel){
-               switch_channel_mark_answered(m_fsChannel);              
-       }
+       if (m_conn->m_ChannelAnswer && m_conn->m_rxChannel &&  m_conn->m_txChannel)
+               switch_channel_mark_answered(m_fsChannel);
                
-       if ((m_conn->m_ChennelProgress && m_conn->m_rxChennel)||(m_conn->m_callOnPreAnswer && m_conn->m_txChennel)){
+       if ((m_conn->m_ChannelProgress && m_conn->m_rxChannel)||(m_conn->m_callOnPreAnswer && m_conn->m_txChannel))
                switch_channel_mark_pre_answered(m_fsChannel);
-       }
-       
-       if ((m_capability->GetMainType() == H323Capability::e_Data)  && m_conn->m_rxChennel &&  m_conn->m_txChennel ) {
+
+       if (m_capability->GetMainType() == H323Capability::e_Data && m_conn->m_rxChannel &&  m_conn->m_txChannel) {
                const char *uuid = switch_channel_get_variable(m_fsChannel, SWITCH_SIGNAL_BOND_VARIABLE); 
                if (uuid != NULL){
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->switch_rtp_udptl_mode\n");
-                       switch_rtp_udptl_mode(tech_pvt->rtp_session);           
+                       switch_rtp_udptl_mode(tech_pvt->rtp_session);
                        switch_core_session_message_t msg = { 0 };
                        msg.from = switch_channel_get_name(m_fsChannel);
                        msg.message_id = SWITCH_MESSAGE_INDICATE_UDPTL_MODE;
@@ -1908,96 +2163,101 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
        }
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
        switch_mutex_unlock(tech_pvt->h323_mutex);
+
        return true;
 }
 
-
-PBoolean FSH323_ExternalRTPChannel::OnReceivedPDU(
-                               const H245_H2250LogicalChannelParameters& param,
-                               unsigned& errorCode){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnReceivedPDU [%p]\n",this);
+PBoolean FSH323_ExternalRTPChannel::OnReceivedPDU(const H245_H2250LogicalChannelParameters& param, unsigned& errorCode)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnReceivedPDU [%p]\n",this);
        
-    if (!H323_ExternalRTPChannel::OnReceivedPDU(param,errorCode))
+       if (!H323_ExternalRTPChannel::OnReceivedPDU(param,errorCode))
                return true;
-    PIPSocket::Address remoteIpAddress;
-    WORD remotePort;
-    GetRemoteAddress(remoteIpAddress,remotePort);
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Remote RTP address %s:%u\n",(const char *)remoteIpAddress.AsString(),remotePort);
-    m_conn->setRemoteAddress((const char *)remoteIpAddress.AsString(), remotePort);
-    return true;
+       PIPSocket::Address remoteIpAddress;
+       WORD remotePort;
+       GetRemoteAddress(remoteIpAddress,remotePort);
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Remote RTP address %s:%u\n",(const char *)remoteIpAddress.AsString(),remotePort);
+       m_conn->setRemoteAddress((const char *)remoteIpAddress.AsString(), remotePort);
+       return true;
 }
 
-PBoolean FSH323_ExternalRTPChannel::OnSendingPDU(H245_H2250LogicalChannelParameters& param){
-   switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_ExternalRTPChannel::OnSendingPDU [%p]\n",this);
-    return H323_ExternalRTPChannel::OnSendingPDU(param);
+PBoolean FSH323_ExternalRTPChannel::OnSendingPDU(H245_H2250LogicalChannelParameters& param)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_ExternalRTPChannel::OnSendingPDU [%p]\n",this);
+       return H323_ExternalRTPChannel::OnSendingPDU(param);
 }
 
-PBoolean FSH323_ExternalRTPChannel::OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters& param){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnReceivedAckPDU [%p]\n",this);
-    return H323_ExternalRTPChannel::OnReceivedAckPDU(param);
+PBoolean FSH323_ExternalRTPChannel::OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters& param)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnReceivedAckPDU [%p]\n",this);
+       return H323_ExternalRTPChannel::OnReceivedAckPDU(param);
 }
 
-void FSH323_ExternalRTPChannel::OnSendOpenAck(H245_H2250LogicalChannelAckParameters& param){
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnSendOpenAck [%p]\n",this);
-    H323_ExternalRTPChannel::OnSendOpenAck(param);
+void FSH323_ExternalRTPChannel::OnSendOpenAck(H245_H2250LogicalChannelAckParameters& param)
+{
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnSendOpenAck [%p]\n",this);
+       H323_ExternalRTPChannel::OnSendOpenAck(param);
 }
 
 
-FSH323Connection * FSH323EndPoint::FSMakeCall(const PString & dest, void *userData){
+FSH323Connection * FSH323EndPoint::FSMakeCall(const PString & dest, void *userData)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::FSMakeCall DST NUMBER = %s [%p]\n",(const char*)dest,this);
        
        FSH323Connection * connection;
        PString token;
        H323Transport *transport = NULL;
        
-    if (listeners.GetSize() > 0) {
-                       H323TransportAddress taddr = listeners[0].GetTransportAddress();
-                       PIPSocket::Address addr;
-                       WORD port;
-                       if (taddr.GetIpAndPort(addr, port)) {                           
-                               if (addr) {
-                                       transport = new H323TransportTCP(*this, addr,false);
-                                       if (!transport)                                         
-                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----> Unable to create transport for outgoing call\n");
-                               }
-                       } else
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----> Unable to get address and port\n");
+       if (listeners.GetSize() > 0) {
+               H323TransportAddress taddr = listeners[0].GetTransportAddress();
+               PIPSocket::Address addr;
+               WORD port;
+               if (taddr.GetIpAndPort(addr, port)) {                           
+                       if (addr) {
+                               transport = new H323TransportTCP(*this, addr,false);
+                               if (!transport)                                         
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----> Unable to create transport for outgoing call\n");
+                       }
+               } else
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----> Unable to get address and port\n");
        }
        
-    if (!(connection = (FSH323Connection *)H323EndPoint::MakeCall(dest, token, userData))) {
-        return NULL;
-    }
+       if (!(connection = (FSH323Connection *)H323EndPoint::MakeCall(dest, token, userData))) {
+               return NULL;
+       }
+
        return connection;
 }
 
-
 static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session,
                                                    switch_event_t *var_event,
                                                    switch_caller_profile_t *outbound_profile,
-                                                   switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause){
+                                                   switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>create_outgoing_channel DST NUMBER = %s\n",outbound_profile->destination_number);
        
        FSH323Connection * connection;
-    if (h323_process == NULL) {
-        return SWITCH_CAUSE_CRASH;
-    }
+       if (h323_process == NULL) {
+               return SWITCH_CAUSE_CRASH;
+       }
        FSH323EndPoint & ep = h323_process->GetH323EndPoint();
        if (!(connection = ep.FSMakeCall(outbound_profile->destination_number,outbound_profile))){
                return SWITCH_CAUSE_PROTOCOL_ERROR;
        }
 
-    *new_session = connection->GetSession();
+       *new_session = connection->GetSession();
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"--------->GetSession() return = [%p]\n",connection->GetSession());
-    return SWITCH_CAUSE_SUCCESS;
+       return SWITCH_CAUSE_SUCCESS;
 }
 
 
-static switch_status_t on_destroy(switch_core_session_t *session){
+static switch_status_t on_destroy(switch_core_session_t *session)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>on_destroy\n");
 
-    h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session);
+       h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session);
     
-    if (tech_pvt) {
+       if (tech_pvt) {
                if (tech_pvt->read_codec.implementation) {
                        switch_core_codec_destroy(&tech_pvt->read_codec);
                }
@@ -2016,20 +2276,23 @@ static switch_status_t on_destroy(switch_core_session_t *session){
                if (tech_pvt->vid_read_timer.timer_interface) {
                        switch_core_timer_destroy(&tech_pvt->vid_read_timer);
                }
-    }
+       }
 
-    return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_SUCCESS;
 }
 
 
-static switch_status_t on_hangup(switch_core_session_t *session){
+static switch_status_t on_hangup(switch_core_session_t *session)
+{
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>switch_status_t on_hangup [%p]\n",session);
+
+       switch_channel_t *channel = switch_core_session_get_channel(session);
        h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session);
-               
-       
-    switch_channel_t *channel = switch_core_session_get_channel(session);
-    if (tech_pvt->me) {
-               if (tech_pvt->me->m_rtp_resetting == 1) {                       
+       FSH323Connection *me = tech_pvt->me;
+       tech_pvt->me = NULL;
+
+       if (me) {
+               if (me->m_rtp_resetting == 1) {
                        switch_core_session_unlock_codec_read(session);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",session);
                        switch_core_session_unlock_codec_write(session);
@@ -2037,46 +2300,39 @@ static switch_status_t on_hangup(switch_core_session_t *session){
                }
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
                switch_mutex_lock(tech_pvt->h323_mutex);
-               tech_pvt->me->m_channel_hangup = true;
+               me->m_channel_hangup = true;
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
                switch_mutex_unlock(tech_pvt->h323_mutex);
-               if (tech_pvt->me->TryLock() == 1){
-                       tech_pvt->me->CloseAllLogicalChannels(true);
-                       tech_pvt->me->CloseAllLogicalChannels(false);
-                       tech_pvt->me->Unlock();
-               }               
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----->%s\n",(const char *)(tech_pvt->me->GetCallToken()));
-        Q931::CauseValues cause = (Q931::CauseValues)switch_channel_get_cause_q850(channel);
-               int trylock = tech_pvt->me->TryLock();
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> () = %d\n",trylock);             
-               if (trylock == 1){                      
-                       const PString currentToken(tech_pvt->me->GetCallToken());
-                       FSH323Connection *connection = (FSH323Connection *)tech_pvt->me->GetEndPoint()->FindConnectionWithLock(currentToken);                   
+               if (me->TryLock() == 1) {
+                       me->CloseAllLogicalChannels(true);
+                       me->CloseAllLogicalChannels(false);
+                       me->Unlock();
+               }
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----->%s\n",(const char *)(me->GetCallToken()));
+               Q931::CauseValues cause = (Q931::CauseValues)switch_channel_get_cause_q850(channel);
+               int trylock = me->TryLock();
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> () = %d\n",trylock);
+               if (trylock == 1) {
+                       const PString currentToken(me->GetCallToken());
+                       FSH323Connection *connection = (FSH323Connection *)me->GetEndPoint()->FindConnectionWithLock(currentToken); 
                        connection->Unlock();
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n");
-                       tech_pvt->me->Unlock();
+                       me->Unlock();
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n");
-               }else if (trylock == -1){
-                       tech_pvt->me->Unlock();
+               } else if (trylock == -1) {
+                       me->Unlock();
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n");
                }
-        tech_pvt->me->SetQ931Cause(cause);             
-        tech_pvt->me->ClearCallSynchronous(NULL, H323TranslateToCallEndReason(cause, UINT_MAX));               
-        tech_pvt->me = NULL;
+               me->SetQ931Cause(cause);
+               me->ClearCallSynchronous(NULL, H323TranslateToCallEndReason(cause, UINT_MAX));
 //             switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
 //             switch_mutex_lock(tech_pvt->h323_mutex);
-    }  
+       }
+
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
        switch_mutex_lock(tech_pvt->h323_mutex);
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
        switch_mutex_unlock(tech_pvt->h323_mutex);
-    return SWITCH_STATUS_SUCCESS;
-}
-
-
-
-
-
-
-
 
+       return SWITCH_STATUS_SUCCESS;
+}
index 9d8369ddfcc8c1b2993a14505f108cb7d544e3f8..a88abf5301be277dd54acfc5a0bb2390a9f111c9 100644 (file)
@@ -1,4 +1,30 @@
-
+/* 
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2010, Anthony Minessale II <anthm@freeswitch.org>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthm@freeswitch.org>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ *
+ * mod_h323.h -- H323 endpoint
+ *
+ */
 
 #if defined(__GNUC__) && defined(HAVE_VISIBILITY)
 #pragma GCC visibility push(default)
@@ -39,34 +65,34 @@ const char* const GetDirections[H323Channel::NumDirections+1] = {
 };
 
 const char * const PayloadTypesNames[RTP_DataFrame::LastKnownPayloadType] = {
-  "PCMU",
-  "FS1016",
-  "G721",
-  "GSM",
-  "G7231",
-  "DVI4_8k",
-  "DVI4_16k",
-  "LPC",
-  "PCMA",
-  "G722",
-  "L16_Stereo",
-  "L16_Mono",
-  "G723",
-  "CN",
-  "MPA",
-  "G728",
-  "DVI4_11k",
-  "DVI4_22k",
-  "G729",
-  "CiscoCN",
-  NULL, NULL, NULL, NULL, NULL,
-  "CelB",
-  "JPEG",
-  NULL, NULL, NULL, NULL,
-  "H261",
-  "MPV",
-  "MP2T",
-  "H263"
+       "PCMU",
+       "FS1016",
+       "G721",
+       "GSM",
+       "G7231",
+       "DVI4_8k",
+       "DVI4_16k",
+       "LPC",
+       "PCMA",
+       "G722",
+       "L16_Stereo",
+       "L16_Mono",
+       "G723",
+       "CN",
+       "MPA",
+       "G728",
+       "DVI4_11k",
+       "DVI4_22k",
+       "G729",
+       "CiscoCN",
+       NULL, NULL, NULL, NULL, NULL,
+       "CelB",
+       "JPEG",
+       NULL, NULL, NULL, NULL,
+       "H261",
+       "MPV",
+       "MP2T",
+       "H263"
 };
 
 
@@ -94,7 +120,6 @@ const char* const GetMainTypes[H323Capability::e_NumMainTypes+1] = {
        "NumMainTypes"  
 };
 
-
 extern void SetT38_IFP_PRE();
 class OpalMediaFormat;
 class H245_T38FaxProfile;
@@ -133,6 +158,9 @@ struct mod_h323_globals {
        char *codec_string;
        char *context;
        char *dialplan;
+       int use_rtp_timer;
+       char *rtp_timer_name;
+       int ptime_override_value;
 };
 
 extern struct mod_h323_globals mod_h323_globals;
@@ -161,24 +189,27 @@ typedef struct {
 #define DECLARE_CALLBACK0(name)                           \
     static switch_status_t name(switch_core_session_t *session) {       \
         h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session); \
-        return tech_pvt && tech_pvt->me != NULL ? tech_pvt->me->name() : SWITCH_STATUS_FALSE; } \
+       FSH323Connection *me = (tech_pvt && tech_pvt->me != NULL) ? tech_pvt->me : NULL; \
+        return me != NULL ? me->name() : SWITCH_STATUS_FALSE; } \
 switch_status_t name()
 
 #define DECLARE_CALLBACK1(name, type1, name1)                           \
     static switch_status_t name(switch_core_session_t *session, type1 name1) { \
         h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session); \
-        return tech_pvt && tech_pvt->me != NULL ? tech_pvt->me->name(name1) : SWITCH_STATUS_FALSE; } \
+       FSH323Connection *me = (tech_pvt && tech_pvt->me != NULL) ? tech_pvt->me : NULL; \
+        return me != NULL ? me->name(name1) : SWITCH_STATUS_FALSE; } \
 switch_status_t name(type1 name1)
 
 #define DECLARE_CALLBACK3(name, type1, name1, type2, name2, type3, name3) \
     static switch_status_t name(switch_core_session_t *session, type1 name1, type2 name2, type3 name3) { \
         h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session); \
-        return tech_pvt && tech_pvt->me != NULL ? tech_pvt->me->name(name1, name2, name3) : SWITCH_STATUS_FALSE; } \
+       FSH323Connection *me = (tech_pvt && tech_pvt->me != NULL) ? tech_pvt->me : NULL; \
+        return me != NULL ? me->name(name1, name2, name3) : SWITCH_STATUS_FALSE; } \
 switch_status_t name(type1 name1, type2 name2, type3 name3)
 
 class FSH323EndPoint;
-class FSProcess:public PLibraryProcess {
-       PCLASSINFO(FSProcess, PLibraryProcess);
+class FSProcess:public PProcess {
+       PCLASSINFO(FSProcess, PProcess);
 
   public:
        FSProcess();
@@ -186,6 +217,8 @@ class FSProcess:public PLibraryProcess {
 
        bool Initialise(switch_loadable_module_interface_t *iface);
 
+       void Main()
+               { }
             FSH323EndPoint & GetH323EndPoint() const {
                return *m_h323endpoint;
   } protected:
@@ -193,8 +226,9 @@ class FSProcess:public PLibraryProcess {
 };
 
 struct FSListener {
-       FSListener() {
-       } PString name;
+       FSListener()
+               { }
+       PString name;
        H323ListenerTCP *listenAddress;
        PString localUserName;
        PString gatekeeper;
@@ -210,13 +244,12 @@ class FSH323EndPoint:public H323EndPoint {
        ~FSH323EndPoint();
 
 
-        /**Create a connection that uses the specified call.
-      */
+        /* Create a connection that uses the specified call. */
        virtual H323Connection *CreateConnection(unsigned callReference, void *userData, H323Transport * transport, H323SignalPDU * setupPDU);
        virtual bool OnSetGatewayPrefixes(PStringList & prefixes) const;
 
        bool Initialise(switch_loadable_module_interface_t *iface);
-       
+
        switch_status_t ReadConfig(int reload);
 
        void StartGkClient(int retry, PString * gkAddress, PString * gkIdentifer, PString * gkInterface);
@@ -224,8 +257,9 @@ class FSH323EndPoint:public H323EndPoint {
 
        switch_endpoint_interface_t *GetSwitchInterface() const {
                return m_freeswitch;
-       } FSH323Connection *FSMakeCall(const PString & dest, void *userData);
-                        list < FSListener > m_listeners;
+       } 
+       FSH323Connection *FSMakeCall(const PString & dest, void *userData);
+       list < FSListener > m_listeners;
        int m_ai;
        int m_pi;
   protected:
@@ -274,8 +308,8 @@ class FSH323Connection:public H323Connection {
        ~FSH323Connection();
 
        virtual H323Channel *CreateRealTimeLogicalChannel(const H323Capability & capability,
-                                                                                                         H323Channel::Directions dir,
-                                                                                                         unsigned sessionID, const H245_H2250LogicalChannelParameters * param, RTP_QOS * rtpqos = NULL);
+                                                       H323Channel::Directions dir,
+                                                       unsigned sessionID, const H245_H2250LogicalChannelParameters * param, RTP_QOS * rtpqos = NULL);
        virtual PBoolean OnStartLogicalChannel(H323Channel & channel);
        virtual PBoolean OnCreateLogicalChannel(const H323Capability & capability, H323Channel::Directions dir, unsigned &errorCode);
        virtual bool OnReceivedSignalSetup(const H323SignalPDU & setupPDU);
@@ -313,32 +347,32 @@ class FSH323Connection:public H323Connection {
        void CleanUpOnCall();
     
        DECLARE_CALLBACK0(on_init);
-    DECLARE_CALLBACK0(on_routing);
-    DECLARE_CALLBACK0(on_execute);
-    DECLARE_CALLBACK0(on_exchange_media);
-    DECLARE_CALLBACK0(on_soft_execute);
-    DECLARE_CALLBACK1(kill_channel, int, sig);
-    DECLARE_CALLBACK1(send_dtmf, const switch_dtmf_t *, dtmf);
-    DECLARE_CALLBACK1(receive_message, switch_core_session_message_t *, msg);
-    DECLARE_CALLBACK1(receive_event, switch_event_t *, event);
-    DECLARE_CALLBACK0(state_change);
-
-    DECLARE_CALLBACK3(read_audio_frame, switch_frame_t **, frame, switch_io_flag_t, flags, int, stream_id);
-    DECLARE_CALLBACK3(write_audio_frame, switch_frame_t *, frame, switch_io_flag_t, flags, int, stream_id);
-    DECLARE_CALLBACK3(read_video_frame, switch_frame_t **, frame, switch_io_flag_t, flag, int, stream_id);
-    DECLARE_CALLBACK3(write_video_frame, switch_frame_t *, frame, switch_io_flag_t, flag, int, stream_id);
+       DECLARE_CALLBACK0(on_routing);
+       DECLARE_CALLBACK0(on_execute);
+       DECLARE_CALLBACK0(on_exchange_media);
+       DECLARE_CALLBACK0(on_soft_execute);
+       DECLARE_CALLBACK1(kill_channel, int, sig);
+       DECLARE_CALLBACK1(send_dtmf, const switch_dtmf_t *, dtmf);
+       DECLARE_CALLBACK1(receive_message, switch_core_session_message_t *, msg);
+       DECLARE_CALLBACK1(receive_event, switch_event_t *, event);
+       DECLARE_CALLBACK0(state_change);
+
+       DECLARE_CALLBACK3(read_audio_frame, switch_frame_t **, frame, switch_io_flag_t, flags, int, stream_id);
+       DECLARE_CALLBACK3(write_audio_frame, switch_frame_t *, frame, switch_io_flag_t, flags, int, stream_id);
+       DECLARE_CALLBACK3(read_video_frame, switch_frame_t **, frame, switch_io_flag_t, flag, int, stream_id);
+       DECLARE_CALLBACK3(write_video_frame, switch_frame_t *, frame, switch_io_flag_t, flag, int, stream_id);
 
        bool m_callOnPreAnswer;
        bool m_startRTP;
-       bool m_rxChennel;
-       bool m_txChennel;
-       bool m_ChennelAnswer;
-       bool m_ChennelProgress;
+       bool m_rxChannel;
+       bool m_txChannel;
+       bool m_ChannelAnswer;
+       bool m_ChannelProgress;
        unsigned char m_select_dtmf;
        PSyncPoint m_rxAudioOpened;
        PSyncPoint m_txAudioOpened;
        unsigned m_active_sessionID;
-       bool m_active_chennel_fax;
+       bool m_active_channel_fax;
        int m_rtp_resetting;
        bool m_isRequst_fax;
        bool m_channel_hangup;
@@ -350,7 +384,7 @@ class FSH323Connection:public H323Connection {
        switch_channel_t *m_fsChannel;
        PIPSocket::Address m_RTPlocalIP;
        WORD m_RTPlocalPort;
-       unsigned char m_buf[SWITCH_RECOMMENDED_BUFFER_SIZE];    
+       unsigned char m_buf[SWITCH_RECOMMENDED_BUFFER_SIZE];
 };
 
 
@@ -358,10 +392,9 @@ class FSH323_ExternalRTPChannel:public H323_ExternalRTPChannel {
        PCLASSINFO(FSH323_ExternalRTPChannel, H323_ExternalRTPChannel);
   public:
        /* Create a new channel. */
-       FSH323_ExternalRTPChannel(FSH323Connection & connection,
-                                                         const H323Capability & capability, Directions direction, unsigned sessionID, const PIPSocket::Address & ip, WORD dataPort);
+       FSH323_ExternalRTPChannel(FSH323Connection & connection, const H323Capability & capability, Directions direction, unsigned sessionID, const PIPSocket::Address & ip, WORD dataPort);
        /* Destructor */
-            ~FSH323_ExternalRTPChannel();
+       ~FSH323_ExternalRTPChannel();
 
        virtual PBoolean Start();
        virtual PBoolean OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
@@ -375,15 +408,12 @@ class FSH323_ExternalRTPChannel:public H323_ExternalRTPChannel {
        const H323Capability *m_capability;
        switch_core_session_t *m_fsSession;
        switch_channel_t *m_fsChannel;
-       switch_codec_t *m_switchCodec;
        OpalMediaFormat *m_format;
-       switch_frame_t m_readFrame;
-       switch_timer_t *m_switchTimer;
        PString m_RTPremoteIP;
        WORD m_RTPremotePort;
        PString m_RTPlocalIP;
        WORD m_RTPlocalPort;
-       BYTE payloadCode;       
+       BYTE payloadCode;
        unsigned m_sessionID;
        int m_rtp_resetting;
 };
@@ -393,15 +423,20 @@ class BaseG7231Capab:public H323AudioCapability {
   public:
        BaseG7231Capab(const char *fname, bool annexA = true)
   :    H323AudioCapability(7, 4), m_name(fname), m_aa(annexA) {
-       } virtual PObject *Clone() const {
+       } 
+       virtual PObject *Clone() const {
                return new BaseG7231Capab(*this);
-       } virtual unsigned GetSubType() const {
+       } 
+       virtual unsigned GetSubType() const {
                return H245_AudioCapability::e_g7231;
-       } virtual PString GetFormatName() const {
+       } 
+       virtual PString GetFormatName() const {
                return m_name;
-       } virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
+       } 
+       virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
                return 0;
-       } virtual Comparison Compare(const PObject & obj) const {
+       } 
+       virtual Comparison Compare(const PObject & obj) const {
                Comparison res = H323AudioCapability::Compare(obj);
                if         (res != EqualTo)
                                   return res;
@@ -411,13 +446,15 @@ class BaseG7231Capab:public H323AudioCapability {
                if    (m_aa && !aa)
                              return GreaterThan;
                      return EqualTo;
-       } virtual bool OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const {
+       } 
+       virtual bool OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const {
                pdu.SetTag(GetSubType());
                H245_AudioCapability_g7231 & g7231 = pdu;
                g7231.m_maxAl_sduAudioFrames = packetSize;
                g7231.m_silenceSuppression = m_aa;
                return true;
-       } virtual bool OnReceivedPDU(const H245_AudioCapability & pdu, unsigned &packetSize) {
+       }
+       virtual bool OnReceivedPDU(const H245_AudioCapability & pdu, unsigned &packetSize) {
                if (pdu.GetTag() != H245_AudioCapability::e_g7231)
                        return false;
                const H245_AudioCapability_g7231 & g7231 = pdu;
@@ -440,13 +477,13 @@ class BaseG729Capab:public H323AudioCapability {
        virtual PObject *Clone() const
        {
                return new BaseG729Capab(*this);
-       } 
+       }
        virtual unsigned GetSubType() const {
                return m_type;
-       } 
+       }
        virtual PString GetFormatName() const {
                return m_name;
-       } 
+       }
        virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
                return 0;
        } 
@@ -462,23 +499,29 @@ class BaseGSM0610Cap:public H323AudioCapability {
 
        BaseGSM0610Cap(const char *fname, unsigned type = H245_AudioCapability::e_gsmFullRate)
   :    H323AudioCapability(24, 2), m_name(fname), m_type(type), m_comfortNoise(0), m_scrambled(0) {
-       } virtual PObject *Clone() const {
+       } 
+       virtual PObject *Clone() const {
                return new BaseGSM0610Cap(*this);
-       } virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
+       }
+       virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
                return 0;
-       } virtual unsigned GetSubType() const {
+       }
+       virtual unsigned GetSubType() const {
                return H245_AudioCapability::e_gsmFullRate;
-       } virtual PString GetFormatName() const {
+       }
+       virtual PString GetFormatName() const {
                return m_name;
-       } virtual bool OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const {
+       }
+       virtual bool OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const {
                pdu.SetTag(H245_AudioCapability::e_gsmFullRate);
                H245_GSMAudioCapability & gsm = pdu;
                gsm.m_audioUnitSize = packetSize * 33;
                gsm.m_comfortNoise = m_comfortNoise;
                gsm.m_scrambled = m_scrambled;
                return true;
-       } virtual bool OnReceivedPDU(const H245_AudioCapability & pdu, unsigned &packetSize) {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"==============>BaseGSM0610Cap::OnReceivedPDU [%p]\n",this);
+       }
+       virtual bool OnReceivedPDU(const H245_AudioCapability & pdu, unsigned &packetSize) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"==============>BaseGSM0610Cap::OnReceivedPDU [%p]\n", this);
                if (pdu.GetTag() != H245_AudioCapability::e_gsmFullRate)
                        return false;
                const H245_GSMAudioCapability & gsm = pdu;
@@ -537,9 +580,9 @@ H323Channel * FSH323_T38Capability::CreateChannel(
     const H245_H2250LogicalChannelParameters * params) const
 {
  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_T38Capability::CreateChannel %p  sessionID= %u direction=%s [%p]\n"
-    ,&connection
-    ,sessionID
-    ,GetDirections[direction]);
+    , &connection
+    , sessionID
+    , GetDirections[direction]);
 
   return connection.CreateRealTimeLogicalChannel(*this, direction, sessionID, params);
 }