aboutsummaryrefslogtreecommitdiffstats
path: root/addons/ooh323cDriver.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-30 16:40:38 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-30 16:40:38 +0000
commite9d15cbea7a98184521c851500176da7aa424012 (patch)
treed3d6aa7ea86d11ecaa6e88efbc46a5dde1c63ea5 /addons/ooh323cDriver.c
parentb85bdd32a783a8f07004d41db8a696645685a331 (diff)
Move Asterisk-addons modules into the main Asterisk source tree.
Someone asked yesterday, "is there a good reason why we can't just put these modules in Asterisk?". After a brief discussion, as long as the modules are clearly set aside in their own directory and not enabled by default, it is perfectly fine. For more information about why a module goes in addons, see README-addons.txt. chan_ooh323 does not currently compile as it is behind some trunk API updates. However, it will not build by default, so it should be okay for now. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@204413 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'addons/ooh323cDriver.c')
-rw-r--r--addons/ooh323cDriver.c361
1 files changed, 361 insertions, 0 deletions
diff --git a/addons/ooh323cDriver.c b/addons/ooh323cDriver.c
new file mode 100644
index 000000000..5d7396abf
--- /dev/null
+++ b/addons/ooh323cDriver.c
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2004-2005 by Objective Systems, Inc.
+ *
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
+ * can also be viewed online at the following URL:
+ *
+ * http://www.obj-sys.com/open/license.html
+ *
+ * Any redistributions of this file including modified versions must
+ * maintain this copyright notice.
+ *
+ *****************************************************************************/
+
+#include "ooh323cDriver.h"
+
+#include <asterisk/pbx.h>
+#include <asterisk/logger.h>
+#include <asterisk/options.h>
+
+extern OOBOOL gH323Debug;
+/* ooh323c stack thread. */
+static pthread_t ooh323c_thread = AST_PTHREADT_NULL;
+static int grxframes = 240;
+
+static int gtxframes = 20;
+
+int ooh323c_start_receive_channel(ooCallData *call, ooLogicalChannel *pChannel);
+int ooh323c_start_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel);
+int ooh323c_stop_receive_channel(ooCallData *call, ooLogicalChannel *pChannel);
+int ooh323c_stop_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel);
+
+void* ooh323c_stack_thread(void* dummy)
+{
+
+ ooMonitorChannels();
+ return dummy;
+}
+
+int ooh323c_start_stack_thread()
+{
+ if(ast_pthread_create(&ooh323c_thread, NULL, ooh323c_stack_thread, NULL) < 0)
+ {
+ ast_log(LOG_ERROR, "Unable to start ooh323c thread.\n");
+ return -1;
+ }
+ return 0;
+}
+
+int ooh323c_stop_stack_thread(void)
+{
+ if(ooh323c_thread != AST_PTHREADT_NULL)
+ {
+ ooStopMonitor();
+ pthread_join(ooh323c_thread, NULL);
+ ooh323c_thread = AST_PTHREADT_NULL;
+ }
+ return 0;
+}
+
+int ooh323c_set_capability
+ (struct ast_codec_pref *prefs, int capability, int dtmf)
+{
+ int ret, x, format=0;
+ if(gH323Debug)
+ ast_verbose("\tAdding capabilities to H323 endpoint\n");
+
+ for(x=0; 0 != (format=ast_codec_pref_index(prefs, x)); x++)
+ {
+ if(format & AST_FORMAT_ULAW)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g711 ulaw capability to H323 endpoint\n");
+ ret= ooH323EpAddG711Capability(OO_G711ULAW64K, gtxframes, grxframes,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+ if(format & AST_FORMAT_ALAW)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g711 alaw capability to H323 endpoint\n");
+ ret= ooH323EpAddG711Capability(OO_G711ALAW64K, gtxframes, grxframes,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+
+ if(format & AST_FORMAT_G729A)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g729A capability to H323 endpoint\n");
+ ret = ooH323EpAddG729Capability(OO_G729A, 2, 24,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ if(gH323Debug)
+ ast_verbose("\tAdding g729 capability to H323 endpoint\n");
+ ret |= ooH323EpAddG729Capability(OO_G729, 2, 24,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+
+ if(format & AST_FORMAT_G723_1)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g7231 capability to H323 endpoint\n");
+ ret = ooH323EpAddG7231Capability(OO_G7231, 4, 7, FALSE,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ }
+
+ if(format & AST_FORMAT_H263)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding h263 capability to H323 endpoint\n");
+ ret = ooH323EpAddH263VideoCapability(OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ }
+
+ if(format & AST_FORMAT_GSM)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding gsm capability to H323 endpoint\n");
+ ret = ooH323EpAddGSMCapability(OO_GSMFULLRATE, 4, FALSE, FALSE,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ }
+
+ }
+
+ if(dtmf & H323_DTMF_RFC2833)
+ ret |= ooH323EpEnableDTMFRFC2833(0);
+ else if(dtmf & H323_DTMF_H245ALPHANUMERIC)
+ ret |= ooH323EpEnableDTMFH245Alphanumeric();
+ else if(dtmf & H323_DTMF_H245SIGNAL)
+ ret |= ooH323EpEnableDTMFH245Signal();
+
+ return ret;
+}
+
+int ooh323c_set_capability_for_call
+ (ooCallData *call, struct ast_codec_pref *prefs, int capability, int dtmf)
+{
+ int ret, x, txframes;
+ int format=0;
+ if(gH323Debug)
+ ast_verbose("\tAdding capabilities to call(%s, %s)\n", call->callType,
+ call->callToken);
+ if(dtmf & H323_DTMF_RFC2833)
+ ret |= ooCallEnableDTMFRFC2833(call,0);
+ else if(dtmf & H323_DTMF_H245ALPHANUMERIC)
+ ret |= ooCallEnableDTMFH245Alphanumeric(call);
+ else if(dtmf & H323_DTMF_H245SIGNAL)
+ ret |= ooCallEnableDTMFH245Signal(call);
+
+
+ for(x=0; 0 !=(format=ast_codec_pref_index(prefs, x)); x++)
+ {
+ if(format & AST_FORMAT_ULAW)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g711 ulaw capability to call(%s, %s)\n",
+ call->callType, call->callToken);
+ txframes = prefs->framing[x];
+ ret= ooCallAddG711Capability(call, OO_G711ULAW64K, txframes,
+ grxframes, OORXANDTX,
+ &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+ if(format & AST_FORMAT_ALAW)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g711 alaw capability to call(%s, %s)\n",
+ call->callType, call->callToken);
+ txframes = prefs->framing[x];
+ ret= ooCallAddG711Capability(call, OO_G711ALAW64K, txframes,
+ grxframes, OORXANDTX,
+ &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+
+ if(format & AST_FORMAT_G729A)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g729A capability to call(%s, %s)\n",
+ call->callType, call->callToken);
+ txframes = (prefs->framing[x])/10;
+ ret= ooCallAddG729Capability(call, OO_G729A, txframes, 24,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ if(gH323Debug)
+ ast_verbose("\tAdding g729 capability to call(%s, %s)\n",
+ call->callType, call->callToken);
+ ret|= ooCallAddG729Capability(call, OO_G729, txframes, 24,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+
+ if(format & AST_FORMAT_G723_1)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding g7231 capability to call (%s, %s)\n",
+ call->callType, call->callToken);
+ ret = ooCallAddG7231Capability(call, OO_G7231, 4, 7, FALSE,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ }
+
+ if(format & AST_FORMAT_H263)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding h263 capability to call (%s, %s)\n",
+ call->callType, call->callToken);
+ ret = ooCallAddH263VideoCapability(call, OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+
+ }
+
+ if(format & AST_FORMAT_GSM)
+ {
+ if(gH323Debug)
+ ast_verbose("\tAdding gsm capability to call(%s, %s)\n",
+ call->callType, call->callToken);
+ ret = ooCallAddGSMCapability(call, OO_GSMFULLRATE, 4, FALSE, FALSE,
+ OORXANDTX, &ooh323c_start_receive_channel,
+ &ooh323c_start_transmit_channel,
+ &ooh323c_stop_receive_channel,
+ &ooh323c_stop_transmit_channel);
+ }
+ }
+}
+
+int ooh323c_set_aliases(ooAliases * aliases)
+{
+ ooAliases *cur = aliases;
+ while(cur)
+ {
+ switch(cur->type)
+ {
+ case T_H225AliasAddress_dialedDigits:
+ ooH323EpAddAliasDialedDigits(cur->value);
+ break;
+ case T_H225AliasAddress_h323_ID:
+ ooH323EpAddAliasH323ID(cur->value);
+ break;
+ case T_H225AliasAddress_url_ID:
+ ooH323EpAddAliasURLID(cur->value);
+ break;
+ case T_H225AliasAddress_email_ID:
+ ooH323EpAddAliasEmailID(cur->value);
+ break;
+ default:
+ ast_debug(1, "Ignoring unknown alias type\n");
+ }
+ cur = cur->next;
+ }
+ return 1;
+}
+
+int ooh323c_start_receive_channel(ooCallData *call, ooLogicalChannel *pChannel)
+{
+ int fmt=-1;
+ fmt = convertH323CapToAsteriskCap(pChannel->chanCap->cap);
+ if(fmt>0)
+ ooh323_set_read_format(call, fmt);
+ else{
+ ast_log(LOG_ERROR, "Invalid capability type for receive channel %s\n",
+ call->callToken);
+ return -1;
+ }
+ return 1;
+}
+
+int ooh323c_start_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel)
+{
+ int fmt=-1;
+ fmt = convertH323CapToAsteriskCap(pChannel->chanCap->cap);
+ if(fmt>0)
+ ooh323_set_write_format(call, fmt);
+ else{
+ ast_log(LOG_ERROR, "Invalid capability type for receive channel %s\n",
+ call->callToken);
+ return -1;
+ }
+ setup_rtp_connection(call, pChannel->remoteIP, pChannel->remoteMediaPort);
+ return 1;
+}
+
+int ooh323c_stop_receive_channel(ooCallData *call, ooLogicalChannel *pChannel)
+{
+ return 1;
+}
+
+int ooh323c_stop_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel)
+{
+ close_rtp_connection(call);
+ return 1;
+}
+
+int convertH323CapToAsteriskCap(int cap)
+{
+
+ switch(cap)
+ {
+ case OO_G711ULAW64K:
+ return AST_FORMAT_ULAW;
+ case OO_G711ALAW64K:
+ return AST_FORMAT_ALAW;
+ case OO_GSMFULLRATE:
+ return AST_FORMAT_GSM;
+ case OO_G729:
+ return AST_FORMAT_G729A;
+ case OO_G729A:
+ return AST_FORMAT_G729A;
+ case OO_G7231:
+ return AST_FORMAT_G723_1;
+ case OO_H263VIDEO:
+ return AST_FORMAT_H263;
+ default:
+ ast_debug(1, "Cap %d is not supported by driver yet\n", cap);
+ return -1;
+ }
+
+ return -1;
+}
+
+