[asterisk-commits] may: branch may/ooh323_qsig r397851 - in /team/may/ooh323_qsig: ./ apps/ brid...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Aug 28 03:59:08 CDT 2013


Author: may
Date: Wed Aug 28 03:58:51 2013
New Revision: 397851

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=397851
Log: (empty)

Added:
    team/may/ooh323_qsig/include/asterisk/bucket.h
      - copied unchanged from r397820, trunk/include/asterisk/bucket.h
    team/may/ooh323_qsig/include/asterisk/opus.h
      - copied unchanged from r397820, trunk/include/asterisk/opus.h
    team/may/ooh323_qsig/main/bucket.c
      - copied unchanged from r397820, trunk/main/bucket.c
    team/may/ooh323_qsig/res/res_format_attr_opus.c
      - copied unchanged from r397820, trunk/res/res_format_attr_opus.c
    team/may/ooh323_qsig/tests/test_bucket.c
      - copied unchanged from r397820, trunk/tests/test_bucket.c
Modified:
    team/may/ooh323_qsig/   (props changed)
    team/may/ooh323_qsig/CHANGES
    team/may/ooh323_qsig/apps/app_agent_pool.c
    team/may/ooh323_qsig/apps/app_bridgewait.c
    team/may/ooh323_qsig/apps/app_chanspy.c
    team/may/ooh323_qsig/apps/app_confbridge.c
    team/may/ooh323_qsig/apps/app_dial.c
    team/may/ooh323_qsig/apps/app_directory.c
    team/may/ooh323_qsig/apps/app_followme.c
    team/may/ooh323_qsig/apps/app_voicemail.c
    team/may/ooh323_qsig/bridges/bridge_builtin_features.c
    team/may/ooh323_qsig/bridges/bridge_builtin_interval_features.c
    team/may/ooh323_qsig/bridges/bridge_holding.c
    team/may/ooh323_qsig/bridges/bridge_native_rtp.c
    team/may/ooh323_qsig/build_tools/menuselect-deps.in
    team/may/ooh323_qsig/channels/Makefile
    team/may/ooh323_qsig/channels/chan_dahdi.c
    team/may/ooh323_qsig/channels/chan_iax2.c
    team/may/ooh323_qsig/channels/chan_motif.c
    team/may/ooh323_qsig/channels/chan_pjsip.c
    team/may/ooh323_qsig/channels/chan_sip.c
    team/may/ooh323_qsig/channels/sig_analog.c
    team/may/ooh323_qsig/channels/sig_pri.c
    team/may/ooh323_qsig/channels/sig_ss7.c
    team/may/ooh323_qsig/configs/cel.conf.sample
    team/may/ooh323_qsig/configure
    team/may/ooh323_qsig/configure.ac
    team/may/ooh323_qsig/contrib/scripts/sip_to_res_sip/astconfigparser.py
    team/may/ooh323_qsig/contrib/scripts/sip_to_res_sip/astdicts.py
    team/may/ooh323_qsig/contrib/scripts/sip_to_res_sip/sip_to_res_sip.py
    team/may/ooh323_qsig/include/asterisk/astmm.h
    team/may/ooh323_qsig/include/asterisk/autoconfig.h.in
    team/may/ooh323_qsig/include/asterisk/backtrace.h
    team/may/ooh323_qsig/include/asterisk/bridge.h
    team/may/ooh323_qsig/include/asterisk/bridge_channel.h
    team/may/ooh323_qsig/include/asterisk/bridge_channel_internal.h
    team/may/ooh323_qsig/include/asterisk/bridge_internal.h
    team/may/ooh323_qsig/include/asterisk/channel.h
    team/may/ooh323_qsig/include/asterisk/config_options.h
    team/may/ooh323_qsig/include/asterisk/format.h
    team/may/ooh323_qsig/include/asterisk/lock.h
    team/may/ooh323_qsig/include/asterisk/musiconhold.h
    team/may/ooh323_qsig/include/asterisk/say.h
    team/may/ooh323_qsig/include/asterisk/sorcery.h
    team/may/ooh323_qsig/include/asterisk/stasis_app.h
    team/may/ooh323_qsig/include/asterisk/stasis_app_impl.h
    team/may/ooh323_qsig/include/asterisk/utils.h
    team/may/ooh323_qsig/main/Makefile
    team/may/ooh323_qsig/main/asterisk.c
    team/may/ooh323_qsig/main/astmm.c
    team/may/ooh323_qsig/main/astobj2.c
    team/may/ooh323_qsig/main/backtrace.c
    team/may/ooh323_qsig/main/bridge.c
    team/may/ooh323_qsig/main/bridge_basic.c
    team/may/ooh323_qsig/main/bridge_channel.c
    team/may/ooh323_qsig/main/cel.c
    team/may/ooh323_qsig/main/channel.c
    team/may/ooh323_qsig/main/channel_internal_api.c
    team/may/ooh323_qsig/main/config_options.c
    team/may/ooh323_qsig/main/features.c
    team/may/ooh323_qsig/main/features_config.c
    team/may/ooh323_qsig/main/format.c
    team/may/ooh323_qsig/main/frame.c
    team/may/ooh323_qsig/main/lock.c
    team/may/ooh323_qsig/main/logger.c
    team/may/ooh323_qsig/main/pbx.c
    team/may/ooh323_qsig/main/rtp_engine.c
    team/may/ooh323_qsig/main/say.c
    team/may/ooh323_qsig/main/sorcery.c
    team/may/ooh323_qsig/main/stasis_bridges.c
    team/may/ooh323_qsig/main/stasis_channels.c
    team/may/ooh323_qsig/main/utils.c
    team/may/ooh323_qsig/makeopts.in
    team/may/ooh323_qsig/res/ari/resource_bridges.c
    team/may/ooh323_qsig/res/ari/resource_bridges.h
    team/may/ooh323_qsig/res/parking/parking_applications.c
    team/may/ooh323_qsig/res/parking/parking_bridge_features.c
    team/may/ooh323_qsig/res/res_agi.c
    team/may/ooh323_qsig/res/res_ari_asterisk.c
    team/may/ooh323_qsig/res/res_ari_bridges.c
    team/may/ooh323_qsig/res/res_ari_events.c
    team/may/ooh323_qsig/res/res_musiconhold.c
    team/may/ooh323_qsig/res/res_parking.c
    team/may/ooh323_qsig/res/res_pjsip.c
    team/may/ooh323_qsig/res/res_pjsip/pjsip_configuration.c
    team/may/ooh323_qsig/res/res_pjsip/pjsip_options.c
    team/may/ooh323_qsig/res/res_pjsip_dtmf_info.c
    team/may/ooh323_qsig/res/res_pjsip_sdp_rtp.c
    team/may/ooh323_qsig/res/res_rtp_asterisk.c
    team/may/ooh323_qsig/res/res_stasis.c
    team/may/ooh323_qsig/res/stasis/app.c
    team/may/ooh323_qsig/res/stasis/app.h
    team/may/ooh323_qsig/res/stasis/control.c
    team/may/ooh323_qsig/rest-api-templates/param_parsing.mustache
    team/may/ooh323_qsig/rest-api-templates/res_ari_resource.c.mustache
    team/may/ooh323_qsig/rest-api/api-docs/bridges.json
    team/may/ooh323_qsig/tests/test_config.c
    team/may/ooh323_qsig/tests/test_sorcery.c
    team/may/ooh323_qsig/tests/test_sorcery_astdb.c
    team/may/ooh323_qsig/tests/test_sorcery_realtime.c

Propchange: team/may/ooh323_qsig/
            ('branch-11-blocked' removed)

Propchange: team/may/ooh323_qsig/
            ('branch-11-merged' removed)

Propchange: team/may/ooh323_qsig/
------------------------------------------------------------------------------
    branch-12-merged = /branches/12:1-397816

Propchange: team/may/ooh323_qsig/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Aug 28 03:58:51 2013
@@ -1,1 +1,1 @@
-/trunk:1-380157,380165-391000,391012,391016-393400,393410-393530,393542-393834,393843-394050,394065-394089,394103-394600,394623-394881,394894-395298,395316-395900,395906-396568,396581-396915,396922-397466
+/trunk:1-397850

Modified: team/may/ooh323_qsig/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/CHANGES?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/CHANGES (original)
+++ team/may/ooh323_qsig/CHANGES Wed Aug 28 03:58:51 2013
@@ -174,6 +174,15 @@
    was responsible for an attended transfer in a similar fashion to
    BLINDTRANSFER.
 
+
+Codecs
+------------------
+ * Added pass through support for VP8 and Opus
+
+ * Added format attribute negotiation for the Opus codec. Format attribute
+   negotiation is provided by the res_format_attr_opus module.
+
+
 AMI (Asterisk Manager Interface)
 ------------------
  * The SIPshowpeer action will now include a 'SubscribeContext' field for a peer
@@ -338,6 +347,10 @@
  * The CONTROL STREAM FILE command now accepts an offsetms parameter. This
    will start the playback of the audio at the position specified. It will
    also return the final position of the file in 'endpos'.
+
+ * The SAY ALPHA command now accepts an additional parameter to control
+   whether it specifies the case of uppercase, lowercase, or all letters to
+   provide functionality similar to SayAlphaCase.
 
 CDR (Call Detail Records)
 ------------------

Modified: team/may/ooh323_qsig/apps/app_agent_pool.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_agent_pool.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_agent_pool.c (original)
+++ team/may/ooh323_qsig/apps/app_agent_pool.c Wed Aug 28 03:58:51 2013
@@ -49,6 +49,7 @@
 #include "asterisk/astobj2.h"
 #include "asterisk/stringfields.h"
 #include "asterisk/stasis_channels.h"
+#include "asterisk/causes.h"
 
 /*** DOCUMENTATION
 	<application name="AgentLogin" language="en_US">
@@ -760,7 +761,7 @@
 
 	ast_party_connected_line_free(&doomed->waiting_colp);
 	if (doomed->caller_bridge) {
-		ast_bridge_destroy(doomed->caller_bridge);
+		ast_bridge_destroy(doomed->caller_bridge, AST_CAUSE_USER_BUSY);
 		doomed->caller_bridge = NULL;
 	}
 	if (doomed->logged) {
@@ -1019,15 +1020,17 @@
 
 	if (!caller_bridge) {
 		/* Reset agent. */
-		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+			AST_CAUSE_NORMAL_CLEARING);
 		return;
 	}
 	res = ast_bridge_move(caller_bridge, bridge_channel->bridge, bridge_channel->chan,
 		NULL, 0);
 	if (res) {
 		/* Reset agent. */
-		ast_bridge_destroy(caller_bridge);
-		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+		ast_bridge_destroy(caller_bridge, AST_CAUSE_USER_BUSY);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+			AST_CAUSE_NORMAL_CLEARING);
 		return;
 	}
 	ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_ANSWER, NULL, 0);
@@ -1122,13 +1125,15 @@
 
 	if (deferred_logoff) {
 		ast_debug(1, "Agent %s: Deferred logoff.\n", agent->username);
-		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+			AST_CAUSE_NORMAL_CLEARING);
 	} else if (probation_timedout) {
 		ast_debug(1, "Agent %s: Login complete.\n", agent->username);
 		agent_devstate_changed(agent->username);
 	} else if (ack_timedout) {
 		ast_debug(1, "Agent %s: Ack call timeout.\n", agent->username);
-		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+			AST_CAUSE_NORMAL_CLEARING);
 	} else if (wrapup_timedout) {
 		ast_debug(1, "Agent %s: Wrapup timeout. Ready for new call.\n", agent->username);
 		agent_devstate_changed(agent->username);
@@ -1233,7 +1238,8 @@
 		 * agent will have some slightly different behavior in corner
 		 * cases.
 		 */
-		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+			AST_CAUSE_NORMAL_CLEARING);
 		return 0;
 	}
 
@@ -1455,7 +1461,7 @@
 	agent_devstate_changed(agent->username);
 
 	if (caller_bridge) {
-		ast_bridge_destroy(caller_bridge);
+		ast_bridge_destroy(caller_bridge, AST_CAUSE_USER_BUSY);
 	}
 
 	send_agent_logoff(logged, agent->username, time_logged_in);
@@ -1479,6 +1485,7 @@
 	struct ast_bridge_features features;
 
 	if (ast_bridge_features_init(&features)) {
+		ast_channel_hangupcause_set(logged, AST_CAUSE_NORMAL_CLEARING);
 		goto agent_run_cleanup;
 	}
 	for (;;) {
@@ -1487,6 +1494,8 @@
 		struct agent_cfg *cfg_old;
 		struct ast_bridge *holding;
 		struct ast_bridge *caller_bridge;
+
+		ast_channel_hangupcause_set(logged, AST_CAUSE_NORMAL_CLEARING);
 
 		holding = ao2_global_obj_ref(agent_holding);
 		if (!holding) {
@@ -1535,7 +1544,7 @@
 		agent_unlock(agent);
 		ao2_ref(cfg_old, -1);
 		if (caller_bridge) {
-			ast_bridge_destroy(caller_bridge);
+			ast_bridge_destroy(caller_bridge, AST_CAUSE_USER_BUSY);
 		}
 
 		if (agent->state == AGENT_STATE_LOGGING_OUT
@@ -1661,13 +1670,14 @@
 		agent->caller_bridge = NULL;
 		agent_unlock(agent);
 		if (caller_bridge) {
-			ast_bridge_destroy(caller_bridge);
+			ast_bridge_destroy(caller_bridge, AST_CAUSE_USER_BUSY);
 		}
 		return;
 	}
 
 	/* Kick the agent out of the holding bridge to reset it. */
-	ast_bridge_channel_leave_bridge_nolock(logged, BRIDGE_CHANNEL_STATE_END);
+	ast_bridge_channel_leave_bridge_nolock(logged, BRIDGE_CHANNEL_STATE_END,
+		AST_CAUSE_NORMAL_CLEARING);
 	ast_bridge_channel_unlock(logged);
 }
 
@@ -1677,7 +1687,8 @@
 
 	if (agent->state == AGENT_STATE_CALL_PRESENT) {
 		ast_verb(3, "Agent '%s' did not respond.  Safety timeout.\n", agent->username);
-		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+			AST_CAUSE_USER_BUSY);
 		caller_abort_agent(agent);
 	}
 
@@ -1829,7 +1840,7 @@
 	case AGENT_STATE_LOGGING_OUT:
 		agent_unlock(agent);
 		ast_party_connected_line_free(&connected);
-		ast_bridge_destroy(caller_bridge);
+		ast_bridge_destroy(caller_bridge, 0);
 		ast_bridge_features_cleanup(&caller_features);
 		ast_verb(3, "Agent '%s' not logged in.\n", agent->username);
 		pbx_builtin_setvar_helper(chan, "AGENT_STATUS", "NOT_LOGGED_IN");
@@ -1843,7 +1854,7 @@
 	default:
 		agent_unlock(agent);
 		ast_party_connected_line_free(&connected);
-		ast_bridge_destroy(caller_bridge);
+		ast_bridge_destroy(caller_bridge, 0);
 		ast_bridge_features_cleanup(&caller_features);
 		ast_verb(3, "Agent '%s' is busy.\n", agent->username);
 		pbx_builtin_setvar_helper(chan, "AGENT_STATUS", "BUSY");
@@ -1855,7 +1866,7 @@
 	logged = agent_bridge_channel_get_lock(agent);
 	if (!logged) {
 		ast_party_connected_line_free(&connected);
-		ast_bridge_destroy(caller_bridge);
+		ast_bridge_destroy(caller_bridge, 0);
 		ast_bridge_features_cleanup(&caller_features);
 		ast_verb(3, "Agent '%s' not logged in.\n", agent->username);
 		pbx_builtin_setvar_helper(chan, "AGENT_STATUS", "NOT_LOGGED_IN");
@@ -1870,7 +1881,7 @@
 	ast_bridge_channel_unlock(logged);
 	ao2_ref(logged, -1);
 	if (res) {
-		ast_bridge_destroy(caller_bridge);
+		ast_bridge_destroy(caller_bridge, 0);
 		ast_bridge_features_cleanup(&caller_features);
 		ast_verb(3, "Agent '%s': Failed to alert the agent.\n", agent->username);
 		pbx_builtin_setvar_helper(chan, "AGENT_STATUS", "ERROR");
@@ -2499,7 +2510,7 @@
 	/* Destroy agent holding bridge. */
 	holding = ao2_global_obj_replace(agent_holding, NULL);
 	if (holding) {
-		ast_bridge_destroy(holding);
+		ast_bridge_destroy(holding, 0);
 	}
 
 	destroy_config();

Modified: team/may/ooh323_qsig/apps/app_bridgewait.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_bridgewait.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_bridgewait.c (original)
+++ team/may/ooh323_qsig/apps/app_bridgewait.c Wed Aug 28 03:58:51 2013
@@ -48,6 +48,7 @@
 #include "asterisk/bridge.h"
 #include "asterisk/musiconhold.h"
 #include "asterisk/astobj2.h"
+#include "asterisk/causes.h"
 
 /*** DOCUMENTATION
 	<application name="BridgeWait" language="en_US">
@@ -127,8 +128,9 @@
 static void wait_bridge_wrapper_destructor(void *obj)
 {
 	struct wait_bridge_wrapper *wrapper = obj;
+
 	if (wrapper->bridge) {
-		ast_bridge_destroy(wrapper->bridge);
+		ast_bridge_destroy(wrapper->bridge, 0);
 	}
 }
 
@@ -204,7 +206,8 @@
 static int bridgewait_timeout_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 {
 	ast_verb(3, "Channel %s timed out.\n", ast_channel_name(bridge_channel->chan));
-	ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+	ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+		AST_CAUSE_NORMAL_CLEARING);
 	return -1;
 }
 
@@ -321,9 +324,8 @@
 
 	bridge_wrapper = ao2_alloc_options(sizeof(*bridge_wrapper) + strlen(bridge_name) + 1,
 		wait_bridge_wrapper_destructor, AO2_ALLOC_OPT_LOCK_NOLOCK);
-
 	if (!bridge_wrapper) {
-		ast_bridge_destroy(bridge);
+		ast_bridge_destroy(bridge, 0);
 		return NULL;
 	}
 

Modified: team/may/ooh323_qsig/apps/app_chanspy.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_chanspy.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_chanspy.c (original)
+++ team/may/ooh323_qsig/apps/app_chanspy.c Wed Aug 28 03:58:51 2013
@@ -1048,7 +1048,7 @@
 								break;
 							}
 						} else {
-							res = ast_say_character_str(chan, peer_name, "", ast_channel_language(chan));
+							res = ast_say_character_str(chan, peer_name, "", ast_channel_language(chan), AST_SAY_CASE_NONE);
 						}
 					}
 					if (ptr && (num = atoi(ptr))) {

Modified: team/may/ooh323_qsig/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_confbridge.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_confbridge.c (original)
+++ team/may/ooh323_qsig/apps/app_confbridge.c Wed Aug 28 03:58:51 2013
@@ -892,7 +892,7 @@
 
 	/* Destroying a conference bridge is simple, all we have to do is destroy the bridging object */
 	if (conference->bridge) {
-		ast_bridge_destroy(conference->bridge);
+		ast_bridge_destroy(conference->bridge, 0);
 		conference->bridge = NULL;
 	}
 

Modified: team/may/ooh323_qsig/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_dial.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_dial.c (original)
+++ team/may/ooh323_qsig/apps/app_dial.c Wed Aug 28 03:58:51 2013
@@ -3024,7 +3024,6 @@
 
 				ast_channel_setoption(chan, AST_OPTION_OPRMODE, &oprmode, sizeof(oprmode), 0);
 			}
-/* BUGBUG bridge needs to set hangup cause on chan when peer breaks the bridge. */
 			setup_peer_after_bridge_goto(chan, peer, &opts, opt_args);
 			res = ast_bridge_call(chan, peer, &config);
 		}

Modified: team/may/ooh323_qsig/apps/app_directory.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_directory.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_directory.c (original)
+++ team/may/ooh323_qsig/apps/app_directory.c Wed Aug 28 03:58:51 2013
@@ -281,13 +281,13 @@
 		/* If Option 'e' was specified, also read the extension number with the name */
 		if (ast_test_flag(flags, OPT_SAYEXTENSION)) {
 			ast_stream_and_wait(chan, "vm-extension", AST_DIGIT_ANY);
-			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, ast_channel_language(chan));
+			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, ast_channel_language(chan), AST_SAY_CASE_NONE);
 		}
 	} else {
-		res = ast_say_character_str(chan, S_OR(name, ext), AST_DIGIT_ANY, ast_channel_language(chan));
+		res = ast_say_character_str(chan, S_OR(name, ext), AST_DIGIT_ANY, ast_channel_language(chan), AST_SAY_CASE_NONE);
 		if (!ast_strlen_zero(name) && ast_test_flag(flags, OPT_SAYEXTENSION)) {
 			ast_stream_and_wait(chan, "vm-extension", AST_DIGIT_ANY);
-			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, ast_channel_language(chan));
+			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, ast_channel_language(chan), AST_SAY_CASE_NONE);
 		}
 	}
 

Modified: team/may/ooh323_qsig/apps/app_followme.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_followme.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_followme.c (original)
+++ team/may/ooh323_qsig/apps/app_followme.c Wed Aug 28 03:58:51 2013
@@ -1424,7 +1424,7 @@
 			if (ast_waitstream(chan, "") < 0)
 				goto outrun;
 		}
-		ast_moh_start(chan, S_OR(targs->mohclass, NULL), NULL);
+		ast_moh_start(chan, targs->mohclass, NULL);
 	}
 
 	ast_channel_lock(chan);

Modified: team/may/ooh323_qsig/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/apps/app_voicemail.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/apps/app_voicemail.c (original)
+++ team/may/ooh323_qsig/apps/app_voicemail.c Wed Aug 28 03:58:51 2013
@@ -13683,7 +13683,7 @@
 		ast_debug(3, "Greeting not found for '%s@%s', falling back to mailbox number.\n", args_copy, context);
 		res = ast_stream_and_wait(chan, "vm-extension", AST_DIGIT_ANY);
 		if (!res) {
-			res = ast_say_character_str(chan, args_copy, AST_DIGIT_ANY, ast_channel_language(chan));
+			res = ast_say_character_str(chan, args_copy, AST_DIGIT_ANY, ast_channel_language(chan), AST_SAY_CASE_NONE);
 		}
 	}
 

Modified: team/may/ooh323_qsig/bridges/bridge_builtin_features.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/bridges/bridge_builtin_features.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/bridges/bridge_builtin_features.c (original)
+++ team/may/ooh323_qsig/bridges/bridge_builtin_features.c Wed Aug 28 03:58:51 2013
@@ -53,6 +53,7 @@
 #include "asterisk/monitor.h"
 #include "asterisk/mixmonitor.h"
 #include "asterisk/audiohook.h"
+#include "asterisk/causes.h"
 
 enum set_touch_variables_res {
 	SET_TOUCH_SUCCESS,
@@ -487,7 +488,8 @@
 	 * bridge_channel to force the channel out of the bridge and the
 	 * core takes care of the rest.
 	 */
-	ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
+	ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+		AST_CAUSE_NORMAL_CLEARING);
 	return 0;
 }
 

Modified: team/may/ooh323_qsig/bridges/bridge_builtin_interval_features.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/bridges/bridge_builtin_interval_features.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/bridges/bridge_builtin_interval_features.c (original)
+++ team/may/ooh323_qsig/bridges/bridge_builtin_interval_features.c Wed Aug 28 03:58:51 2013
@@ -45,10 +45,10 @@
 #include "asterisk/app.h"
 #include "asterisk/astobj2.h"
 #include "asterisk/test.h"
-
 #include "asterisk/say.h"
 #include "asterisk/stringfields.h"
 #include "asterisk/musiconhold.h"
+#include "asterisk/causes.h"
 
 static int bridge_features_duration_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 {
@@ -58,9 +58,11 @@
 		ast_stream_and_wait(bridge_channel->chan, limits->duration_sound, AST_DIGIT_NONE);
 	}
 
-	ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END);
-
-	ast_test_suite_event_notify("BRIDGE_TIMELIMIT", "Channel1: %s", ast_channel_name(bridge_channel->chan));
+	ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END,
+		AST_CAUSE_NORMAL_CLEARING);
+
+	ast_test_suite_event_notify("BRIDGE_TIMELIMIT", "Channel1: %s",
+		ast_channel_name(bridge_channel->chan));
 	return -1;
 }
 
@@ -101,12 +103,14 @@
 	/*
 	 * It may be necessary to resume music on hold after we finish
 	 * playing the announcment.
-	 *
-	 * XXX We have no idea what MOH class was in use before playing
-	 * the file.
 	 */
 	if (ast_test_flag(ast_channel_flags(bridge_channel->chan), AST_FLAG_MOH)) {
-		ast_moh_start(bridge_channel->chan, NULL, NULL);
+		const char *latest_musicclass;
+
+		ast_channel_lock(bridge_channel->chan);
+		latest_musicclass = ast_strdupa(ast_channel_latest_musicclass(bridge_channel->chan));
+		ast_channel_unlock(bridge_channel->chan);
+		ast_moh_start(bridge_channel->chan, latest_musicclass, NULL);
 	}
 }
 

Modified: team/may/ooh323_qsig/bridges/bridge_holding.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/bridges/bridge_holding.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/bridges/bridge_holding.c (original)
+++ team/may/ooh323_qsig/bridges/bridge_holding.c Wed Aug 28 03:58:51 2013
@@ -204,7 +204,7 @@
 	switch(hc->idle_mode) {
 	case IDLE_MODE_MOH:
 		moh_class = ast_bridge_channel_get_role_option(bridge_channel, "holding_participant", "moh_class");
-		ast_moh_start(bridge_channel->chan, ast_strlen_zero(moh_class) ? NULL : moh_class, NULL);
+		ast_moh_start(bridge_channel->chan, moh_class, NULL);
 		break;
 	case IDLE_MODE_RINGING:
 		ast_indicate(bridge_channel->chan, AST_CONTROL_RINGING);

Modified: team/may/ooh323_qsig/bridges/bridge_native_rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/bridges/bridge_native_rtp.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/bridges/bridge_native_rtp.c (original)
+++ team/may/ooh323_qsig/bridges/bridge_native_rtp.c Wed Aug 28 03:58:51 2013
@@ -112,8 +112,7 @@
 	return audio_glue0_res;
 }
 
-/*! \brief Start RTP native bridging */
-static int native_rtp_bridge_start(struct ast_bridge *bridge)
+static int native_rtp_bridge_start(struct ast_bridge *bridge, struct ast_channel *target)
 {
 	struct ast_bridge_channel *c0 = AST_LIST_FIRST(&bridge->channels);
 	struct ast_bridge_channel *c1 = AST_LIST_LAST(&bridge->channels);
@@ -152,10 +151,26 @@
 		break;
 
 	case AST_RTP_GLUE_RESULT_REMOTE:
-		glue0->update_peer(c0->chan, instance1, vinstance1, tinstance1, cap1, 0);
-		glue1->update_peer(c1->chan, instance0, vinstance0, tinstance0, cap0, 0);
-		ast_debug(2, "Remotely bridged '%s' and '%s' - media will flow directly between them\n",
-			ast_channel_name(c0->chan), ast_channel_name(c1->chan));
+
+		/* If we have a target, it's the channel that received the UNHOLD or UPDATE_RTP_PEER frame and was told to resume */
+		if (!target) {
+			glue0->update_peer(c0->chan, instance1, vinstance1, tinstance1, cap1, 0);
+			glue1->update_peer(c1->chan, instance0, vinstance0, tinstance0, cap0, 0);
+			ast_debug(2, "Remotely bridged '%s' and '%s' - media will flow directly between them\n",
+				ast_channel_name(c0->chan), ast_channel_name(c1->chan));
+		} else {
+			/*
+			 * If a target was provided, it is the recipient of an unhold or an update and needs to have
+			 * its media redirected to fit the current remote bridging needs. The other channel is either
+			 * already set up to handle the new media path or will have its own set of updates independent
+			 * of this pass.
+			 */
+			if (c0->chan == target) {
+				glue0->update_peer(c0->chan, instance1, vinstance1, tinstance1, cap1, 0);
+			} else {
+				glue1->update_peer(c1->chan, instance0, vinstance0, tinstance0, cap0, 0);
+			}
+		}
 		break;
 	case AST_RTP_GLUE_RESULT_FORBID:
 		break;
@@ -164,8 +179,7 @@
 	return 0;
 }
 
-/*! \brief Stop RTP native bridging */
-static void native_rtp_bridge_stop(struct ast_bridge *bridge)
+static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel *target)
 {
 	struct ast_bridge_channel *c0 = AST_LIST_FIRST(&bridge->channels);
 	struct ast_bridge_channel *c1 = AST_LIST_LAST(&bridge->channels);
@@ -193,9 +207,21 @@
 		}
 		break;
 	case AST_RTP_GLUE_RESULT_REMOTE:
-		glue0->update_peer(c0->chan, NULL, NULL, NULL, NULL, 0);
-		if (glue1) {
-			glue1->update_peer(c1->chan, NULL, NULL, NULL, NULL, 0);
+		if (!target) {
+			glue0->update_peer(c0->chan, NULL, NULL, NULL, NULL, 0);
+			if (glue1) {
+				glue1->update_peer(c1->chan, NULL, NULL, NULL, NULL, 0);
+			}
+		} else {
+			/*
+			 * If a target was provided, it is being put on hold and should expect to
+			 * receive mediafrom sterisk instead of what it was previously connected to.
+			 */
+			if (c0->chan == target) {
+				glue0->update_peer(c0->chan, NULL, NULL, NULL, NULL, 0);
+			} else if (glue1) {
+				glue1->update_peer(c1->chan, NULL, NULL, NULL, NULL, 0);
+			}
 		}
 		break;
 	case AST_RTP_GLUE_RESULT_FORBID:
@@ -221,9 +247,9 @@
 
 	if (bridge) {
 		if (f->subclass.integer == AST_CONTROL_HOLD) {
-			native_rtp_bridge_stop(bridge);
+			native_rtp_bridge_stop(bridge, chan);
 		} else if ((f->subclass.integer == AST_CONTROL_UNHOLD) || (f->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) {
-			native_rtp_bridge_start(bridge);
+			native_rtp_bridge_start(bridge, chan);
 		}
 	}
 
@@ -375,7 +401,7 @@
 		return -1;
 	}
 
-	return native_rtp_bridge_start(bridge);
+	return native_rtp_bridge_start(bridge, NULL);
 }
 
 static void native_rtp_bridge_unsuspend(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
@@ -387,7 +413,7 @@
 {
 	native_rtp_bridge_framehook_detach(bridge_channel);
 
-	native_rtp_bridge_stop(bridge);
+	native_rtp_bridge_stop(bridge, NULL);
 }
 
 static int native_rtp_bridge_write(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)

Modified: team/may/ooh323_qsig/build_tools/menuselect-deps.in
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/build_tools/menuselect-deps.in?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/build_tools/menuselect-deps.in (original)
+++ team/may/ooh323_qsig/build_tools/menuselect-deps.in Wed Aug 28 03:58:51 2013
@@ -26,6 +26,7 @@
 IXJUSER=@PBX_IXJUSER@
 JACK=@PBX_JACK@
 JANSSON=@PBX_JANSSON@
+URIPARSER=@PBX_URIPARSER@
 KQUEUE=@PBX_KQUEUE@
 LDAP=@PBX_LDAP@
 LIBEDIT=@PBX_LIBEDIT@

Modified: team/may/ooh323_qsig/channels/Makefile
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/channels/Makefile?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/channels/Makefile (original)
+++ team/may/ooh323_qsig/channels/Makefile Wed Aug 28 03:58:51 2013
@@ -63,6 +63,7 @@
 
 clean::
 	$(MAKE) -C misdn clean
+	rm -f dahdi/*.o dahdi/*.i
 	rm -f sip/*.o sip/*.i
 	rm -f iax2/*.o iax2/*.i
 	rm -f h323/libchanh323.a h323/Makefile.ast h323/*.o h323/*.dep

Modified: team/may/ooh323_qsig/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/channels/chan_dahdi.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/channels/chan_dahdi.c (original)
+++ team/may/ooh323_qsig/channels/chan_dahdi.c Wed Aug 28 03:58:51 2013
@@ -3686,6 +3686,7 @@
 	snprintf(cause_str, sizeof(cause_str), "R2 DISCONNECT (%s)", openr2_proto_get_disconnect_string(cause));
 	datalen += strlen(cause_str);
 	cause_code = ast_alloca(datalen);
+	memset(cause_code, 0, datalen);
 	cause_code->ast_cause = dahdi_r2_cause_to_ast_cause(cause);
 	ast_copy_string(cause_code->chan_name, ast_channel_name(p->owner), AST_CHANNEL_NAME);
 	ast_copy_string(cause_code->code, cause_str, datalen + 1 - sizeof(*cause_code));

Modified: team/may/ooh323_qsig/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/channels/chan_iax2.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/channels/chan_iax2.c (original)
+++ team/may/ooh323_qsig/channels/chan_iax2.c Wed Aug 28 03:58:51 2013
@@ -9996,6 +9996,7 @@
 		data_size += strlen(subclass);
 
 		cause_code = ast_alloca(data_size);
+		memset(cause_code, 0, data_size);
 		ast_copy_string(cause_code->chan_name, ast_channel_name(iaxs[fr->callno]->owner), AST_CHANNEL_NAME);
 
 		cause_code->ast_cause = ies.causecode;

Modified: team/may/ooh323_qsig/channels/chan_motif.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/channels/chan_motif.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/channels/chan_motif.c (original)
+++ team/may/ooh323_qsig/channels/chan_motif.c Wed Aug 28 03:58:51 2013
@@ -2532,7 +2532,8 @@
 
 		/* Size of the string making up the cause code is "Motif " + text */
 		data_size += 6 + strlen(iks_name(text));
-		cause_code = ast_malloc(data_size);
+		cause_code = ast_alloca(data_size);
+		memset(cause_code, 0, data_size);
 
 		/* Get the appropriate cause code mapping for this reason */
 		for (i = 0; i < ARRAY_LEN(jingle_reason_mappings); i++) {
@@ -2546,15 +2547,14 @@
 		snprintf(cause_code->code, data_size - sizeof(*cause_code) + 1, "Motif %s", iks_name(text));
 	} else {
 		/* No technology specific information is available */
-		cause_code = ast_malloc(data_size);
+		cause_code = ast_alloca(data_size);
+		memset(cause_code, 0, data_size);
 	}
 
 	ast_copy_string(cause_code->chan_name, ast_channel_name(chan), AST_CHANNEL_NAME);
 	cause_code->ast_cause = cause;
 	ast_queue_control_data(chan, AST_CONTROL_PVT_CAUSE_CODE, cause_code, data_size);
 	ast_channel_hangupcause_hash_set(chan, cause_code, data_size);
-
-	ast_free(cause_code);
 
 	ast_debug(3, "Hanging up channel '%s' due to session terminate message with cause '%d'\n", ast_channel_name(chan), cause);
 	ast_queue_hangup_with_cause(chan, cause);

Modified: team/may/ooh323_qsig/channels/chan_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/channels/chan_pjsip.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/channels/chan_pjsip.c (original)
+++ team/may/ooh323_qsig/channels/chan_pjsip.c Wed Aug 28 03:58:51 2013
@@ -637,11 +637,17 @@
 
 static int answer(void *data)
 {
-	pj_status_t status;
+	pj_status_t status = PJ_SUCCESS;
 	pjsip_tx_data *packet;
 	struct ast_sip_session *session = data;
 
-	if ((status = pjsip_inv_answer(session->inv_session, 200, NULL, NULL, &packet)) == PJ_SUCCESS) {
+	pjsip_dlg_inc_lock(session->inv_session->dlg);
+	if (session->inv_session->invite_tsx) {
+		status = pjsip_inv_answer(session->inv_session, 200, NULL, NULL, &packet);
+	}
+	pjsip_dlg_dec_lock(session->inv_session->dlg);
+
+	if (status == PJ_SUCCESS && packet) {
 		ast_sip_session_send_response(session, packet);
 	}
 
@@ -1162,10 +1168,25 @@
 	case AST_CONTROL_VIDUPDATE:
 		media = pvt->media[SIP_MEDIA_VIDEO];
 		if (media && media->rtp) {
-			ao2_ref(channel->session, +1);
-
-			if (ast_sip_push_task(channel->session->serializer, transmit_info_with_vidupdate, channel->session)) {
-				ao2_cleanup(channel->session);
+			/* FIXME: Only use this for VP8. Additional work would have to be done to
+			 * fully support other video codecs */
+			struct ast_format_cap *fcap = ast_channel_nativeformats(ast);
+			struct ast_format vp8;
+			ast_format_set(&vp8, AST_FORMAT_VP8, 0);
+			if (ast_format_cap_iscompatible(fcap, &vp8)) {
+				/* FIXME Fake RTP write, this will be sent as an RTCP packet. Ideally the
+				 * RTP engine would provide a way to externally write/schedule RTCP
+				 * packets */
+				struct ast_frame fr;
+				fr.frametype = AST_FRAME_CONTROL;
+				fr.subclass.integer = AST_CONTROL_VIDUPDATE;
+				res = ast_rtp_instance_write(media->rtp, &fr);
+			} else {
+				ao2_ref(channel->session, +1);
+
+				if (ast_sip_push_task(channel->session->serializer, transmit_info_with_vidupdate, channel->session)) {
+					ao2_cleanup(channel->session);
+				}
 			}
 		} else {
 			res = -1;

Modified: team/may/ooh323_qsig/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/may/ooh323_qsig/channels/chan_sip.c?view=diff&rev=397851&r1=397850&r2=397851
==============================================================================
--- team/may/ooh323_qsig/channels/chan_sip.c (original)
+++ team/may/ooh323_qsig/channels/chan_sip.c Wed Aug 28 03:58:51 2013
@@ -1269,7 +1269,7 @@
 static void start_ice(struct ast_rtp_instance *instance);
 static void add_codec_to_sdp(const struct sip_pvt *p, struct ast_format *codec,
 			     struct ast_str **m_buf, struct ast_str **a_buf,
-			     int debug, int *min_packet_size);
+			     int debug, int *min_packet_size, int *max_packet_size);
 static void add_noncodec_to_sdp(const struct sip_pvt *p, int format,
 				struct ast_str **m_buf, struct ast_str **a_buf,
 				int debug);
@@ -7945,10 +7945,25 @@
 		break;
 	case AST_CONTROL_VIDUPDATE:	/* Request a video frame update */
 		if (p->vrtp && !p->novideo) {
-			transmit_info_with_vidupdate(p);
-			/* ast_rtcp_send_h261fur(p->vrtp); */
-		} else
+			/* FIXME: Only use this for VP8. Additional work would have to be done to
+			 * fully support other video codecs */
+			struct ast_format_cap *fcap = ast_channel_nativeformats(ast);
+			struct ast_format vp8;
+			ast_format_set(&vp8, AST_FORMAT_VP8, 0);
+			if (ast_format_cap_iscompatible(fcap, &vp8)) {
+				/* FIXME Fake RTP write, this will be sent as an RTCP packet. Ideally the
+				 * RTP engine would provide a way to externally write/schedule RTCP
+				 * packets */
+				struct ast_frame fr;
+				fr.frametype = AST_FRAME_CONTROL;
+				fr.subclass.integer = AST_CONTROL_VIDUPDATE;
+				res = ast_rtp_instance_write(p->vrtp, &fr);
+			} else {
+				transmit_info_with_vidupdate(p);
+			}
+		} else {
 			res = -1;
+		}
 		break;
 	case AST_CONTROL_T38_PARAMETERS:
 		res = -1;
@@ -10673,7 +10688,7 @@
 
 	/* Setup audio address and port */
 	if (p->rtp) {
-		if (portno > 0) {
+		if (sa && portno > 0) {
 			start_ice(p->rtp);
 			ast_sockaddr_set_port(sa, portno);
 			ast_rtp_instance_set_remote_address(p->rtp, sa);
@@ -10721,7 +10736,7 @@
 
 	/* Setup video address and port */
 	if (p->vrtp) {
-		if (vportno > 0) {
+		if (vsa && vportno > 0) {
 			start_ice(p->vrtp);
 			ast_sockaddr_set_port(vsa, vportno);
 			ast_rtp_instance_set_remote_address(p->vrtp, vsa);
@@ -10739,7 +10754,7 @@
 
 	/* Setup text address and port */
 	if (p->trtp) {
-		if (tportno > 0) {
+		if (tsa && tportno > 0) {
 			start_ice(p->trtp);
 			ast_sockaddr_set_port(tsa, tportno);
 			ast_rtp_instance_set_remote_address(p->trtp, tsa);
@@ -10763,7 +10778,7 @@
 
 	/* Setup image address and port */
 	if (p->udptl) {
-		if (udptlportno > 0) {
+		if (isa && udptlportno > 0) {
 			if (ast_test_flag(&p->flags[1], SIP_PAGE2_SYMMETRICRTP) && ast_test_flag(&p->flags[1], SIP_PAGE2_UDPTL_DESTINATION)) {
 				ast_rtp_instance_get_remote_address(p->rtp, isa);
 				if (!ast_sockaddr_isnull(isa) && debug) {
@@ -11167,7 +11182,7 @@
 			if (debug)
 				ast_verbose("Discarded description format %s for ID %d\n", mimeSubtype, codec);
 		}
-	} else if (sscanf(a, "fmtp: %30u %255s", &codec, fmtp_string) == 2) {
+	} else if (sscanf(a, "fmtp: %30u %255[^\t\n]", &codec, fmtp_string) == 2) {
 		struct ast_format *format;
 
 		if ((format = ast_rtp_codecs_get_payload_format(newaudiortp, codec))) {
@@ -11230,7 +11245,8 @@
 		/* We have a rtpmap to handle */
 		if (*last_rtpmap_codec < SDP_MAX_RTPMAP_CODECS) {
 			/* Note: should really look at the '#chans' params too */
-			if (!strncasecmp(mimeSubtype, "H26", 3) || !strncasecmp(mimeSubtype, "MP4", 3)) {
+			if (!strncasecmp(mimeSubtype, "H26", 3) || !strncasecmp(mimeSubtype, "MP4", 3)
+					|| !strncasecmp(mimeSubtype, "VP8", 3)) {
 				if (!(ast_rtp_codecs_payloads_set_rtpmap_type_rate(newvideortp, NULL, codec, "video", mimeSubtype, 0, sample_rate))) {
 					if (debug)
 						ast_verbose("Found video description format %s for ID %d\n", mimeSubtype, codec);
@@ -12799,7 +12815,8 @@
 	struct ast_str **m_buf,
 	struct ast_str **a_buf,
 	int debug,
-	int *min_packet_size)
+	int *min_packet_size,
+	int *max_packet_size)
 {
 	int rtp_code;
 	struct ast_format_list fmt;
@@ -12821,7 +12838,12 @@
 	} else /* I don't see how you couldn't have p->rtp, but good to check for and error out if not there like earlier code */
 		return;
 	ast_str_append(m_buf, 0, " %d", rtp_code);
-	ast_str_append(a_buf, 0, "a=rtpmap:%d %s/%d\r\n", rtp_code, mime, rate);
+	/* Opus mandates 2 channels in rtpmap */
+	if ((int)format->id == AST_FORMAT_OPUS) {
+		ast_str_append(a_buf, 0, "a=rtpmap:%d %s/%d/2\r\n", rtp_code, mime, rate);
+	} else {
+		ast_str_append(a_buf, 0, "a=rtpmap:%d %s/%d\r\n", rtp_code, mime, rate);
+	}
 
 	ast_format_sdp_generate(format, rtp_code, a_buf);
 
@@ -12852,12 +12874,22 @@
 		break;
 	}
 
-	if (fmt.cur_ms && (fmt.cur_ms < *min_packet_size))
+	if (max_packet_size && fmt.max_ms && (fmt.max_ms < *max_packet_size)) {
+		*max_packet_size = fmt.max_ms;
+	}
+

[... 7864 lines stripped ...]



More information about the asterisk-commits mailing list