提交 30e3ed77 authored 作者: root's avatar root

apply changes from mod_h323-patch.diff by Peter Olsson.

上级 44450cb0
BASE=../../../.. 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 LOCAL_LDFLAGS= -lopenh323 -lpt -lrt
include $(BASE)/build/modmake.rules include $(BASE)/build/modmake.rules
......
apply changes from mod_h323-patch.diff by Peter Olsson.
some t.38 and lockinng improvements. some t.38 and lockinng improvements.
replace ptrace with switch_log_printf. replace ptrace with switch_log_printf.
initial t.38 support. initial t.38 support.
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
<param name="context" value="default"/> <param name="context" value="default"/>
<param name="dialplan" value="XML"/> <param name="dialplan" value="XML"/>
<param name="codec-prefs" value="PCMA,PCMU,GSM,G729"/> <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-address" value=""/> <!-- empty to disable, "*" to search LAN -->
<param name="gk-identifer" value=""/> <!-- optional name of gk --> <param name="gk-identifer" value=""/> <!-- optional name of gk -->
<param name="gk-interface" value=""/> <!-- mandatory listener interface name --> <param name="gk-interface" value=""/> <!-- mandatory listener interface name -->
...@@ -15,7 +18,6 @@ ...@@ -15,7 +18,6 @@
<param name="progress-indication" value="8"/> <!-- optional - PI value in progress message--> <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="alerting-indication" value="8"/> <!-- optional - PI value in alerting message-->
<param name="endpoint-name" value="fs"/> <param name="endpoint-name" value="fs"/>
<param name="fax-old-asn" value="true"/>
</settings> </settings>
<listeners> <listeners>
<listener name="default"> <listener name="default">
......
/* /*
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" #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_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_context, mod_h323_globals.context);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, mod_h323_globals.dialplan); 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) #define CF_NEED_FLUSH (1 << 1)
struct mod_h323_globals mod_h323_globals = { 0 }; struct mod_h323_globals mod_h323_globals = { 0 };
...@@ -111,16 +132,29 @@ static switch_state_handler_table_t h323fs_event_handlers = { ...@@ -111,16 +132,29 @@ static switch_state_handler_table_t h323fs_event_handlers = {
/*.on_destroy*/ on_destroy /*.on_destroy*/ on_destroy
}; };
//static FSProcess *h323_process = NULL; SWITCH_BEGIN_EXTERN_C
SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load){ /*******************************************************************************/
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"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Starting loading mod_h323\n");
*module_interface = switch_loadable_module_create_module_interface(pool, modname); *module_interface = switch_loadable_module_create_module_interface(pool, modname);
if (!*module_interface) { if (!*module_interface) {
return SWITCH_STATUS_MEMERR; return SWITCH_STATUS_MEMERR;
} }
module_pool = pool;
h323_process = new FSProcess(); h323_process = new FSProcess();
if (h323_process == NULL) { if (h323_process == NULL) {
return SWITCH_STATUS_MEMERR; return SWITCH_STATUS_MEMERR;
} }
...@@ -132,24 +166,31 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load){ ...@@ -132,24 +166,31 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_h323_load){
delete h323_process; delete h323_process;
h323_process = NULL; h323_process = NULL;
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
} }
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_h323_shutdown){ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_h323_shutdown)
{
switch_safe_free(mod_h323_globals.context); switch_safe_free(mod_h323_globals.context);
switch_safe_free(mod_h323_globals.dialplan); switch_safe_free(mod_h323_globals.dialplan);
switch_safe_free(mod_h323_globals.codec_string); switch_safe_free(mod_h323_globals.codec_string);
delete h323_process; delete h323_process;
h323_process = NULL; h323_process = NULL;
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
void h_timer(unsigned sec){ SWITCH_END_EXTERN_C
/*******************************************************************************/
void h_timer(unsigned sec)
{
timeval timeout; timeval timeout;
timeout.tv_sec = sec; timeout.tv_sec = sec;
timeout.tv_usec = 0; timeout.tv_usec = 0;
select(NULL, NULL, NULL, NULL, &timeout); select(0, NULL, NULL, NULL, &timeout);
} }
...@@ -265,8 +306,8 @@ class FSTrace : public ostream { ...@@ -265,8 +306,8 @@ class FSTrace : public ostream {
#endif #endif
PString GetH245CodecName(const H323Capability* cap){ PString GetH245CodecName(const H323Capability* cap)
{
switch (cap->GetSubType()) { switch (cap->GetSubType()) {
case H245_AudioCapability::e_g711Alaw64k: case H245_AudioCapability::e_g711Alaw64k:
case H245_AudioCapability::e_g711Alaw56k: case H245_AudioCapability::e_g711Alaw56k:
...@@ -297,30 +338,35 @@ PString GetH245CodecName(const H323Capability* cap){ ...@@ -297,30 +338,35 @@ PString GetH245CodecName(const H323Capability* cap){
} }
FSProcess::FSProcess() FSProcess::FSProcess()
: PLibraryProcess("Test", "mod_h323", 1, 0, AlphaCode, 1) : PProcess("FreeSWITCH", "mod_h323", 1, 0, AlphaCode, 1)
, m_h323endpoint(NULL){ , m_h323endpoint(NULL)
{
PTrace::SetLevel(4); PTrace::SetLevel(4);
PTrace::SetOptions(PTrace::TraceLevel); PTrace::SetOptions(PTrace::TraceLevel);
PTrace::SetStream(new FSTrace); PTrace::SetStream(new FSTrace);
} }
FSProcess::~FSProcess(){ FSProcess::~FSProcess()
{
delete m_h323endpoint; delete m_h323endpoint;
} }
bool FSProcess::Initialise(switch_loadable_module_interface_t *iface){ bool FSProcess::Initialise(switch_loadable_module_interface_t *iface)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "======>FSProcess::Initialise [%p]\n", this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "======>FSProcess::Initialise [%p]\n", this);
m_h323endpoint = new FSH323EndPoint(); m_h323endpoint = new FSH323EndPoint();
return m_h323endpoint != NULL && m_h323endpoint->Initialise(iface); return m_h323endpoint != NULL && m_h323endpoint->Initialise(iface);
} }
bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSManager::Initialise [%p]\n",this); {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSManager::Initialise [%p]\n", this);
ReadConfig(false); 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 = (switch_endpoint_interface_t *) switch_loadable_module_create_interface(iface, SWITCH_ENDPOINT_INTERFACE);
m_freeswitch->interface_name = modulename; m_freeswitch->interface_name = modulename;
...@@ -328,12 +374,12 @@ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){ ...@@ -328,12 +374,12 @@ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){
m_freeswitch->state_handler = &h323fs_event_handlers; m_freeswitch->state_handler = &h323fs_event_handlers;
PString codec = ((const char *)mod_h323_globals.codec_string); 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()) { if (!codec.IsEmpty()) {
const char** f = h323_formats; const char** f = h323_formats;
for (; *f; f += 2) { 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) { if (codec.Find(f[1]) != P_MAX_INDEX) {
PString tmp = f[0]; PString tmp = f[0];
tmp += "*{sw}"; tmp += "*{sw}";
...@@ -356,21 +402,23 @@ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){ ...@@ -356,21 +402,23 @@ 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"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "--->fax_old_asn\n");
SetT38_IFP_PRE(); SetT38_IFP_PRE();
SetCapability(0, 0, new FSH323_T38Capability(OpalT38_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"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "--->fax_asn\n");
SetCapability(0, 0, new FSH323_T38Capability(OpalT38_IFP_COR)); SetCapability(0, 0, new FSH323_T38Capability(OpalT38_IFP_COR));
} }
AddAllUserInputCapabilities(0,1); AddAllUserInputCapabilities(0, 1);
DisableFastStart(!m_faststart); DisableFastStart(!m_faststart);
DisableH245Tunneling(!m_h245tunneling); DisableH245Tunneling(!m_h245tunneling);
DisableH245inSetup(!m_h245insetup); DisableH245inSetup(!m_h245insetup);
DisableDetectInBandDTMF(!m_dtmfinband); DisableDetectInBandDTMF(!m_dtmfinband);
if (!m_endpointname.IsEmpty())
SetLocalUserName(m_endpointname); SetLocalUserName(m_endpointname);
if (m_listeners.empty()) { if (m_listeners.empty()) {
...@@ -392,12 +440,15 @@ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){ ...@@ -392,12 +440,15 @@ bool FSH323EndPoint::Initialise(switch_loadable_module_interface_t *iface){
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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::ReadConfig [%p]\n",this);
const char *cf = "h323.conf"; const char *cf = "h323.conf";
switch_status_t status = SWITCH_STATUS_SUCCESS; switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_memory_pool_t *pool = NULL; switch_memory_pool_t *pool = NULL;
if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) { if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
return status; return status;
...@@ -412,6 +463,7 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){ ...@@ -412,6 +463,7 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "profile", switch_str_nil("")); switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "profile", switch_str_nil(""));
switch_xml_t cfg; switch_xml_t cfg;
switch_xml_t xml = switch_xml_open_cfg(cf, &cfg, params); switch_xml_t xml = switch_xml_open_cfg(cf, &cfg, params);
if (xml == NULL) { if (xml == NULL) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
...@@ -421,6 +473,8 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){ ...@@ -421,6 +473,8 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
m_pi = 8; m_pi = 8;
m_ai = 0; m_ai = 0;
m_endpointname = "FreeSwitch"; m_endpointname = "FreeSwitch";
mod_h323_globals.ptime_override_value = -1;
if (xmlSettings) { if (xmlSettings) {
for (switch_xml_t xmlParam = switch_xml_child(xmlSettings, "param"); xmlParam != NULL; xmlParam = xmlParam->next) { 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 *var = switch_xml_attr_soft(xmlParam, "name");
...@@ -437,6 +491,12 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){ ...@@ -437,6 +491,12 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
set_global_dialplan(val); set_global_dialplan(val);
} else if (!strcasecmp(var, "codec-prefs")) { } else if (!strcasecmp(var, "codec-prefs")) {
set_global_codec_string(val); 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")) { } else if (!strcasecmp(var, "jitter-size")) {
char * next; char * next;
unsigned minJitter = strtoul(val, &next, 10); unsigned minJitter = strtoul(val, &next, 10);
...@@ -445,7 +505,7 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){ ...@@ -445,7 +505,7 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
if (*next == ',') if (*next == ',')
maxJitter = atoi(next+1); maxJitter = atoi(next+1);
SetAudioJitterDelay(minJitter, maxJitter); // In milliseconds SetAudioJitterDelay(minJitter, maxJitter); // In milliseconds
} else{ } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set zero Jitter buffer\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set zero Jitter buffer\n");
SetAudioJitterDelay(0, 0); SetAudioJitterDelay(0, 0);
} }
...@@ -503,7 +563,7 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){ ...@@ -503,7 +563,7 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
port = (WORD) atoi(val); port = (WORD) atoi(val);
} }
listener.listenAddress = new H323ListenerTCP(*this,ip,port); 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created Listener '%s'\n", (const char *) listener.name);
} }
} }
...@@ -513,6 +573,9 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){ ...@@ -513,6 +573,9 @@ switch_status_t FSH323EndPoint::ReadConfig(int reload){
if (xml) if (xml)
switch_xml_free(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;
} }
...@@ -528,22 +591,24 @@ FSH323EndPoint::FSH323EndPoint() ...@@ -528,22 +591,24 @@ FSH323EndPoint::FSH323EndPoint()
terminalType = e_GatewayOnly; terminalType = e_GatewayOnly;
} }
FSH323EndPoint::~FSH323EndPoint(){ FSH323EndPoint::~FSH323EndPoint()
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::~FSH323EndPoint [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::~FSH323EndPoint [%p]\n",this);
StopGkClient(); StopGkClient();
ClearAllCalls(H323Connection::EndedByLocalUser,false); ClearAllCalls(H323Connection::EndedByLocalUser, false);
} }
H323Connection *FSH323EndPoint::CreateConnection( H323Connection *FSH323EndPoint::CreateConnection(
unsigned callReference, unsigned callReference,
void* userData, void* userData,
H323Transport* transport, 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); 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"); 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------> SWITCH_CALL_DIRECTION_INBOUND\n");
} }
...@@ -560,10 +625,11 @@ H323Connection *FSH323EndPoint::CreateConnection( ...@@ -560,10 +625,11 @@ H323Connection *FSH323EndPoint::CreateConnection(
return NULL; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::OnSetGatewayPrefixes [%p]\n",this);
if(m_gkPrefixes.GetSize() > 0) { if(m_gkPrefixes.GetSize() > 0) {
// PTRACE(4, "mod_h323\tOnSetGatewayPrefixes " << m_gkPrefixes); // PTRACE(4, "mod_h323\tOnSetGatewayPrefixes " << m_gkPrefixes);
...@@ -573,9 +639,11 @@ bool FSH323EndPoint::OnSetGatewayPrefixes(PStringList & prefixes) const{ ...@@ -573,9 +639,11 @@ bool FSH323EndPoint::OnSetGatewayPrefixes(PStringList & prefixes) const{
return false; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::StartGkClient [%p]\n",this);
while(!UseGatekeeper(m_gkAddress, m_gkIdentifer, m_gkInterface) && retry > 0 ){
while (!UseGatekeeper(m_gkAddress, m_gkIdentifer, m_gkInterface) && retry > 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
"Could not start gatekeeper: gw name=\"%s\", addr=\"%s\", id=\"%s\", if=\"%s\"\n", "Could not start gatekeeper: gw name=\"%s\", addr=\"%s\", id=\"%s\", if=\"%s\"\n",
(const char *)m_endpointname, (const char *)m_endpointname,
...@@ -594,13 +662,16 @@ void FSH323EndPoint::StartGkClient(int retry, PString* gkAddress,PString* gkIden ...@@ -594,13 +662,16 @@ void FSH323EndPoint::StartGkClient(int retry, PString* gkAddress,PString* gkIden
} }
RemoveGatekeeper(); RemoveGatekeeper();
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Started gatekeeper: %s\n", switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Started gatekeeper: %s\n",
(const char *)GetGatekeeper()->GetName()); (const char *)GetGatekeeper()->GetName());
m_thread = NULL; m_thread = NULL;
} }
void FSH323EndPoint::StopGkClient(){ void FSH323EndPoint::StopGkClient()
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::StopGkClient [%p]\n",this); {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::StopGkClient [%p]\n", this);
if (m_thread) { 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; m_stop_gk = true;
...@@ -614,7 +685,6 @@ void FSH323EndPoint::StopGkClient(){ ...@@ -614,7 +685,6 @@ void FSH323EndPoint::StopGkClient(){
} }
} }
FSH323Connection::FSH323Connection(FSH323EndPoint& endpoint, H323Transport* transport, unsigned callReference, switch_caller_profile_t *outbound_profile, switch_core_session_t *fsSession, switch_channel_t *fsChannel) 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) : H323Connection(endpoint,callReference)
, m_endpoint(&endpoint) , m_endpoint(&endpoint)
...@@ -622,16 +692,17 @@ FSH323Connection::FSH323Connection(FSH323EndPoint& endpoint, H323Transport* tran ...@@ -622,16 +692,17 @@ FSH323Connection::FSH323Connection(FSH323EndPoint& endpoint, H323Transport* tran
, m_fsChannel(fsChannel) , m_fsChannel(fsChannel)
, m_callOnPreAnswer(false) , m_callOnPreAnswer(false)
, m_startRTP(false) , m_startRTP(false)
, m_rxChennel(false) , m_rxChannel(false)
, m_txChennel(false) , m_txChannel(false)
, m_ChennelAnswer(false) , m_ChannelAnswer(false)
, m_ChennelProgress(false) , m_ChannelProgress(false)
, m_select_dtmf(0) , m_select_dtmf(0)
, m_active_sessionID(0) , m_active_sessionID(0)
, m_active_chennel_fax(false) , m_active_channel_fax(false)
, m_rtp_resetting(0) , m_rtp_resetting(0)
, m_isRequst_fax(false) , 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); 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)); h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_alloc(m_fsSession, sizeof(*tech_pvt));
...@@ -660,7 +731,8 @@ FSH323Connection::FSH323Connection(FSH323EndPoint& endpoint, H323Transport* tran ...@@ -660,7 +731,8 @@ FSH323Connection::FSH323Connection(FSH323EndPoint& endpoint, H323Transport* tran
m_RTPlocalPort = switch_rtp_request_port((const char *)m_RTPlocalIP.AsString()); m_RTPlocalPort = switch_rtp_request_port((const char *)m_RTPlocalIP.AsString());
} }
FSH323Connection::~FSH323Connection(){ FSH323Connection::~FSH323Connection()
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::~FSH323Connection [%p]\n",this); 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); h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
if ((m_rtp_resetting == 1)) { if ((m_rtp_resetting == 1)) {
...@@ -674,19 +746,23 @@ FSH323Connection::~FSH323Connection(){ ...@@ -674,19 +746,23 @@ FSH323Connection::~FSH323Connection(){
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); // 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnSetLocalCapabilities() [%p]\n",this);
H323Connection::OnSetLocalCapabilities(); H323Connection::OnSetLocalCapabilities();
SetLocalCapabilities(); 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); 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; return false;
bool nocodecs = true; bool nocodecs = true;
bool changed = false; bool changed = false;
for (int i = 0; i < localCapabilities.GetSize(); i++) { for (int i = 0; i < localCapabilities.GetSize(); i++) {
const char* format = 0; const char* format = 0;
PString fname; PString fname;
...@@ -704,19 +780,24 @@ bool FSH323Connection::SetLocalCapabilities(){ ...@@ -704,19 +780,24 @@ bool FSH323Connection::SetLocalCapabilities(){
} }
localCapabilities.Remove(fname); localCapabilities.Remove(fname);
i--; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No codecs remaining for H323 connection [%p]\n",this);
changed = false; changed = false;
ClearCall(EndedByCapabilityExchange); 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); 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))
...@@ -728,6 +809,7 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const ...@@ -728,6 +809,7 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const
int pload = oformat.GetPayloadType(); int pload = oformat.GetPayloadType();
const char *format = 0; const char *format = 0;
const char** f = h323_formats; const char** f = h323_formats;
for (; *f; f += 2) { for (; *f; f += 2) {
if (fname.Find(*f) == 0) { if (fname.Find(*f) == 0) {
format = f[1]; format = f[1];
...@@ -735,8 +817,8 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const ...@@ -735,8 +817,8 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const
} }
} }
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) if (capabName)
*capabName = fname; *capabName = fname;
if (dataFormat) if (dataFormat)
...@@ -745,11 +827,13 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const ...@@ -745,11 +827,13 @@ bool FSH323Connection::decodeCapability(const H323Capability& capability, const
*payload = pload; *payload = pload;
return true; return true;
} }
return false; return false;
} }
H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString &caller, 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnAnswerCall caller = %s [%p]\n",(const char*)caller,this);
if (m_fsSession == NULL) { if (m_fsSession == NULL) {
...@@ -768,9 +852,12 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString ...@@ -768,9 +852,12 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString
const Q931& q931 = setupPDU.GetQ931(); const Q931& q931 = setupPDU.GetQ931();
const H225_Setup_UUIE& setup = setupPDU.m_h323_uu_pdu.m_h323_message_body; const H225_Setup_UUIE& setup = setupPDU.m_h323_uu_pdu.m_h323_message_body;
const H225_ArrayOf_AliasAddress& address = setup.m_destinationAddress; const H225_ArrayOf_AliasAddress& address = setup.m_destinationAddress;
for (int i = 0; i<address.GetSize(); i++) 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])); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"address index = %d value = %s",i,(const char *)H323GetAliasAddressString(address[i]));
PString called; PString called;
if (address.GetSize() > 0) if (address.GetSize() > 0)
called = (const char *)H323GetAliasAddressString(address[0]); called = (const char *)H323GetAliasAddressString(address[0]);
if (!called.IsEmpty()) if (!called.IsEmpty())
...@@ -811,6 +898,7 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString ...@@ -811,6 +898,7 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not create caller profile\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not create caller profile\n");
return H323Connection::AnswerCallDenied; return H323Connection::AnswerCallDenied;
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Created switch caller profile:\n" switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Created switch caller profile:\n"
" username = %s\n" " username = %s\n"
" dialplan = %s\n" " dialplan = %s\n"
...@@ -845,7 +933,8 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString ...@@ -845,7 +933,8 @@ H323Connection::AnswerCallResponse FSH323Connection::OnAnswerCall(const PString
return H323Connection::AnswerCallDeferred; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::CreateRealTimeLogicalChannel [%p]\n",this);
H323TransportAddress m_h323transportadd = GetSignallingChannel()->GetLocalAddress(); H323TransportAddress m_h323transportadd = GetSignallingChannel()->GetLocalAddress();
...@@ -854,19 +943,22 @@ H323Channel* FSH323Connection::CreateRealTimeLogicalChannel(const H323Capability ...@@ -854,19 +943,22 @@ H323Channel* FSH323Connection::CreateRealTimeLogicalChannel(const H323Capability
return new FSH323_ExternalRTPChannel(*this, capability, dir, sessionID,m_RTPlocalIP,m_RTPlocalPort); return new FSH323_ExternalRTPChannel(*this, capability, dir, sessionID,m_RTPlocalIP,m_RTPlocalPort);
} }
PBoolean FSH323Connection::OnStartLogicalChannel(H323Channel & channel){ 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 chennel = %p [%p]\n",&channel,this);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnStartLogicalChannel connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnStartLogicalChannel connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
return connectionState != ShuttingDownConnection; return connectionState != ShuttingDownConnection;
} }
PBoolean FSH323Connection::OnCreateLogicalChannel(const H323Capability& capability, H323Channel::Directions dir, unsigned& errorCode){ 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); 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); 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()); 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); h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
if ((tech_pvt->me != NULL) && (m_rtp_resetting == 1)) { if ((tech_pvt->me != NULL) && (m_rtp_resetting == 1)) {
...@@ -877,39 +969,44 @@ void FSH323Connection::OnReceivedReleaseComplete(const H323SignalPDU & pdu){ ...@@ -877,39 +969,44 @@ void FSH323Connection::OnReceivedReleaseComplete(const H323SignalPDU & pdu){
} }
tech_pvt->me = NULL; tech_pvt->me = NULL;
switch_channel_hangup(switch_core_session_get_channel(m_fsSession),(switch_call_cause_t)pdu.GetQ931().GetCause()); switch_channel_hangup(switch_core_session_get_channel(m_fsSession),(switch_call_cause_t)pdu.GetQ931().GetCause());
return H323Connection::OnReceivedReleaseComplete(pdu); return H323Connection::OnReceivedReleaseComplete(pdu);
} }
bool FSH323Connection::OnReceivedProgress(const H323SignalPDU &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); 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); switch_channel_mark_pre_answered(m_fsChannel);
else{ else{
m_ChennelProgress = true; m_ChannelProgress = true;
} }
return 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); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> after FSH323Connection::OnReceivedSignalSetup connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
H323SignalPDU callProceedingPDU; H323SignalPDU callProceedingPDU;
H225_CallProceeding_UUIE & callProceeding = callProceedingPDU.BuildCallProceeding(*this); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> after callProceedingPDU.BuildCallProceeding connectionState = %s [%p]\n",ConnectionStatesNames[connectionState],this);
if (connectionState == ShuttingDownConnection){ if (connectionState == ShuttingDownConnection){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> connectionState = ShuttingDownConnection [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"---------> connectionState = ShuttingDownConnection [%p]\n",this);
return false; return false;
} }
if (SendFastStartAcknowledge(callProceeding.m_fastStart)){ if (SendFastStartAcknowledge(callProceeding.m_fastStart)) {
callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_fastStart); callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_fastStart);
} else { } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"SendFastStartAcknowledge = FALSE\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"SendFastStartAcknowledge = FALSE\n");
if (connectionState == ShuttingDownConnection){ if (connectionState == ShuttingDownConnection) {
return true; return true;
} }
earlyStart = TRUE; earlyStart = TRUE;
...@@ -921,36 +1018,41 @@ bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU){ ...@@ -921,36 +1018,41 @@ bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU){
controlChannel->SetUpTransportPDU(callProceeding.m_h245Address, TRUE); controlChannel->SetUpTransportPDU(callProceeding.m_h245Address, TRUE);
} }
} }
if (connectionState == ShuttingDownConnection){ if (connectionState == ShuttingDownConnection) {
return true; return true;
} }
if (!WriteSignalPDU(callProceedingPDU)){ if (!WriteSignalPDU(callProceedingPDU)) {
return false; return false;
} }
return true; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnReceivedCallProceeding [%p]\n",this);
unsigned pi; unsigned pi;
if (!pdu.GetQ931().GetProgressIndicator(pi)) if (!pdu.GetQ931().GetProgressIndicator(pi))
pi = 0; pi = 0;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----------->OnAlerting PI = %u",pi); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----------->OnAlerting PI = %u",pi);
if (pi > 0){ if (pi > 0) {
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); switch_channel_mark_pre_answered(m_fsChannel);
else{ else {
m_ChennelProgress = true; m_ChannelProgress = true;
} }
} }
return H323Connection::OnReceivedCallProceeding(pdu); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnSendCallProceeding fastStartState = %s [%p]\n",FastStartStateNames[fastStartState],this);
return false; return false;
// return true; // return true;
} }
...@@ -958,20 +1060,23 @@ bool FSH323Connection::OnSendCallProceeding(H323SignalPDU & callProceedingPDU){ ...@@ -958,20 +1060,23 @@ bool FSH323Connection::OnSendCallProceeding(H323SignalPDU & callProceedingPDU){
bool FSH323Connection::OnSendReleaseComplete(H323SignalPDU & pdu) 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_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); switch_channel_hangup(m_fsChannel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
return H323Connection::OnSendReleaseComplete(pdu); 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); 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, bool FSH323Connection::OnReceivedCapabilitySet(const H323Capabilities & remoteCaps,
const H245_MultiplexCapability * muxCap, const H245_MultiplexCapability * muxCap,
H245_TerminalCapabilitySetReject & reject){ H245_TerminalCapabilitySetReject & reject)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedCapabilitySet [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::OnReceivedCapabilitySet [%p]\n",this);
if (connectionState == ShuttingDownConnection) if (connectionState == ShuttingDownConnection)
return false; return false;
...@@ -994,9 +1099,8 @@ bool FSH323Connection::OnReceivedCapabilitySet(const H323Capabilities & remoteCa ...@@ -994,9 +1099,8 @@ bool FSH323Connection::OnReceivedCapabilitySet(const H323Capabilities & remoteCa
return connectionState != ShuttingDownConnection; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnAlerting user = %s [%p]\n",(const char *)user,this);
unsigned pi; unsigned pi;
switch_status_t status = switch_channel_mark_ring_ready(m_fsChannel); switch_status_t status = switch_channel_mark_ring_ready(m_fsChannel);
...@@ -1005,18 +1109,18 @@ bool FSH323Connection::OnAlerting(const H323SignalPDU &alertingPDU, const PStrin ...@@ -1005,18 +1109,18 @@ bool FSH323Connection::OnAlerting(const H323SignalPDU &alertingPDU, const PStrin
if (!alertingPDU.GetQ931().GetProgressIndicator(pi)) if (!alertingPDU.GetQ931().GetProgressIndicator(pi))
pi = 0; pi = 0;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----------->OnAlerting PI = %u\n",pi); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----------->OnAlerting PI = %u\n",pi);
if (pi > 0){ if (pi > 0) {
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); switch_channel_mark_pre_answered(m_fsChannel);
else{ else {
m_ChennelProgress = true; m_ChannelProgress = true;
} }
} }
return ( status == SWITCH_STATUS_SUCCESS); 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::AnsweringCall [%p]\n",this);
switch (response) { switch (response) {
...@@ -1029,7 +1133,7 @@ void FSH323Connection::AnsweringCall(AnswerCallResponse response){ ...@@ -1029,7 +1133,7 @@ void FSH323Connection::AnsweringCall(AnswerCallResponse response){
if (!mediaWaitForConnect) { if (!mediaWaitForConnect) {
// create a new facility PDU if doing AnswerDeferredWithMedia // create a new facility PDU if doing AnswerDeferredWithMedia
H323SignalPDU want245PDU; H323SignalPDU want245PDU;
H225_Progress_UUIE & prog = want245PDU.BuildProgress(*this); //H225_Progress_UUIE & prog = want245PDU.BuildProgress(*this);
PBoolean sendPDU = TRUE; PBoolean sendPDU = TRUE;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"mediaWaitForConnect = FALSE\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"mediaWaitForConnect = FALSE\n");
/* if (SendFastStartAcknowledge(prog.m_fastStart)){ /* if (SendFastStartAcknowledge(prog.m_fastStart)){
...@@ -1107,16 +1211,18 @@ void FSH323Connection::AnsweringCall(AnswerCallResponse response){ ...@@ -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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnEstablished [%p]\n",this);
if(m_startRTP) if(m_startRTP)
switch_channel_mark_answered(m_fsChannel); switch_channel_mark_answered(m_fsChannel);
else m_ChennelAnswer = true; else
if (m_active_chennel_fax) m_ChannelAnswer = true;
if (m_active_channel_fax)
RequestModeChangeT38("T.38\nT.38"); RequestModeChangeT38("T.38\nT.38");
else else
m_active_chennel_fax = true; m_active_channel_fax = true;
} }
PBoolean FSH323Connection::OnRequestModeChange(const H245_RequestMode & pdu, PBoolean FSH323Connection::OnRequestModeChange(const H245_RequestMode & pdu,
H245_RequestModeAck & /*ack*/, H245_RequestModeAck & /*ack*/,
...@@ -1138,7 +1244,8 @@ PBoolean FSH323Connection::OnRequestModeChange(const H245_RequestMode & pdu, ...@@ -1138,7 +1244,8 @@ PBoolean FSH323Connection::OnRequestModeChange(const H245_RequestMode & pdu,
return false; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnModeChanged [%p]\n",this);
for (PINDEX i = 0; i < newMode.GetSize(); i++) { for (PINDEX i = 0; i < newMode.GetSize(); i++) {
H323Capability * capability = localCapabilities.FindCapability(newMode[i]); H323Capability * capability = localCapabilities.FindCapability(newMode[i]);
...@@ -1150,7 +1257,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){ ...@@ -1150,7 +1257,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
if (type.m_application.GetTag() == H245_DataMode_application::e_t38fax){ 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"); 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_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; 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"); 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){ ...@@ -1160,7 +1267,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
} }
t38_options->T38VendorInfo = "0 0 0"; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38FaxVersion:%lu\n",(unsigned long)profile.m_version);
t38_options->T38MaxBitRate = type.m_bitRate*100; t38_options->T38MaxBitRate = type.m_bitRate*100;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38MaxBitRate:%d\n",t38_options->T38MaxBitRate); 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){ ...@@ -1188,7 +1295,7 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
t38_options->T38FaxUdpEC = "t38UDPRedundancy"; t38_options->T38FaxUdpEC = "t38UDPRedundancy";
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38FaxUdpEC:%s\n",t38_options->T38FaxUdpEC); 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); 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_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); 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,14 +1322,17 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){ ...@@ -1215,14 +1322,17 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode){
H323Connection::OnModeChanged(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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>PFSH323Connection::OnSendSignalSetup [%p]\n",this);
setupPDU.GetQ931().SetBearerCapabilities(Q931::TransferSpeech, 1); setupPDU.GetQ931().SetBearerCapabilities(Q931::TransferSpeech, 1);
return true; 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); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Got remote RTP address %s:%d [%p]\n",remoteIP,remotePort,this);
m_remotePort = remotePort; m_remotePort = remotePort;
...@@ -1230,21 +1340,26 @@ void FSH323Connection::setRemoteAddress(const char* remoteIP, WORD remotePort){ ...@@ -1230,21 +1340,26 @@ void FSH323Connection::setRemoteAddress(const char* remoteIP, WORD remotePort){
} }
} }
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); 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); 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); 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); h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
if (!tech_pvt) { if (!tech_pvt) {
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
} }
...@@ -1275,8 +1390,10 @@ switch_status_t FSH323Connection::kill_channel(int sig){ ...@@ -1275,8 +1390,10 @@ switch_status_t FSH323Connection::kill_channel(int sig){
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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::send_dtmf [%p]\n",this);
SendUserInputTone(dtmf->digit, dtmf->duration); SendUserInputTone(dtmf->digit, dtmf->duration);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
...@@ -1309,16 +1426,18 @@ void FSH323Connection::OnUserInputString(const PString &value) ...@@ -1309,16 +1426,18 @@ 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::CleanUpOnCall [%p]\n",this);
connectionState = ShuttingDownConnection; connectionState = ShuttingDownConnection;
} }
switch_status_t FSH323Connection::receive_message(switch_core_session_message_t *msg){ 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::receive_message MSG = %d\n",msg->message_id); 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_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) { switch (msg->message_id) {
case SWITCH_MESSAGE_INDICATE_BRIDGE: case SWITCH_MESSAGE_INDICATE_BRIDGE:
...@@ -1336,12 +1455,14 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t ...@@ -1336,12 +1455,14 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
break; break;
} }
case SWITCH_MESSAGE_INDICATE_DEFLECT: { case SWITCH_MESSAGE_INDICATE_DEFLECT: {
if (msg->string_arg != NULL)
TransferCall(msg->string_arg);
break; break;
} }
case SWITCH_MESSAGE_INDICATE_PROGRESS: { case SWITCH_MESSAGE_INDICATE_PROGRESS: {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
switch_mutex_lock(tech_pvt->h323_mutex); switch_mutex_lock(tech_pvt->h323_mutex);
if (m_txChennel && m_rxChennel){ if (m_txChannel && m_rxChannel){
m_callOnPreAnswer = true; m_callOnPreAnswer = true;
} }
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
...@@ -1349,7 +1470,7 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t ...@@ -1349,7 +1470,7 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
AnsweringCall(AnswerCallPending); AnsweringCall(AnswerCallPending);
AnsweringCall(AnswerCallDeferredWithMedia); AnsweringCall(AnswerCallDeferredWithMedia);
if (m_txChennel && m_rxChennel){ if (m_txChannel && m_rxChannel){
if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) {
switch_channel_mark_pre_answered(m_fsChannel); switch_channel_mark_pre_answered(m_fsChannel);
} }
...@@ -1370,13 +1491,13 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t ...@@ -1370,13 +1491,13 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
AnsweringCall(H323Connection::AnswerCallNow); AnsweringCall(H323Connection::AnswerCallNow);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Media started on connection [%p]\n",this); 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)) { 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-------------------->switch_channel_mark_answered(m_fsChannel) [%p]\n",this);
switch_channel_mark_answered(m_fsChannel); switch_channel_mark_answered(m_fsChannel);
} }
} else{ } else{
m_ChennelAnswer = true; m_ChannelAnswer = true;
if (fastStartState == FastStartDisabled){ 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_txAudioOpened.Wait START [%p]\n",this);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-------------------->m_rxAudioOpened.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 ...@@ -1396,10 +1517,10 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
m_isRequst_fax = true; m_isRequst_fax = true;
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); 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"); RequestModeChangeT38("T.38\nT.38");
else else
m_active_chennel_fax = true; m_active_channel_fax = true;
break; break;
} }
case SWITCH_MESSAGE_INDICATE_UDPTL_MODE:{ case SWITCH_MESSAGE_INDICATE_UDPTL_MODE:{
...@@ -1423,23 +1544,30 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t ...@@ -1423,23 +1544,30 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Received message id = %d [%p]\n", msg->message_id,this); 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); 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); // PTRACE(4, "mod_h323\tReceived event " << event->event_id << " on connection " << *this);
return SWITCH_STATUS_SUCCESS; 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,"======>FSH323Connection::state_change [%p]\n",this);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"State changed on connection [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"State changed on connection [%p]\n",this);
return SWITCH_STATUS_SUCCESS; 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_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); switch_channel_t *channel = switch_core_session_get_channel(m_fsSession);
if (channel == NULL) { if (channel == NULL) {
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
...@@ -1447,32 +1575,111 @@ switch_status_t FSH323Connection::on_init(){ ...@@ -1447,32 +1575,111 @@ switch_status_t FSH323Connection::on_init(){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Started routing for connection [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Started routing for connection [%p]\n",this);
switch_channel_set_state(channel, CS_ROUTING); switch_channel_set_state(channel, CS_ROUTING);
return SWITCH_STATUS_SUCCESS; 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); 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_status_t FSH323Connection::on_soft_execute()
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::on_soft_execute [%p]\n",this); 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_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); h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
tech_pvt->read_frame.flags = 0; tech_pvt->read_frame.flags = 0;
switch_set_flag_locked(tech_pvt, TFLAG_READING); 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_clear_flag_locked(tech_pvt, TFLAG_READING);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_audio_frame END\n"); 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); switch_mutex_lock(tech_pvt->h323_io_mutex);
if (switch_test_flag(tech_pvt, TFLAG_IO)) { if (switch_test_flag(tech_pvt, TFLAG_IO)) {
if (!switch_core_codec_ready(&tech_pvt->read_codec )) { 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 ...@@ -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"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::read_audio_frame END\n\n");
return status; 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) { if (tech_pvt->read_frame.flags & SFF_CNG) {
tech_pvt->read_frame.buflen = sizeof(m_buf); tech_pvt->read_frame.buflen = sizeof(m_buf);
tech_pvt->read_frame.data = m_buf; tech_pvt->read_frame.data = m_buf;
...@@ -1500,26 +1709,54 @@ switch_status_t FSH323Connection::read_audio_frame(switch_frame_t **frame, switc ...@@ -1500,26 +1709,54 @@ switch_status_t FSH323Connection::read_audio_frame(switch_frame_t **frame, switc
tech_pvt->read_frame.m = SWITCH_FALSE; tech_pvt->read_frame.m = SWITCH_FALSE;
tech_pvt->read_frame.seq = 0; tech_pvt->read_frame.seq = 0;
tech_pvt->read_frame.ssrc = 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 { } 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_mutex_unlock(tech_pvt->h323_io_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"--------->TFLAG_IO OFF\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"--------->TFLAG_IO OFF\n");
switch_yield(10000); switch_yield(10000);
} }
switch_mutex_unlock(tech_pvt->h323_io_mutex); switch_mutex_unlock(tech_pvt->h323_io_mutex);
switch_clear_flag_locked(tech_pvt, TFLAG_READING); 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"); 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_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; switch_status_t status = SWITCH_STATUS_SUCCESS;
h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession); h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
switch_assert(tech_pvt != NULL); switch_assert(tech_pvt != NULL);
...@@ -1547,30 +1784,34 @@ switch_status_t FSH323Connection::write_audio_frame(switch_frame_t *frame, switc ...@@ -1547,30 +1784,34 @@ switch_status_t FSH323Connection::write_audio_frame(switch_frame_t *frame, switc
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame END\n\n"); 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); 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; status = SWITCH_STATUS_GENERR;
} }
switch_clear_flag_locked(tech_pvt, TFLAG_WRITING); switch_clear_flag_locked(tech_pvt, TFLAG_WRITING);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame END\n\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323Connection::write_audio_frame END\n\n");
return status; 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); 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); 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( FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel(FSH323Connection& connection,
FSH323Connection& connection,
const H323Capability& capability, const H323Capability& capability,
Directions direction, Directions direction,
unsigned sessionID, unsigned sessionID,
...@@ -1581,17 +1822,12 @@ FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel( ...@@ -1581,17 +1822,12 @@ FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel(
, m_fsSession(connection.GetSession()) , m_fsSession(connection.GetSession())
, m_capability(&capability) , m_capability(&capability)
, m_RTPlocalPort(dataPort) , m_RTPlocalPort(dataPort)
, m_sessionID(sessionID){ , m_sessionID(sessionID)
{
h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(m_fsSession);
m_RTPlocalIP = (const char *)ip.AsString(); m_RTPlocalIP = (const char *)ip.AsString();
SetExternalAddress(H323TransportAddress(ip, dataPort), H323TransportAddress(ip, dataPort+1)); 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); 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;
m_fsChannel = switch_core_session_get_channel(m_fsSession); 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.GetPayloadType() return = %s\n",((capability.GetPayloadType() <= RTP_DataFrame::LastKnownPayloadType)?PayloadTypesNames[capability.GetPayloadType()]:"[pt=128]"));
...@@ -1606,13 +1842,13 @@ FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel( ...@@ -1606,13 +1842,13 @@ FSH323_ExternalRTPChannel::FSH323_ExternalRTPChannel(
OpalMediaFormat format(fname, FALSE); OpalMediaFormat format(fname, FALSE);
m_format = &format; m_format = &format;
payloadCode = format.GetPayloadType(); payloadCode = (BYTE)format.GetPayloadType();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------->payloadCode = %d\n",(int)payloadCode); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------->payloadCode = %d\n",(int)payloadCode);
} }
FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel(){ 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel %s [%p]\n",GetDirections[GetDirection()],this);
if (m_rtp_resetting) { if (m_rtp_resetting) {
switch_core_session_unlock_codec_read(m_fsSession); switch_core_session_unlock_codec_read(m_fsSession);
...@@ -1620,38 +1856,38 @@ FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel(){ ...@@ -1620,38 +1856,38 @@ FSH323_ExternalRTPChannel::~FSH323_ExternalRTPChannel(){
switch_core_session_unlock_codec_write(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_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); 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
switch_mutex_lock(tech_pvt->h323_mutex); 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; const char *err = NULL;
switch_rtp_flag_t flags; switch_rtp_flag_t flags;
char * timer_name = NULL; char * timer_name = NULL;
const char *var; 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); 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_mutex_unlock(tech_pvt->h323_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
return false; 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_mutex_unlock(tech_pvt->h323_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
return false; 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)) { 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)); 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_rxChannel = false;
m_conn->m_txChennel = 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_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_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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_lock_codec_write [%p]\n",m_fsSession);
...@@ -1674,8 +1910,13 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1674,8 +1910,13 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
} }
} }
m_conn->m_active_sessionID = sessionID; m_conn->m_active_sessionID = sessionID;
bool isAudio; bool isAudio = false;
switch_codec_t *codec = NULL;
unsigned m_codec_ms = m_capability->GetTxFramesInPacket(); 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()){ switch (m_capability->GetMainType()){
case H323Capability::e_Audio:{ case H323Capability::e_Audio:{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->H323Capability::e_Audio\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->H323Capability::e_Audio\n");
...@@ -1696,7 +1937,6 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1696,7 +1937,6 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
} }
default:break; 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,"------------------->GetFrameSize() return = %u\n",(unsigned)m_format->GetFrameSize());
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->GetFrameTime() return = %u\n",m_format->GetFrameTime()); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->GetFrameTime() return = %u\n",m_format->GetFrameTime());
...@@ -1705,28 +1945,31 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1705,28 +1945,31 @@ 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,"------------------->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)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------->GetH245CodecName() return = %s\n",(const char*)GetH245CodecName(m_capability));
if (GetDirection() == IsReceiver){ if (GetDirection() == IsReceiver) {
m_switchCodec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec; codec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec;
m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer; //m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer;
m_conn->m_rxChennel = true; m_conn->m_rxChannel = true;
}else{ } else {
m_switchCodec = isAudio ? &tech_pvt->write_codec : &tech_pvt->vid_write_codec; codec = isAudio ? &tech_pvt->write_codec : &tech_pvt->vid_write_codec;
m_conn->m_txChennel = true; m_conn->m_txChannel = true;
if (m_conn->m_callOnPreAnswer){ if (m_conn->m_callOnPreAnswer) {
m_switchCodec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec; codec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec;
m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer; //m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer;
} }
} }
if (switch_core_codec_init(m_switchCodec, GetH245CodecName(m_capability), NULL, // FMTP 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 8000, m_codec_ms, 1, // Channels
SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings
switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
if (switch_core_codec_init(m_switchCodec, GetH245CodecName(m_capability), NULL, // FMTP if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, // FMTP
8000, 0, 1, // Channels 8000, 0, 1, // Channels
SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings
switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { 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") 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); , 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);
...@@ -1734,44 +1977,45 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1734,44 +1977,45 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); 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") 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") 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); , GetMainTypes[m_capability->GetMainType()],(const char*)(m_capability->GetFormatName()),this);
if (GetDirection() == IsReceiver) { if (GetDirection() == IsReceiver) {
m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second; //m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
if (isAudio) { if (isAudio) {
switch_core_session_set_read_codec(m_fsSession, m_switchCodec); switch_core_session_set_read_codec(m_fsSession, codec);
if (switch_core_timer_init(m_switchTimer, /*if (switch_core_timer_init(m_switchTimer,
"soft", "soft",
m_switchCodec->implementation->microseconds_per_packet / 1000, codec->implementation->microseconds_per_packet / 1000,
m_switchCodec->implementation->samples_per_packet, codec->implementation->samples_per_packet,
switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) {
switch_core_codec_destroy(m_switchCodec);
m_switchCodec = NULL; switch_core_codec_destroy(codec);
codec = NULL;
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
return false; return false;
} }
switch_channel_set_variable(m_fsChannel,"timer_name","soft"); switch_channel_set_variable(m_fsChannel,"timer_name", "soft");*/
if (m_conn->m_ChennelProgress) if (m_conn->m_ChannelProgress)
switch_core_session_set_write_codec(m_fsSession, m_switchCodec); switch_core_session_set_write_codec(m_fsSession, codec);
} else { } else {
switch_core_session_set_video_read_codec(m_fsSession, m_switchCodec); switch_core_session_set_video_read_codec(m_fsSession, codec);
switch_channel_set_flag(m_fsChannel, CF_VIDEO); switch_channel_set_flag(m_fsChannel, CF_VIDEO);
} }
} else { } else {
if (isAudio) { if (isAudio) {
switch_core_session_set_write_codec(m_fsSession, m_switchCodec); switch_core_session_set_write_codec(m_fsSession, codec);
if (m_conn->m_callOnPreAnswer){ if (m_conn->m_callOnPreAnswer){
m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second; //m_readFrame.rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
switch_core_session_set_read_codec(m_fsSession, m_switchCodec); switch_core_session_set_read_codec(m_fsSession, codec);
if (switch_core_timer_init(m_switchTimer, /*if (switch_core_timer_init(m_switchTimer,
"soft", "soft",
m_switchCodec->implementation->microseconds_per_packet / 1000, m_switchCodec->implementation->microseconds_per_packet / 1000,
m_switchCodec->implementation->samples_per_packet, m_switchCodec->implementation->samples_per_packet,
...@@ -1782,10 +2026,10 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1782,10 +2026,10 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
return false; return false;
} }
switch_channel_set_variable(m_fsChannel,"timer_name","soft"); switch_channel_set_variable(m_fsChannel,"timer_name","soft");*/
} }
} else { } else {
switch_core_session_set_video_write_codec(m_fsSession, m_switchCodec); switch_core_session_set_video_write_codec(m_fsSession, codec);
switch_channel_set_flag(m_fsChannel, CF_VIDEO); switch_channel_set_flag(m_fsChannel, CF_VIDEO);
} }
} }
...@@ -1800,8 +2044,8 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1800,8 +2044,8 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
GetRemoteAddress(remoteIpAddress,m_RTPremotePort); GetRemoteAddress(remoteIpAddress,m_RTPremotePort);
m_RTPremoteIP = (const char *)remoteIpAddress.AsString(); 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,"------------------->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,"------------------->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",m_switchCodec->implementation->actual_samples_per_second); 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; bool ch_port = false;
if (tech_pvt->rtp_session != NULL){ if (tech_pvt->rtp_session != NULL){
...@@ -1824,25 +2068,35 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1824,25 +2068,35 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
if ((!m_conn->m_startRTP)) { if ((!m_conn->m_startRTP)) {
flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_DATAWAIT|SWITCH_RTP_FLAG_AUTO_CNG|SWITCH_RTP_FLAG_RAW_WRITE); 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 (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"))) { if ((var = switch_channel_get_variable(m_fsChannel, "timer_name"))) {
timer_name = (char *) var; 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, tech_pvt->rtp_session = switch_rtp_new((const char *)m_RTPlocalIP,
m_RTPlocalPort, m_RTPlocalPort,
(const char *)m_RTPremoteIP, (const char *)m_RTPremoteIP,
m_RTPremotePort, m_RTPremotePort,
(switch_payload_t)payloadCode, (switch_payload_t)payloadCode,
m_switchCodec->implementation->samples_per_packet, codec->implementation->samples_per_packet,
m_codec_ms * 1000, codec->implementation->microseconds_per_packet,
(switch_rtp_flag_t) flags, timer_name, &err, flags, timer_name, &err,
switch_core_session_get_pool(m_fsSession)); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->tech_pvt->rtp_session = %p\n",tech_pvt->rtp_session);
m_conn->m_startRTP = true; m_conn->m_startRTP = true;
if (switch_rtp_ready(tech_pvt->rtp_session)) { if (switch_rtp_ready(tech_pvt->rtp_session)) {
switch_channel_set_flag(m_fsChannel, CF_FS_RTP); 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_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_channel_hangup(m_fsChannel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
...@@ -1850,6 +2104,7 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1850,6 +2104,7 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
} }
} }
if (ch_port){ if (ch_port){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_io_mutex_lock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_io_mutex_lock\n");
switch_mutex_lock(tech_pvt->h323_io_mutex); switch_mutex_lock(tech_pvt->h323_io_mutex);
...@@ -1871,31 +2126,31 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1871,31 +2126,31 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
} }
if (m_conn->m_rtp_resetting) { if (m_conn->m_rtp_resetting) {
if (GetDirection() == IsReceiver){ if (GetDirection() == IsReceiver) {
switch_core_session_unlock_codec_read(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_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_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_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_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,"------------->switch_core_session_unlock_codec_read [%p]\n",m_fsSession);
} }
} }
} }
if (GetDirection() == IsReceiver) m_conn->m_rxAudioOpened.Signal(); if (GetDirection() == IsReceiver)
else m_conn->m_txAudioOpened.Signal(); m_conn->m_rxAudioOpened.Signal();
else
m_conn->m_txAudioOpened.Signal();
if ( m_conn->m_ChennelAnswer && m_conn->m_rxChennel && m_conn->m_txChennel){ if (m_conn->m_ChannelAnswer && m_conn->m_rxChannel && m_conn->m_txChannel)
switch_channel_mark_answered(m_fsChannel); 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); 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); 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,"------------------------->switch_rtp_udptl_mode\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->switch_rtp_udptl_mode\n");
...@@ -1908,13 +2163,12 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ ...@@ -1908,13 +2163,12 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
return true; return true;
} }
PBoolean FSH323_ExternalRTPChannel::OnReceivedPDU(const H245_H2250LogicalChannelParameters& param, unsigned& errorCode)
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); 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))
...@@ -1927,23 +2181,27 @@ PBoolean FSH323_ExternalRTPChannel::OnReceivedPDU( ...@@ -1927,23 +2181,27 @@ PBoolean FSH323_ExternalRTPChannel::OnReceivedPDU(
return true; return true;
} }
PBoolean FSH323_ExternalRTPChannel::OnSendingPDU(H245_H2250LogicalChannelParameters& param){ PBoolean FSH323_ExternalRTPChannel::OnSendingPDU(H245_H2250LogicalChannelParameters& param)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_ExternalRTPChannel::OnSendingPDU [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_ExternalRTPChannel::OnSendingPDU [%p]\n",this);
return H323_ExternalRTPChannel::OnSendingPDU(param); return H323_ExternalRTPChannel::OnSendingPDU(param);
} }
PBoolean FSH323_ExternalRTPChannel::OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters& param){ PBoolean FSH323_ExternalRTPChannel::OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters& param)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnReceivedAckPDU [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnReceivedAckPDU [%p]\n",this);
return H323_ExternalRTPChannel::OnReceivedAckPDU(param); return H323_ExternalRTPChannel::OnReceivedAckPDU(param);
} }
void FSH323_ExternalRTPChannel::OnSendOpenAck(H245_H2250LogicalChannelAckParameters& param){ void FSH323_ExternalRTPChannel::OnSendOpenAck(H245_H2250LogicalChannelAckParameters& param)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnSendOpenAck [%p]\n",this); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323_ExternalRTPChannel::OnSendOpenAck [%p]\n",this);
H323_ExternalRTPChannel::OnSendOpenAck(param); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>FSH323EndPoint::FSMakeCall DST NUMBER = %s [%p]\n",(const char*)dest,this);
FSH323Connection * connection; FSH323Connection * connection;
...@@ -1967,14 +2225,15 @@ FSH323Connection * FSH323EndPoint::FSMakeCall(const PString & dest, void *userDa ...@@ -1967,14 +2225,15 @@ FSH323Connection * FSH323EndPoint::FSMakeCall(const PString & dest, void *userDa
if (!(connection = (FSH323Connection *)H323EndPoint::MakeCall(dest, token, userData))) { if (!(connection = (FSH323Connection *)H323EndPoint::MakeCall(dest, token, userData))) {
return NULL; return NULL;
} }
return connection; return connection;
} }
static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session, static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session,
switch_event_t *var_event, switch_event_t *var_event,
switch_caller_profile_t *outbound_profile, 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>create_outgoing_channel DST NUMBER = %s\n",outbound_profile->destination_number);
FSH323Connection * connection; FSH323Connection * connection;
...@@ -1992,7 +2251,8 @@ static switch_call_cause_t create_outgoing_channel(switch_core_session_t *sessio ...@@ -1992,7 +2251,8 @@ static switch_call_cause_t create_outgoing_channel(switch_core_session_t *sessio
} }
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"); 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);
...@@ -2022,14 +2282,17 @@ static switch_status_t on_destroy(switch_core_session_t *session){ ...@@ -2022,14 +2282,17 @@ static switch_status_t on_destroy(switch_core_session_t *session){
} }
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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"======>switch_status_t on_hangup [%p]\n",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); switch_channel_t *channel = switch_core_session_get_channel(session);
if (tech_pvt->me) { h323_private_t *tech_pvt = (h323_private_t *) switch_core_session_get_private(session);
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_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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->switch_core_session_unlock_codec_read [%p]\n",session);
switch_core_session_unlock_codec_write(session); switch_core_session_unlock_codec_write(session);
...@@ -2037,46 +2300,39 @@ static switch_status_t on_hangup(switch_core_session_t *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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
switch_mutex_lock(tech_pvt->h323_mutex); 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
if (tech_pvt->me->TryLock() == 1){ if (me->TryLock() == 1) {
tech_pvt->me->CloseAllLogicalChannels(true); me->CloseAllLogicalChannels(true);
tech_pvt->me->CloseAllLogicalChannels(false); me->CloseAllLogicalChannels(false);
tech_pvt->me->Unlock(); me->Unlock();
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"----->%s\n",(const char *)(tech_pvt->me->GetCallToken())); 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); Q931::CauseValues cause = (Q931::CauseValues)switch_channel_get_cause_q850(channel);
int trylock = tech_pvt->me->TryLock(); int trylock = me->TryLock();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> () = %d\n",trylock); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> () = %d\n",trylock);
if (trylock == 1){ if (trylock == 1) {
const PString currentToken(tech_pvt->me->GetCallToken()); const PString currentToken(me->GetCallToken());
FSH323Connection *connection = (FSH323Connection *)tech_pvt->me->GetEndPoint()->FindConnectionWithLock(currentToken); FSH323Connection *connection = (FSH323Connection *)me->GetEndPoint()->FindConnectionWithLock(currentToken);
connection->Unlock(); connection->Unlock();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n"); 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"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n");
}else if (trylock == -1){ } else if (trylock == -1) {
tech_pvt->me->Unlock(); me->Unlock();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"-----> UnLock()\n");
} }
tech_pvt->me->SetQ931Cause(cause); me->SetQ931Cause(cause);
tech_pvt->me->ClearCallSynchronous(NULL, H323TranslateToCallEndReason(cause, UINT_MAX)); me->ClearCallSynchronous(NULL, H323TranslateToCallEndReason(cause, UINT_MAX));
tech_pvt->me = NULL;
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n"); // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
// switch_mutex_lock(tech_pvt->h323_mutex); // switch_mutex_lock(tech_pvt->h323_mutex);
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_lock\n");
switch_mutex_lock(tech_pvt->h323_mutex); switch_mutex_lock(tech_pvt->h323_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------->h323_mutex_unlock\n");
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->h323_mutex);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
/*
* 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) #if defined(__GNUC__) && defined(HAVE_VISIBILITY)
#pragma GCC visibility push(default) #pragma GCC visibility push(default)
...@@ -94,7 +120,6 @@ const char* const GetMainTypes[H323Capability::e_NumMainTypes+1] = { ...@@ -94,7 +120,6 @@ const char* const GetMainTypes[H323Capability::e_NumMainTypes+1] = {
"NumMainTypes" "NumMainTypes"
}; };
extern void SetT38_IFP_PRE(); extern void SetT38_IFP_PRE();
class OpalMediaFormat; class OpalMediaFormat;
class H245_T38FaxProfile; class H245_T38FaxProfile;
...@@ -133,6 +158,9 @@ struct mod_h323_globals { ...@@ -133,6 +158,9 @@ struct mod_h323_globals {
char *codec_string; char *codec_string;
char *context; char *context;
char *dialplan; char *dialplan;
int use_rtp_timer;
char *rtp_timer_name;
int ptime_override_value;
}; };
extern struct mod_h323_globals mod_h323_globals; extern struct mod_h323_globals mod_h323_globals;
...@@ -161,24 +189,27 @@ typedef struct { ...@@ -161,24 +189,27 @@ typedef struct {
#define DECLARE_CALLBACK0(name) \ #define DECLARE_CALLBACK0(name) \
static switch_status_t name(switch_core_session_t *session) { \ static switch_status_t name(switch_core_session_t *session) { \
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); \
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() switch_status_t name()
#define DECLARE_CALLBACK1(name, type1, name1) \ #define DECLARE_CALLBACK1(name, type1, name1) \
static switch_status_t name(switch_core_session_t *session, 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); \ 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) switch_status_t name(type1 name1)
#define DECLARE_CALLBACK3(name, type1, name1, type2, name2, type3, name3) \ #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) { \ 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); \ 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) switch_status_t name(type1 name1, type2 name2, type3 name3)
class FSH323EndPoint; class FSH323EndPoint;
class FSProcess:public PLibraryProcess { class FSProcess:public PProcess {
PCLASSINFO(FSProcess, PLibraryProcess); PCLASSINFO(FSProcess, PProcess);
public: public:
FSProcess(); FSProcess();
...@@ -186,6 +217,8 @@ class FSProcess:public PLibraryProcess { ...@@ -186,6 +217,8 @@ class FSProcess:public PLibraryProcess {
bool Initialise(switch_loadable_module_interface_t *iface); bool Initialise(switch_loadable_module_interface_t *iface);
void Main()
{ }
FSH323EndPoint & GetH323EndPoint() const { FSH323EndPoint & GetH323EndPoint() const {
return *m_h323endpoint; return *m_h323endpoint;
} protected: } protected:
...@@ -193,8 +226,9 @@ class FSProcess:public PLibraryProcess { ...@@ -193,8 +226,9 @@ class FSProcess:public PLibraryProcess {
}; };
struct FSListener { struct FSListener {
FSListener() { FSListener()
} PString name; { }
PString name;
H323ListenerTCP *listenAddress; H323ListenerTCP *listenAddress;
PString localUserName; PString localUserName;
PString gatekeeper; PString gatekeeper;
...@@ -210,8 +244,7 @@ class FSH323EndPoint:public H323EndPoint { ...@@ -210,8 +244,7 @@ class FSH323EndPoint:public H323EndPoint {
~FSH323EndPoint(); ~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 H323Connection *CreateConnection(unsigned callReference, void *userData, H323Transport * transport, H323SignalPDU * setupPDU);
virtual bool OnSetGatewayPrefixes(PStringList & prefixes) const; virtual bool OnSetGatewayPrefixes(PStringList & prefixes) const;
...@@ -224,7 +257,8 @@ class FSH323EndPoint:public H323EndPoint { ...@@ -224,7 +257,8 @@ class FSH323EndPoint:public H323EndPoint {
switch_endpoint_interface_t *GetSwitchInterface() const { switch_endpoint_interface_t *GetSwitchInterface() const {
return m_freeswitch; return m_freeswitch;
} FSH323Connection *FSMakeCall(const PString & dest, void *userData); }
FSH323Connection *FSMakeCall(const PString & dest, void *userData);
list < FSListener > m_listeners; list < FSListener > m_listeners;
int m_ai; int m_ai;
int m_pi; int m_pi;
...@@ -330,15 +364,15 @@ class FSH323Connection:public H323Connection { ...@@ -330,15 +364,15 @@ class FSH323Connection:public H323Connection {
bool m_callOnPreAnswer; bool m_callOnPreAnswer;
bool m_startRTP; bool m_startRTP;
bool m_rxChennel; bool m_rxChannel;
bool m_txChennel; bool m_txChannel;
bool m_ChennelAnswer; bool m_ChannelAnswer;
bool m_ChennelProgress; bool m_ChannelProgress;
unsigned char m_select_dtmf; unsigned char m_select_dtmf;
PSyncPoint m_rxAudioOpened; PSyncPoint m_rxAudioOpened;
PSyncPoint m_txAudioOpened; PSyncPoint m_txAudioOpened;
unsigned m_active_sessionID; unsigned m_active_sessionID;
bool m_active_chennel_fax; bool m_active_channel_fax;
int m_rtp_resetting; int m_rtp_resetting;
bool m_isRequst_fax; bool m_isRequst_fax;
bool m_channel_hangup; bool m_channel_hangup;
...@@ -358,8 +392,7 @@ class FSH323_ExternalRTPChannel:public H323_ExternalRTPChannel { ...@@ -358,8 +392,7 @@ class FSH323_ExternalRTPChannel:public H323_ExternalRTPChannel {
PCLASSINFO(FSH323_ExternalRTPChannel, H323_ExternalRTPChannel); PCLASSINFO(FSH323_ExternalRTPChannel, H323_ExternalRTPChannel);
public: public:
/* Create a new channel. */ /* Create a new channel. */
FSH323_ExternalRTPChannel(FSH323Connection & connection, FSH323_ExternalRTPChannel(FSH323Connection & connection, const H323Capability & capability, Directions direction, unsigned sessionID, const PIPSocket::Address & ip, WORD dataPort);
const H323Capability & capability, Directions direction, unsigned sessionID, const PIPSocket::Address & ip, WORD dataPort);
/* Destructor */ /* Destructor */
~FSH323_ExternalRTPChannel(); ~FSH323_ExternalRTPChannel();
...@@ -375,10 +408,7 @@ class FSH323_ExternalRTPChannel:public H323_ExternalRTPChannel { ...@@ -375,10 +408,7 @@ class FSH323_ExternalRTPChannel:public H323_ExternalRTPChannel {
const H323Capability *m_capability; const H323Capability *m_capability;
switch_core_session_t *m_fsSession; switch_core_session_t *m_fsSession;
switch_channel_t *m_fsChannel; switch_channel_t *m_fsChannel;
switch_codec_t *m_switchCodec;
OpalMediaFormat *m_format; OpalMediaFormat *m_format;
switch_frame_t m_readFrame;
switch_timer_t *m_switchTimer;
PString m_RTPremoteIP; PString m_RTPremoteIP;
WORD m_RTPremotePort; WORD m_RTPremotePort;
PString m_RTPlocalIP; PString m_RTPlocalIP;
...@@ -393,15 +423,20 @@ class BaseG7231Capab:public H323AudioCapability { ...@@ -393,15 +423,20 @@ class BaseG7231Capab:public H323AudioCapability {
public: public:
BaseG7231Capab(const char *fname, bool annexA = true) BaseG7231Capab(const char *fname, bool annexA = true)
: H323AudioCapability(7, 4), m_name(fname), m_aa(annexA) { : H323AudioCapability(7, 4), m_name(fname), m_aa(annexA) {
} virtual PObject *Clone() const { }
virtual PObject *Clone() const {
return new BaseG7231Capab(*this); return new BaseG7231Capab(*this);
} virtual unsigned GetSubType() const { }
virtual unsigned GetSubType() const {
return H245_AudioCapability::e_g7231; return H245_AudioCapability::e_g7231;
} virtual PString GetFormatName() const { }
virtual PString GetFormatName() const {
return m_name; return m_name;
} virtual H323Codec *CreateCodec(H323Codec::Direction direction) const { }
virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
return 0; return 0;
} virtual Comparison Compare(const PObject & obj) const { }
virtual Comparison Compare(const PObject & obj) const {
Comparison res = H323AudioCapability::Compare(obj); Comparison res = H323AudioCapability::Compare(obj);
if (res != EqualTo) if (res != EqualTo)
return res; return res;
...@@ -411,13 +446,15 @@ class BaseG7231Capab:public H323AudioCapability { ...@@ -411,13 +446,15 @@ class BaseG7231Capab:public H323AudioCapability {
if (m_aa && !aa) if (m_aa && !aa)
return GreaterThan; return GreaterThan;
return EqualTo; return EqualTo;
} virtual bool OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const { }
virtual bool OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const {
pdu.SetTag(GetSubType()); pdu.SetTag(GetSubType());
H245_AudioCapability_g7231 & g7231 = pdu; H245_AudioCapability_g7231 & g7231 = pdu;
g7231.m_maxAl_sduAudioFrames = packetSize; g7231.m_maxAl_sduAudioFrames = packetSize;
g7231.m_silenceSuppression = m_aa; g7231.m_silenceSuppression = m_aa;
return true; 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) if (pdu.GetTag() != H245_AudioCapability::e_g7231)
return false; return false;
const H245_AudioCapability_g7231 & g7231 = pdu; const H245_AudioCapability_g7231 & g7231 = pdu;
...@@ -462,23 +499,29 @@ class BaseGSM0610Cap:public H323AudioCapability { ...@@ -462,23 +499,29 @@ class BaseGSM0610Cap:public H323AudioCapability {
BaseGSM0610Cap(const char *fname, unsigned type = H245_AudioCapability::e_gsmFullRate) 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) { : 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); return new BaseGSM0610Cap(*this);
} virtual H323Codec *CreateCodec(H323Codec::Direction direction) const { }
virtual H323Codec *CreateCodec(H323Codec::Direction direction) const {
return 0; return 0;
} virtual unsigned GetSubType() const { }
virtual unsigned GetSubType() const {
return H245_AudioCapability::e_gsmFullRate; return H245_AudioCapability::e_gsmFullRate;
} virtual PString GetFormatName() const { }
virtual PString GetFormatName() const {
return m_name; 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); pdu.SetTag(H245_AudioCapability::e_gsmFullRate);
H245_GSMAudioCapability & gsm = pdu; H245_GSMAudioCapability & gsm = pdu;
gsm.m_audioUnitSize = packetSize * 33; gsm.m_audioUnitSize = packetSize * 33;
gsm.m_comfortNoise = m_comfortNoise; gsm.m_comfortNoise = m_comfortNoise;
gsm.m_scrambled = m_scrambled; gsm.m_scrambled = m_scrambled;
return true; 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) if (pdu.GetTag() != H245_AudioCapability::e_gsmFullRate)
return false; return false;
const H245_GSMAudioCapability & gsm = pdu; const H245_GSMAudioCapability & gsm = pdu;
...@@ -537,9 +580,9 @@ H323Channel * FSH323_T38Capability::CreateChannel( ...@@ -537,9 +580,9 @@ H323Channel * FSH323_T38Capability::CreateChannel(
const H245_H2250LogicalChannelParameters * params) const const H245_H2250LogicalChannelParameters * params) const
{ {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_T38Capability::CreateChannel %p sessionID= %u direction=%s [%p]\n" switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"FSH323_T38Capability::CreateChannel %p sessionID= %u direction=%s [%p]\n"
,&connection , &connection
,sessionID , sessionID
,GetDirections[direction]); , GetDirections[direction]);
return connection.CreateRealTimeLogicalChannel(*this, direction, sessionID, params); return connection.CreateRealTimeLogicalChannel(*this, direction, sessionID, params);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论