[asterisk-commits] rmudgett: branch 13 r434424 - in /branches/13: bridges/ channels/dahdi/ inclu...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Apr 8 13:14:03 CDT 2015


Author: rmudgett
Date: Wed Apr  8 13:14:00 2015
New Revision: 434424

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=434424
Log:
Bridging: Eliminate the unnecessary make channel compatible with bridge operation.

When a channel enters the bridging system it is first made compatible with
the bridge and then the bridge technology makes the channel compatible
with the technology.  For all but the DAHDI native and softmix bridge
technologies the make channel compatible with the bridge step is an
effective noop because the other technologies allow all audio formats.
For the DAHDI native bridge technology it doesn't matter because it is not
an initial bridge technology and chan_dahdi allows only one native format
per channel.  For the softmix bridge technology, it is a noop at best and
harmful at worst because the wrong translation path could be setup if the
channel's native formats allow more than one audio format.

This is an intermediate patch for a series of patches aimed at improving
translation path choices.

* Removed code dealing with the unnecessary step of making the channel
compatible with the bridge.

ASTERISK-24841
Reported by: Matt Jordan

Review: https://reviewboard.asterisk.org/r/4600/

Modified:
    branches/13/bridges/bridge_holding.c
    branches/13/bridges/bridge_native_rtp.c
    branches/13/bridges/bridge_simple.c
    branches/13/bridges/bridge_softmix.c
    branches/13/channels/dahdi/bridge_native_dahdi.c
    branches/13/include/asterisk/bridge_technology.h
    branches/13/main/bridge.c

Modified: branches/13/bridges/bridge_holding.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/bridges/bridge_holding.c?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/bridges/bridge_holding.c (original)
+++ branches/13/bridges/bridge_holding.c Wed Apr  8 13:14:00 2015
@@ -428,21 +428,17 @@
 
 static int unload_module(void)
 {
-	ao2_cleanup(holding_bridge.format_capabilities);
-	holding_bridge.format_capabilities = NULL;
-	return ast_bridge_technology_unregister(&holding_bridge);
+	ast_bridge_technology_unregister(&holding_bridge);
+	return 0;
 }
 
 static int load_module(void)
 {
-	if (!(holding_bridge.format_capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
+	if (ast_bridge_technology_register(&holding_bridge)) {
+		unload_module();
 		return AST_MODULE_LOAD_DECLINE;
 	}
-	ast_format_cap_append_by_type(holding_bridge.format_capabilities, AST_MEDIA_TYPE_AUDIO);
-	ast_format_cap_append_by_type(holding_bridge.format_capabilities, AST_MEDIA_TYPE_VIDEO);
-	ast_format_cap_append_by_type(holding_bridge.format_capabilities, AST_MEDIA_TYPE_TEXT);
-
-	return ast_bridge_technology_register(&holding_bridge);
+	return AST_MODULE_LOAD_SUCCESS;
 }
 
 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Holding bridge module");

Modified: branches/13/bridges/bridge_native_rtp.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/bridges/bridge_native_rtp.c?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/bridges/bridge_native_rtp.c (original)
+++ branches/13/bridges/bridge_native_rtp.c Wed Apr  8 13:14:00 2015
@@ -474,20 +474,17 @@
 
 static int unload_module(void)
 {
-	ao2_t_ref(native_rtp_bridge.format_capabilities, -1, "Dispose of capabilities in module unload");
-	return ast_bridge_technology_unregister(&native_rtp_bridge);
+	ast_bridge_technology_unregister(&native_rtp_bridge);
+	return 0;
 }
 
 static int load_module(void)
 {
-	if (!(native_rtp_bridge.format_capabilities = ast_format_cap_alloc(0))) {
+	if (ast_bridge_technology_register(&native_rtp_bridge)) {
+		unload_module();
 		return AST_MODULE_LOAD_DECLINE;
 	}
-	ast_format_cap_append_by_type(native_rtp_bridge.format_capabilities, AST_MEDIA_TYPE_AUDIO);
-	ast_format_cap_append_by_type(native_rtp_bridge.format_capabilities, AST_MEDIA_TYPE_VIDEO);
-	ast_format_cap_append_by_type(native_rtp_bridge.format_capabilities, AST_MEDIA_TYPE_TEXT);
-
-	return ast_bridge_technology_register(&native_rtp_bridge);
+	return AST_MODULE_LOAD_SUCCESS;
 }
 
 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Native RTP bridging module");

Modified: branches/13/bridges/bridge_simple.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/bridges/bridge_simple.c?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/bridges/bridge_simple.c (original)
+++ branches/13/bridges/bridge_simple.c Wed Apr  8 13:14:00 2015
@@ -76,21 +76,17 @@
 
 static int unload_module(void)
 {
-	ao2_cleanup(simple_bridge.format_capabilities);
-	simple_bridge.format_capabilities = NULL;
-	return ast_bridge_technology_unregister(&simple_bridge);
+	ast_bridge_technology_unregister(&simple_bridge);
+	return 0;
 }
 
 static int load_module(void)
 {
-	if (!(simple_bridge.format_capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
+	if (ast_bridge_technology_register(&simple_bridge)) {
+		unload_module();
 		return AST_MODULE_LOAD_DECLINE;
 	}
-	ast_format_cap_append_by_type(simple_bridge.format_capabilities, AST_MEDIA_TYPE_AUDIO);
-	ast_format_cap_append_by_type(simple_bridge.format_capabilities, AST_MEDIA_TYPE_VIDEO);
-	ast_format_cap_append_by_type(simple_bridge.format_capabilities, AST_MEDIA_TYPE_TEXT);
-
-	return ast_bridge_technology_register(&simple_bridge);
+	return AST_MODULE_LOAD_SUCCESS;
 }
 
 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Simple two channel bridging module");

Modified: branches/13/bridges/bridge_softmix.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/bridges/bridge_softmix.c?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/bridges/bridge_softmix.c (original)
+++ branches/13/bridges/bridge_softmix.c Wed Apr  8 13:14:00 2015
@@ -1194,18 +1194,17 @@
 
 static int unload_module(void)
 {
-	ao2_cleanup(softmix_bridge.format_capabilities);
-	softmix_bridge.format_capabilities = NULL;
-	return ast_bridge_technology_unregister(&softmix_bridge);
+	ast_bridge_technology_unregister(&softmix_bridge);
+	return 0;
 }
 
 static int load_module(void)
 {
-	if (!(softmix_bridge.format_capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
+	if (ast_bridge_technology_register(&softmix_bridge)) {
+		unload_module();
 		return AST_MODULE_LOAD_DECLINE;
 	}
-	ast_format_cap_append(softmix_bridge.format_capabilities, ast_format_slin, 0);
-	return ast_bridge_technology_register(&softmix_bridge);
+	return AST_MODULE_LOAD_SUCCESS;
 }
 
 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Multi-party software based channel mixing");

Modified: branches/13/channels/dahdi/bridge_native_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/channels/dahdi/bridge_native_dahdi.c?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/channels/dahdi/bridge_native_dahdi.c (original)
+++ branches/13/channels/dahdi/bridge_native_dahdi.c Wed Apr  8 13:14:00 2015
@@ -893,7 +893,6 @@
 void dahdi_native_unload(void)
 {
 	ast_bridge_technology_unregister(&native_bridge);
-	ao2_cleanup(native_bridge.format_capabilities);
 }
 
 /*!
@@ -908,18 +907,10 @@
 {
 	dahdi_tech = tech;
 
-	native_bridge.format_capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
-	if (!native_bridge.format_capabilities) {
+	if (__ast_bridge_technology_register(&native_bridge, mod)) {
+		dahdi_native_unload();
 		return -1;
 	}
 
-	/*
-	 * This is used to make channels compatible with the bridge
-	 * itself not with each other.
-	 */
-	ast_format_cap_append(native_bridge.format_capabilities, ast_format_slin, 0);
-	ast_format_cap_append(native_bridge.format_capabilities, ast_format_ulaw, 0);
-	ast_format_cap_append(native_bridge.format_capabilities, ast_format_alaw, 0);
-
-	return __ast_bridge_technology_register(&native_bridge, mod);
-}
+	return 0;
+}

Modified: branches/13/include/asterisk/bridge_technology.h
URL: http://svnview.digium.com/svn/asterisk/branches/13/include/asterisk/bridge_technology.h?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/include/asterisk/bridge_technology.h (original)
+++ branches/13/include/asterisk/bridge_technology.h Wed Apr  8 13:14:00 2015
@@ -152,7 +152,10 @@
 	 * \note On entry, bridge is already locked.
 	 */
 	int (*write)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame);
-	/*! Formats that the bridge technology supports */
+	/*!
+	 * \brief Formats that the bridge technology supports
+	 * \note This is no longer used.  It remains for ABI compatibility.
+	 */
 	struct ast_format_cap *format_capabilities;
 	/*! TRUE if the bridge technology is currently suspended. */
 	unsigned int suspended:1;

Modified: branches/13/main/bridge.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/main/bridge.c?view=diff&rev=434424&r1=434423&r2=434424
==============================================================================
--- branches/13/main/bridge.c (original)
+++ branches/13/main/bridge.c Wed Apr  8 13:14:00 2015
@@ -129,7 +129,6 @@
 #define ATTENDEDTRANSFER "ATTENDEDTRANSFER"
 
 static void cleanup_video_mode(struct ast_bridge *bridge);
-static int bridge_make_compatible(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);
 
 /*! Default DTMF keys for built in features */
 static char builtin_features_dtmf[AST_BRIDGE_BUILTIN_END][MAXIMUM_DTMF_FEATURE_STRING];
@@ -415,9 +414,6 @@
  */
 static void bridge_channel_complete_join(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 {
-	/* Make the channel compatible with the bridge */
-	bridge_make_compatible(bridge, bridge_channel);
-
 	/* Tell the bridge technology we are joining so they set us up */
 	ast_debug(1, "Bridge %s: %p(%s) is joining %s technology\n",
 		bridge->uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan),
@@ -953,74 +949,6 @@
 	ast_bridge_unlock(bridge);
 
 	ao2_ref(bridge, -1);
-
-	return 0;
-}
-
-static int bridge_make_compatible(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
-{
-	struct ast_str *codec_buf = ast_str_alloca(64);
-	struct ast_format *best_format;
-	RAII_VAR(struct ast_format *, read_format, NULL, ao2_cleanup);
-	RAII_VAR(struct ast_format *, write_format, NULL, ao2_cleanup);
-
-	ast_channel_lock(bridge_channel->chan);
-	read_format = ao2_bump(ast_channel_readformat(bridge_channel->chan));
-	write_format = ao2_bump(ast_channel_writeformat(bridge_channel->chan));
-	ast_channel_unlock(bridge_channel->chan);
-
-	/* Are the formats currently in use something this bridge can handle? */
-	if (ast_format_cap_iscompatible_format(bridge->technology->format_capabilities, read_format) == AST_FORMAT_CMP_NOT_EQUAL) {
-		best_format = ast_format_cap_get_format(bridge->technology->format_capabilities, 0);
-
-		/* Read format is a no go... */
-		ast_debug(1, "Bridge technology %s wants to read any of formats %s but channel has %s\n",
-			bridge->technology->name,
-			ast_format_cap_get_names(bridge->technology->format_capabilities, &codec_buf),
-			ast_format_get_name(read_format));
-
-		/* Switch read format to the best one chosen */
-		if (ast_set_read_format(bridge_channel->chan, best_format)) {
-			ast_log(LOG_WARNING, "Failed to set channel %s to read format %s\n",
-				ast_channel_name(bridge_channel->chan), ast_format_get_name(best_format));
-			ao2_cleanup(best_format);
-			return -1;
-		}
-		ast_debug(1, "Bridge %s put channel %s into read format %s\n",
-			bridge->uniqueid, ast_channel_name(bridge_channel->chan),
-			ast_format_get_name(best_format));
-		ao2_cleanup(best_format);
-	} else {
-		ast_debug(1, "Bridge %s is happy that channel %s already has read format %s\n",
-			bridge->uniqueid, ast_channel_name(bridge_channel->chan),
-			ast_format_get_name(read_format));
-	}
-
-	if (ast_format_cap_iscompatible_format(bridge->technology->format_capabilities, write_format) == AST_FORMAT_CMP_NOT_EQUAL) {
-		best_format = ast_format_cap_get_format(bridge->technology->format_capabilities, 0);
-
-		/* Write format is a no go... */
-		ast_debug(1, "Bridge technology %s wants to write any of formats %s but channel has %s\n",
-			bridge->technology->name,
-			ast_format_cap_get_names(bridge->technology->format_capabilities, &codec_buf),
-			ast_format_get_name(write_format));
-
-		/* Switch write format to the best one chosen */
-		if (ast_set_write_format(bridge_channel->chan, best_format)) {
-			ast_log(LOG_WARNING, "Failed to set channel %s to write format %s\n",
-				ast_channel_name(bridge_channel->chan), ast_format_get_name(best_format));
-			ao2_cleanup(best_format);
-			return -1;
-		}
-		ast_debug(1, "Bridge %s put channel %s into write format %s\n",
-			bridge->uniqueid, ast_channel_name(bridge_channel->chan),
-			ast_format_get_name(best_format));
-		ao2_cleanup(best_format);
-	} else {
-		ast_debug(1, "Bridge %s is happy that channel %s already has write format %s\n",
-			bridge->uniqueid, ast_channel_name(bridge_channel->chan),
-			ast_format_get_name(write_format));
-	}
 
 	return 0;
 }




More information about the asterisk-commits mailing list