From: Jeff Peeler Date: Wed, 22 Apr 2009 19:20:53 +0000 (+0000) Subject: Make chan_h323 respect packetization settings X-Git-Tag: 1.4.25-rc1~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1b5f4a67db2bdf64819ba9597421bdb3734c897;p=thirdparty%2Fasterisk.git Make chan_h323 respect packetization settings Previously, packetization settings were ignored and now they are not. A new config option 'autoframing' has been added to mirror the way chan_sip handles it. Turning on the autoframing option (available both as a global option or per peer) overrides the local settings with the remote packetization settings. Testing was performed with varying packetization levels with the following codecs: ulaw, alaw, gsm, and g729. (closes issue #12415) Reported by: pj Patches: 2009012200_h323packetization.diff.txt uploaded by mvanbaak (license 7), modified by me git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@189991 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 695e3b406c..6125822dcb 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -1256,6 +1256,8 @@ static int update_common_options(struct ast_variable *v, struct call_options *op if (!strcasecmp(v->name, "allow")) { ast_parse_allow_disallow(&options->prefs, &options->capability, v->value, 1); + } else if (!strcasecmp(v->name, "autoframing")) { + options->autoframing = ast_true(v->value); } else if (!strcasecmp(v->name, "disallow")) { ast_parse_allow_disallow(&options->prefs, &options->capability, v->value, 0); } else if (!strcasecmp(v->name, "dtmfmode")) { @@ -2409,8 +2411,15 @@ static void set_peer_capabilities(unsigned call_reference, const char *token, in ast_log(LOG_DEBUG, "prefs[%d]=%s:%d\n", i, (prefs->order[i] ? ast_getformatname(1 << (prefs->order[i]-1)) : ""), prefs->framing[i]); } } - if (pvt->rtp) - ast_rtp_codec_setpref(pvt->rtp, &pvt->peer_prefs); + if (pvt->rtp) { + if (pvt->options.autoframing) { + ast_log(LOG_DEBUG, "Autoframing option set, using peer's packetization settings\n"); + ast_rtp_codec_setpref(pvt->rtp, &pvt->peer_prefs); + } else { + ast_log(LOG_DEBUG, "Autoframing option not set, using ignoring peer's packetization settings\n"); + ast_rtp_codec_setpref(pvt->rtp, &pvt->options.prefs); + } + } } ast_mutex_unlock(&pvt->lock); } @@ -2434,8 +2443,15 @@ static void set_local_capabilities(unsigned call_reference, const char *token) ast_mutex_unlock(&pvt->lock); h323_set_capabilities(token, capability, dtmfmode, &prefs, pref_codec); - if (h323debug) + if (h323debug) { + int i; + for (i = 0; i < 32; i++) { + if (!prefs.order[i]) + break; + ast_log(LOG_DEBUG, "local prefs[%d]=%s:%d\n", i, (prefs.order[i] ? ast_getformatname(1 << (prefs.order[i]-1)) : ""), prefs.framing[i]); + } ast_log(LOG_DEBUG, "Capabilities for connection %s is set\n", token); + } } static void *do_monitor(void *data) @@ -2816,6 +2832,7 @@ static int reload_config(int is_reload) global_options.dtmfmode = H323_DTMF_RFC2833; global_options.capability = GLOBAL_CAPABILITY; global_options.bridge = 1; /* Do native bridging by default */ + global_options.autoframing = 0; strcpy(default_context, "default"); h323_signalling_port = 1720; gatekeeper_disable = 1; diff --git a/channels/h323/ast_h323.cxx b/channels/h323/ast_h323.cxx index 7309f1549b..6c8b39d55f 100644 --- a/channels/h323/ast_h323.cxx +++ b/channels/h323/ast_h323.cxx @@ -1878,7 +1878,6 @@ void MyH323Connection::SetCapabilities(int cap, int dtmf_mode, void *_prefs, int struct ast_codec_pref *prefs = (struct ast_codec_pref *)_prefs; struct ast_format_list format; int frames_per_packet; - int max_frames_per_packet; localCapabilities.RemoveAll(); @@ -1904,9 +1903,9 @@ void MyH323Connection::SetCapabilities(int cap, int dtmf_mode, void *_prefs, int if (!(cap & codec) || (alreadysent & codec) || !(codec & AST_FORMAT_AUDIO_MASK)) continue; alreadysent |= codec; + /* format.cur_ms will be set to default if packetization is not explicitly set */ format = ast_codec_pref_getsize(prefs, codec); frames_per_packet = (format.inc_ms ? format.cur_ms / format.inc_ms : format.cur_ms); - max_frames_per_packet = (format.inc_ms ? format.max_ms / format.inc_ms : 0); switch(codec) { #if 0 case AST_FORMAT_SPEEX: @@ -1926,37 +1925,30 @@ void MyH323Connection::SetCapabilities(int cap, int dtmf_mode, void *_prefs, int AST_G729Capability *g729Cap; lastcap = localCapabilities.SetCapability(0, 0, g729aCap = new AST_G729ACapability(frames_per_packet)); lastcap = localCapabilities.SetCapability(0, 0, g729Cap = new AST_G729Capability(frames_per_packet)); - if (max_frames_per_packet) { - g729aCap->SetTxFramesInPacket(max_frames_per_packet); - g729Cap->SetTxFramesInPacket(max_frames_per_packet); - } + g729aCap->SetTxFramesInPacket(format.cur_ms); + g729Cap->SetTxFramesInPacket(format.cur_ms); break; case AST_FORMAT_G723_1: AST_G7231Capability *g7231Cap; lastcap = localCapabilities.SetCapability(0, 0, g7231Cap = new AST_G7231Capability(frames_per_packet, TRUE)); - if (max_frames_per_packet) - g7231Cap->SetTxFramesInPacket(max_frames_per_packet); + g7231Cap->SetTxFramesInPacket(format.cur_ms); lastcap = localCapabilities.SetCapability(0, 0, g7231Cap = new AST_G7231Capability(frames_per_packet, FALSE)); - if (max_frames_per_packet) - g7231Cap->SetTxFramesInPacket(max_frames_per_packet); + g7231Cap->SetTxFramesInPacket(format.cur_ms); break; case AST_FORMAT_GSM: AST_GSM0610Capability *gsmCap; lastcap = localCapabilities.SetCapability(0, 0, gsmCap = new AST_GSM0610Capability(frames_per_packet)); - if (max_frames_per_packet) - gsmCap->SetTxFramesInPacket(max_frames_per_packet); + gsmCap->SetTxFramesInPacket(format.cur_ms); break; case AST_FORMAT_ULAW: AST_G711Capability *g711uCap; lastcap = localCapabilities.SetCapability(0, 0, g711uCap = new AST_G711Capability(format.cur_ms, H323_G711Capability::muLaw)); - if (format.max_ms) - g711uCap->SetTxFramesInPacket(format.max_ms); + g711uCap->SetTxFramesInPacket(format.cur_ms); break; case AST_FORMAT_ALAW: AST_G711Capability *g711aCap; lastcap = localCapabilities.SetCapability(0, 0, g711aCap = new AST_G711Capability(format.cur_ms, H323_G711Capability::ALaw)); - if (format.max_ms) - g711aCap->SetTxFramesInPacket(format.max_ms); + g711aCap->SetTxFramesInPacket(format.cur_ms); break; default: alreadysent &= ~codec; diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h index f22e48b434..fa715b904a 100644 --- a/channels/h323/chan_h323.h +++ b/channels/h323/chan_h323.h @@ -64,6 +64,7 @@ typedef struct call_options { int bridge; int nat; int tunnelOptions; + int autoframing; /*!< turn on to override local settings with remote framing length */ struct ast_codec_pref prefs; } call_options_t;