[asterisk-commits] file: branch group/media_formats r407403 - in /team/group/media_formats: apps...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Feb 5 08:27:11 CST 2014


Author: file
Date: Wed Feb  5 08:27:02 2014
New Revision: 407403

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=407403
Log:
More, more, more.

Modified:
    team/group/media_formats/apps/app_agent_pool.c
    team/group/media_formats/apps/app_alarmreceiver.c
    team/group/media_formats/channels/chan_alsa.c
    team/group/media_formats/channels/chan_bridge_media.c
    team/group/media_formats/channels/chan_oss.c
    team/group/media_formats/include/asterisk/format_cap.h
    team/group/media_formats/main/channel.c
    team/group/media_formats/main/channel_internal_api.c
    team/group/media_formats/main/format_cap_ng.c
    team/group/media_formats/main/frame.c
    team/group/media_formats/pbx/pbx_spool.c

Modified: team/group/media_formats/apps/app_agent_pool.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_agent_pool.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/apps/app_agent_pool.c (original)
+++ team/group/media_formats/apps/app_agent_pool.c Wed Feb  5 08:27:02 2014
@@ -2046,8 +2046,8 @@
 	}
 
 	ast_verb(2, "Agent '%s' logged in (format %s/%s)\n", agent->username,
-		ast_getformatname(ast_channel_readformat(chan)),
-		ast_getformatname(ast_channel_writeformat(chan)));
+		ast_channel_readformat(chan)->codec->name,
+		ast_channel_writeformat(chan)->codec->name);
 	ast_channel_lock(chan);
 	send_agent_login(chan, agent->username);
 	ast_channel_unlock(chan);

Modified: team/group/media_formats/apps/app_alarmreceiver.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_alarmreceiver.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/apps/app_alarmreceiver.c (original)
+++ team/group/media_formats/apps/app_alarmreceiver.c Wed Feb  5 08:27:02 2014
@@ -65,6 +65,7 @@
 #include "asterisk/astdb.h"
 #include "asterisk/utils.h"
 #include "asterisk/indications.h"
+#include "asterisk/format_cache.h"
 
 #define ALMRCV_CONFIG "alarmreceiver.conf"
 #define UNKNOWN_FORMAT "UNKNOWN_FORMAT"
@@ -194,6 +195,9 @@
 /* Misc variables */
 static char event_file[14] = "/event-XXXXXX";
 
+static struct ast_format *ulaw_format;
+static struct ast_format *alaw_format;
+
 /*!
  * \brief Attempt to access a database variable and increment it
  *
@@ -798,19 +802,19 @@
 	char signalling_type[64] = "";
 	event_node_t *event_head = NULL;
 
-	if (ast_channel_writeformat(chan)->id != AST_FORMAT_ALAW
-		&& ast_channel_writeformat(chan)->id != AST_FORMAT_ULAW) {
+	if ((ast_format_cmp(ast_channel_writeformat(chan), ulaw_format) == AST_FORMAT_CMP_NOT_EQUAL) &&
+		(ast_format_cmp(ast_channel_writeformat(chan), alaw_format) == AST_FORMAT_CMP_NOT_EQUAL)) {
 		ast_verb(4, "AlarmReceiver: Setting write format to Mu-law\n");
-		if (ast_set_write_format_by_id(chan,AST_FORMAT_ULAW)) {
+		if (ast_set_write_format(chan, ulaw_format)) {
 			ast_log(LOG_WARNING, "AlarmReceiver: Unable to set write format to Mu-law on %s\n",ast_channel_name(chan));
 			return -1;
 		}
 	}
 
-	if (ast_channel_readformat(chan)->id != AST_FORMAT_ALAW
-		&& ast_channel_readformat(chan)->id != AST_FORMAT_ULAW) {
+	if ((ast_format_cmp(ast_channel_readformat(chan), ulaw_format) == AST_FORMAT_CMP_NOT_EQUAL) &&
+		(ast_format_cmp(ast_channel_readformat(chan), alaw_format) == AST_FORMAT_CMP_NOT_EQUAL)) {
 		ast_verb(4, "AlarmReceiver: Setting read format to Mu-law\n");
-		if (ast_set_read_format_by_id(chan,AST_FORMAT_ULAW)) {
+		if (ast_set_read_format(chan, ulaw_format)) {
 			ast_log(LOG_WARNING, "AlarmReceiver: Unable to set read format to Mu-law on %s\n",ast_channel_name(chan));
 			return -1;
 		}
@@ -959,6 +963,9 @@
  */
 static int unload_module(void)
 {
+	ao2_ref(ulaw_format, -1);
+	ao2_ref(alaw_format, -1);
+
 	return ast_unregister_application(app);
 }
 
@@ -974,13 +981,30 @@
  */
 static int load_module(void)
 {
+	ulaw_format = ast_format_cache_get("ulaw");
+	if (!ulaw_format) {
+		ast_log(LOG_ERROR, "Expected format 'ulaw' in format cache does not exist\n");
+		return AST_MODULE_LOAD_DECLINE;
+	}
+
+	alaw_format = ast_format_cache_get("alaw");
+	if (!alaw_format) {
+		ast_log(LOG_ERROR, "Expected format 'alaw' in format cache does not exist\n");
+		ao2_ref(alaw_format, -1);
+		return AST_MODULE_LOAD_DECLINE;
+	}
+
 	if (load_config(0)) {
 		if (ast_register_application_xml(app, alarmreceiver_exec)) {
+			ao2_ref(ulaw_format, -1);
+			ao2_ref(alaw_format, -1);
 			return AST_MODULE_LOAD_FAILURE;
 		}
 		return AST_MODULE_LOAD_SUCCESS;
 	}
 
+	ao2_ref(ulaw_format, -1);
+	ao2_ref(alaw_format, -1);
 	return AST_MODULE_LOAD_DECLINE;
 }
 

Modified: team/group/media_formats/channels/chan_alsa.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/channels/chan_alsa.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/channels/chan_alsa.c (original)
+++ team/group/media_formats/channels/chan_alsa.c Wed Feb  5 08:27:02 2014
@@ -515,7 +515,7 @@
 		}
 
 		f.frametype = AST_FRAME_VOICE;
-		f.subclass.format = ao2_bump(slin_format);
+		f.subclass.format = ast_format_copy(slin_format);
 		f.samples = FRAME_SIZE;
 		f.datalen = FRAME_SIZE * 2;
 		f.data.ptr = buf;
@@ -967,7 +967,7 @@
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
-	if (!(alsa_tech.capabilities = ast_format_cap_alloc(0))) {
+	if (!(alsa_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
 		return AST_MODULE_LOAD_DECLINE;
 	}
 	ast_format_cap_add(alsa_tech.capabilities, slin_format, 0);

Modified: team/group/media_formats/channels/chan_bridge_media.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/channels/chan_bridge_media.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/channels/chan_bridge_media.c (original)
+++ team/group/media_formats/channels/chan_bridge_media.c Wed Feb  5 08:27:02 2014
@@ -164,11 +164,13 @@
 static void cleanup_capabilities(void)
 {
 	if (announce_tech.capabilities) {
-		announce_tech.capabilities = ast_format_cap_destroy(announce_tech.capabilities);
+		ao2_ref(announce_tech.capabilities, -1);
+		announce_tech.capabilities = NULL;
 	}
 
 	if (record_tech.capabilities) {
-		record_tech.capabilities = ast_format_cap_destroy(record_tech.capabilities);
+		ao2_ref(record_tech.capabilities, -1);
+		record_tech.capabilities = NULL;
 	}
 }
 
@@ -182,18 +184,18 @@
 
 static int load_module(void)
 {
-	announce_tech.capabilities = ast_format_cap_alloc(0);
+	announce_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 	if (!announce_tech.capabilities) {
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
-	record_tech.capabilities = ast_format_cap_alloc(0);
+	record_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 	if (!record_tech.capabilities) {
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
-	ast_format_cap_add_all(announce_tech.capabilities);
-	ast_format_cap_add_all(record_tech.capabilities);
+	ast_format_cap_add_all_by_type(announce_tech.capabilities, AST_MEDIA_TYPE_UNKNOWN);
+	ast_format_cap_add_all_by_type(record_tech.capabilities, AST_MEDIA_TYPE_UNKNOWN);
 
 	if (ast_channel_register(&announce_tech)) {
 		ast_log(LOG_ERROR, "Unable to register channel technology %s(%s).\n",

Modified: team/group/media_formats/channels/chan_oss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/channels/chan_oss.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/channels/chan_oss.c (original)
+++ team/group/media_formats/channels/chan_oss.c Wed Feb  5 08:27:02 2014
@@ -69,6 +69,7 @@
 #include "asterisk/musiconhold.h"
 #include "asterisk/app.h"
 #include "asterisk/bridge.h"
+#include "asterisk/format_cache.h"
 
 #include "console_video.h"
 
@@ -241,6 +242,9 @@
 static char *config = "oss.conf";	/* default config file */
 
 static int oss_debug;
+
+/* Signed linear format that is used by all channels and frames */
+static struct ast_format *slin_format;
 
 /*!
  * \brief descriptor for one of our channels.
@@ -726,7 +730,7 @@
 		return f;
 	/* ok we can build and deliver the frame to the caller */
 	f->frametype = AST_FRAME_VOICE;
-	ast_format_set(&f->subclass.format, AST_FORMAT_SLINEAR, 0);
+	f->subclass.format = ast_format_copy(slin_format);
 	f->samples = FRAME_SIZE;
 	f->datalen = FRAME_SIZE * 2;
 	f->data.ptr = o->oss_read_buf + AST_FRIENDLY_OFFSET;
@@ -804,9 +808,9 @@
 		setformat(o, O_RDWR);
 	ast_channel_set_fd(c, 0, o->sounddev); /* -1 if device closed, override later */
 
-	ast_format_set(ast_channel_readformat(c), AST_FORMAT_SLINEAR, 0);
-	ast_format_set(ast_channel_writeformat(c), AST_FORMAT_SLINEAR, 0);
-	ast_format_cap_add(ast_channel_nativeformats(c), ast_channel_readformat(c));
+	ast_channel_set_readformat(c, slin_format);
+	ast_channel_set_writeformat(c, slin_format);
+	ast_channel_nativeformats_set(c, oss_tech.capabilities);
 
 	/* if the console makes the call, add video to the offer */
 	/* if (state == AST_STATE_RINGING) TODO XXX CONSOLE VIDEO IS DISABLED UNTIL IT GETS A MAINTAINER
@@ -852,7 +856,6 @@
 	);
 	char *parse = ast_strdupa(data);
 	char buf[256];
-	struct ast_format tmpfmt;
 
 	AST_NONSTANDARD_APP_ARGS(args, parse, '/');
 	o = find_desc(args.name);
@@ -863,7 +866,7 @@
 		/* XXX we could default to 'dsp' perhaps ? */
 		return NULL;
 	}
-	if (!(ast_format_cap_iscompatible(cap, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR, 0)))) {
+	if (!ast_format_cap_iscompatible_format(cap, slin_format)) {
 		ast_log(LOG_NOTICE, "Format %s unsupported\n", ast_getformatname_multiple(buf, sizeof(buf), cap));
 		return NULL;
 	}
@@ -1453,7 +1456,12 @@
 	struct ast_config *cfg = NULL;
 	char *ctg = NULL;
 	struct ast_flags config_flags = { 0 };
-	struct ast_format tmpfmt;
+
+	slin_format = ast_format_cache_get("slin");
+	if (!slin_format) {
+		ast_log(LOG_ERROR, "Expected format 'slin' in format cache does not exist\n");
+		return AST_MODULE_LOAD_DECLINE;
+	}
 
 	/* Copy the default jb config over global_jbconf */
 	memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf));
@@ -1483,7 +1491,7 @@
 	if (!(oss_tech.capabilities = ast_format_cap_alloc(0))) {
 		return AST_MODULE_LOAD_FAILURE;
 	}
-	ast_format_cap_add(oss_tech.capabilities, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR, 0));
+	ast_format_cap_add(oss_tech.capabilities, slin_format, 0);
 
 	/* TODO XXX CONSOLE VIDEO IS DISABLE UNTIL IT HAS A MAINTAINER
 	 * add console_video_formats to oss_tech.capabilities once this occurs. */
@@ -1518,7 +1526,12 @@
 		ast_free(o);
 		o = next;
 	}
-	oss_tech.capabilities = ast_format_cap_destroy(oss_tech.capabilities);
+	ao2_cleanup(oss_tech.capabilities);
+	oss_tech.capabilities = NULL;
+
+	ao2_cleanup(slin_format);
+	slin_format = NULL;
+
 	return 0;
 }
 

Modified: team/group/media_formats/include/asterisk/format_cap.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/include/asterisk/format_cap.h?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/include/asterisk/format_cap.h (original)
+++ team/group/media_formats/include/asterisk/format_cap.h Wed Feb  5 08:27:02 2014
@@ -224,4 +224,10 @@
  */
 char *ast_getformatname_multiple(char *buf, size_t size, struct ast_format_cap *cap);
 
+/*! \brief Parse an "allow" or "deny" line in a channel or device configuration
+	and update the capabilities and pref if provided.
+	\return Returns number of errors encountered during parsing
+ */
+int ast_parse_allow_disallow(struct ast_format_cap *cap, const char *list, int allowing);
+
 #endif /* _AST_FORMAT_CAP_H */

Modified: team/group/media_formats/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/channel.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/main/channel.c (original)
+++ team/group/media_formats/main/channel.c Wed Feb  5 08:27:02 2014
@@ -2369,7 +2369,12 @@
 		ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, (ast_test_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_DEVSTATE_CACHE) ? AST_DEVSTATE_NOT_CACHABLE : AST_DEVSTATE_CACHABLE), device_name);
 	}
 
-	ast_channel_nativeformats_set(chan, ast_format_cap_destroy(ast_channel_nativeformats(chan)));
+	ast_channel_set_oldwriteformat(chan, NULL);
+	ast_channel_set_writeformat(chan, NULL);
+	ast_channel_set_rawwriteformat(chan, NULL);
+	ast_channel_set_readformat(chan, NULL);
+	ast_channel_set_rawreadformat(chan, NULL);
+	ast_channel_nativeformats_set(chan, NULL);
 	if (callid) {
 		ast_callid_unref(callid);
 	}

Modified: team/group/media_formats/main/channel_internal_api.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/channel_internal_api.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/main/channel_internal_api.c (original)
+++ team/group/media_formats/main/channel_internal_api.c Wed Feb  5 08:27:02 2014
@@ -802,7 +802,7 @@
 }
 struct ast_format_cap *ast_channel_nativeformats(const struct ast_channel *chan)
 {
-	return ao2_bump(chan->nativeformats);
+	return chan->nativeformats;
 }
 void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
 {
@@ -958,23 +958,23 @@
 }
 struct ast_format *ast_channel_oldwriteformat(struct ast_channel *chan)
 {
-	return ao_bump(chan->oldwriteformat);
+	return chan->oldwriteformat;
 }
 struct ast_format *ast_channel_rawreadformat(struct ast_channel *chan)
 {
-	return ao2_bump(chan->rawreadformat);
+	return chan->rawreadformat;
 }
 struct ast_format *ast_channel_rawwriteformat(struct ast_channel *chan)
 {
-	return ao2_bump(chan->rawwriteformat);
+	return chan->rawwriteformat;
 }
 struct ast_format *ast_channel_readformat(struct ast_channel *chan)
 {
-	return ao2_bump(chan->readformat);
+	return chan->readformat;
 }
 struct ast_format *ast_channel_writeformat(struct ast_channel *chan)
 {
-	return ao2_bump(chan->writeformat);
+	return chan->writeformat;
 }
 struct ast_hangup_handler_list *ast_channel_hangup_handlers(struct ast_channel *chan)
 {

Modified: team/group/media_formats/main/format_cap_ng.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/format_cap_ng.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/main/format_cap_ng.c (original)
+++ team/group/media_formats/main/format_cap_ng.c Wed Feb  5 08:27:02 2014
@@ -483,4 +483,58 @@
 	}
 
 	return buf;
+}
+
+int ast_parse_allow_disallow(struct ast_format_cap *cap, const char *list, int allowing)
+{
+	int errors = 0, all = 0, iter_allowing;
+	char *parse = NULL, *this = NULL, *psize = NULL;
+
+	parse = ast_strdupa(list);
+	while ((this = strsep(&parse, ","))) {
+		int framems = 0;
+		struct ast_format *format = NULL;
+
+		iter_allowing = allowing;
+		if (*this == '!') {
+			this++;
+			iter_allowing = !allowing;
+		}
+		if ((psize = strrchr(this, ':'))) {
+			*psize++ = '\0';
+			ast_debug(1, "Packetization for codec: %s is %s\n", this, psize);
+			framems = atoi(psize);
+			if (framems < 0) {
+				framems = 0;
+				errors++;
+				ast_log(LOG_WARNING, "Bad packetization value for codec %s\n", this);
+			}
+		}
+		all = strcasecmp(this, "all") ? 0 : 1;
+
+		if (!all && (format = ast_format_cache_get(this))) {
+			ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", iter_allowing ? "allow" : "disallow", this);
+			errors++;
+			continue;
+		}
+
+		if (cap) {
+			if (iter_allowing) {
+				if (all) {
+					ast_format_cap_add_all_by_type(cap, AST_MEDIA_TYPE_UNKNOWN);
+				} else {
+					ast_format_cap_add(cap, format, framems);
+				}
+			} else {
+				if (all) {
+					ast_format_cap_remove_all(cap);
+				} else {
+					ast_format_cap_remove(cap, format);
+				}
+			}
+		}
+
+		ao2_cleanup(format);
+	}
+	return errors;
 }

Modified: team/group/media_formats/main/frame.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/frame.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/main/frame.c (original)
+++ team/group/media_formats/main/frame.c Wed Feb  5 08:27:02 2014
@@ -117,7 +117,8 @@
 
 static void __frame_free(struct ast_frame *fr, int cache)
 {
-	if ((fr->frametype == AST_FRAME_VOICE) || (fr->frametype == AST_FRAME_VIDEO)) {
+	if ((fr->frametype == AST_FRAME_VOICE) || (fr->frametype == AST_FRAME_VIDEO) ||
+		(fr->frametype == AST_FRAME_IMAGE)) {
 		ao2_cleanup(fr->subclass.format);
 	}
 
@@ -307,7 +308,7 @@
 	}
 
 	out->frametype = f->frametype;
-	ast_format_copy(&out->subclass.format, &f->subclass.format);
+	out->subclass.format = ast_format_copy(f->subclass.format);
 	out->datalen = f->datalen;
 	out->samples = f->samples;
 	out->delivery = f->delivery;

Modified: team/group/media_formats/pbx/pbx_spool.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/pbx/pbx_spool.c?view=diff&rev=407403&r1=407402&r2=407403
==============================================================================
--- team/group/media_formats/pbx/pbx_spool.c (original)
+++ team/group/media_formats/pbx/pbx_spool.c Wed Feb  5 08:27:02 2014
@@ -53,6 +53,8 @@
 #include "asterisk/module.h"
 #include "asterisk/utils.h"
 #include "asterisk/options.h"
+#include "asterisk/format.h"
+#include "asterisk/format_cache.h"
 
 /*
  * pbx_spool is similar in spirit to qcall, but with substantially enhanced functionality...
@@ -73,6 +75,8 @@
 
 static char qdir[255];
 static char qdonedir[255];
+
+static struct ast_format *slin_format;
 
 struct outgoing {
 	int retries;                              /*!< Current number of retries */
@@ -108,7 +112,7 @@
 	if (o->vars) {
 		ast_variables_destroy(o->vars);
 	}
-	o->capabilities = ast_format_cap_destroy(o->capabilities);
+	ao2_cleanup(o->capabilities);
 	ast_string_field_free_memory(o);
 	ast_free(o);
 }
@@ -116,7 +120,6 @@
 static struct outgoing *new_outgoing(const char *fn)
 {
 	struct outgoing *o;
-	struct ast_format tmpfmt;
 
 	o = ast_calloc(1, sizeof(*o));
 	if (!o) {
@@ -144,12 +147,12 @@
 		return NULL;
 	}
 
-	o->capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_NOLOCK);
+	o->capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 	if (!o->capabilities) {
 		free_outgoing(o);
 		return NULL;
 	}
-	ast_format_cap_add(o->capabilities, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR, 0));
+	ast_format_cap_add(o->capabilities, slin_format, 0);
 
 	return o;
 }
@@ -226,7 +229,7 @@
 				o->maxretries = 0;
 			}
 		} else if (!strcasecmp(buf, "codecs")) {
-			ast_parse_allow_disallow(NULL, o->capabilities, c, 1);
+			ast_parse_allow_disallow(o->capabilities, c, 1);
 		} else if (!strcasecmp(buf, "context")) {
 			ast_string_field_set(o, context, c);
 		} else if (!strcasecmp(buf, "extension")) {
@@ -899,6 +902,12 @@
 	}
 	snprintf(qdonedir, sizeof(qdir), "%s/%s", ast_config_AST_SPOOL_DIR, "outgoing_done");
 
+	slin_format = ast_format_cache_get("slin");
+	if (!slin_format) {
+		ast_log(LOG_ERROR, "Expected format 'slin' in format cache does not exist\n");
+		return AST_MODULE_LOAD_DECLINE;
+	}
+
 	if ((ret = ast_pthread_create_detached_background(&thread, NULL, scan_thread, NULL))) {
 		ast_log(LOG_WARNING, "Unable to create thread :( (returned error: %d)\n", ret);
 		return AST_MODULE_LOAD_FAILURE;




More information about the asterisk-commits mailing list