[svn-commits] file: branch group/media_formats r408290 - /team/group/media_formats/channels/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Feb 17 13:49:31 CST 2014


Author: file
Date: Mon Feb 17 13:49:28 2014
New Revision: 408290

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=408290
Log:
Move chan_unistim over.

Modified:
    team/group/media_formats/channels/chan_unistim.c

Modified: team/group/media_formats/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/channels/chan_unistim.c?view=diff&rev=408290&r1=408289&r2=408290
==============================================================================
--- team/group/media_formats/channels/chan_unistim.c (original)
+++ team/group/media_formats/channels/chan_unistim.c Mon Feb 17 13:49:28 2014
@@ -78,6 +78,7 @@
 #include "asterisk/features_config.h"
 #include "asterisk/bridge.h"
 #include "asterisk/stasis_channels.h"
+#include "asterisk/format_cache.h"
 
 #define DEFAULTCONTEXT	  "default"
 #define DEFAULTCALLERID	 "Unknown"
@@ -1816,7 +1817,7 @@
 	struct ast_format_cap *tmp = src->cap;
 	memcpy(dst, src, sizeof(*dst)); /* this over writes the cap ptr, so we have to reset it */
 	src->cap = tmp;
-	ast_format_cap_copy(src->cap, dst->cap);
+	ast_format_cap_append_by_type(src->cap, dst->cap, AST_MEDIA_TYPE_UNKNOWN);
 }
 
 static struct unistim_line *unistim_line_destroy(struct unistim_line *l)
@@ -1824,7 +1825,7 @@
 	if (!l) {
 		return NULL;
 	}
-	l->cap = ast_format_cap_destroy(l->cap);
+	ao2_ref(l->cap, -1);
 	ast_free(l);
 	return NULL;
 }
@@ -1836,7 +1837,7 @@
 		return NULL;
 	}
 
-	if (!(l->cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_NOLOCK))) {
+	if (!(l->cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
 		ast_free(l);
 		return NULL;
 	}
@@ -2582,15 +2583,15 @@
 	if (unistimdebug) {
 		ast_verb(0, "RTP started : Our IP/port is : %s:%hd with codec %s\n",
 			 ast_inet_ntoa(us.sin_addr),
-			 htons(us.sin_port), ast_getformatname(ast_channel_readformat(sub->owner)));
+			 htons(us.sin_port), ast_channel_readformat(sub->owner)->codec->name);
 		ast_verb(0, "Starting phone RTP stack. Our public IP is %s\n",
 					ast_inet_ntoa(public.sin_addr));
 	}
 
 	pte = sub->parent->parent->session;
 	codec = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(sub->rtp), 1, ast_channel_readformat(sub->owner), 0);
-	if ((ast_channel_readformat(sub->owner)->id == AST_FORMAT_ULAW) ||
-		(ast_channel_readformat(sub->owner)->id == AST_FORMAT_ALAW)) {
+	if ((ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) ||
+		(ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_alaw) == AST_FORMAT_CMP_EQUAL)) {
 		if (unistimdebug) {
 			ast_verb(0, "Sending packet_send_rtp_packet_size for codec %d\n", codec);
 		}
@@ -2687,17 +2688,17 @@
 		/* Codec */
 		buffsend[40] = codec;
 		buffsend[41] = codec;
-		if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_ULAW) {
+		if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
 			buffsend[42] = 1;       /* 1 = 20ms (160 bytes), 2 = 40ms (320 bytes) */
-		} else if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_ALAW) {
+		} else if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
 			buffsend[42] = 1;       /* 1 = 20ms (160 bytes), 2 = 40ms (320 bytes) */
-		} else if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_G723_1) {
+		} else if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_g723) == AST_FORMAT_CMP_EQUAL) {
 			buffsend[42] = 2;       /* 1 = 30ms (24 bytes), 2 = 60 ms (48 bytes) */
-		} else if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_G729A) {
+		} else if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_g729) == AST_FORMAT_CMP_EQUAL) {
 			buffsend[42] = 2;       /* 1 = 10ms (10 bytes), 2 = 20ms (20 bytes) */
 		} else {
 			ast_log(LOG_WARNING, "Unsupported codec %s!\n",
-					ast_getformatname(ast_channel_readformat(sub->owner)));
+				ast_channel_readformat(sub->owner)->codec->name);
 		}
 		/* Source port for transmit RTP and Destination port for receiving RTP */
 		buffsend[45] = (htons(sin.sin_port) & 0xff00) >> 8;
@@ -2766,18 +2767,19 @@
 	sin.sin_port = htons(find_rtp_port(sub));
 	ast_sockaddr_from_sin(&sin_tmp, &sin);
 	ast_rtp_instance_set_remote_address(sub->rtp, &sin_tmp);
-	if (!ast_format_cap_iscompatible(ast_channel_nativeformats(sub->owner), ast_channel_readformat(sub->owner))) {
-		struct ast_format tmpfmt;
+	if (!ast_format_cap_iscompatible_format(ast_channel_nativeformats(sub->owner), ast_channel_readformat(sub->owner))) {
+		struct ast_format *tmpfmt;
 		char tmp[256];
 		ast_best_codec(ast_channel_nativeformats(sub->owner), &tmpfmt);
 		ast_log(LOG_WARNING,
 				"Our read/writeformat has been changed to something incompatible: %s, using %s best codec from %s\n",
-				ast_getformatname(ast_channel_readformat(sub->owner)),
-				ast_getformatname(&tmpfmt),
+				ast_channel_readformat(sub->owner)->codec->name,
+				tmpfmt->codec->name,
 				ast_getformatname_multiple(tmp, sizeof(tmp), ast_channel_nativeformats(sub->owner)));
 
-                ast_format_copy(ast_channel_readformat(sub->owner), &tmpfmt);
-                ast_format_copy(ast_channel_writeformat(sub->owner), &tmpfmt);
+		ast_channel_set_readformat(sub->owner, tmpfmt);
+		ast_channel_set_writeformat(sub->owner, tmpfmt);
+        ao2_ref(tmpfmt, -1);
 	}
 	send_start_rtp(sub);
 	ast_mutex_unlock(&sub->lock);
@@ -5005,14 +5007,21 @@
 	if (sub->owner) {
 		/* We already hold the channel lock */
 		if (f->frametype == AST_FRAME_VOICE) {
-			if (!(ast_format_cap_iscompatible(ast_channel_nativeformats(sub->owner), &f->subclass.format))) {
+			if (!(ast_format_cap_iscompatible_format(ast_channel_nativeformats(sub->owner), f->subclass.format))) {
 				char tmp[256];
+				struct ast_format_cap *caps;
+
 				ast_debug(1,
 						"Oooh, format changed from %s to %s\n",
 						ast_getformatname_multiple(tmp, sizeof(tmp), ast_channel_nativeformats(sub->owner)),
-						ast_getformatname(&f->subclass.format));
-
-				ast_format_cap_set(ast_channel_nativeformats(sub->owner), &f->subclass.format);
+						f->subclass.format->codec->name);
+
+				caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+				if (caps) {
+					ast_format_cap_add(caps, f->subclass.format, 0);
+					ast_channel_nativeformats_set(sub->owner, caps);
+					ao2_ref(caps, -1);
+				}
 				ast_set_read_format(sub->owner, ast_channel_readformat(sub->owner));
 				ast_set_write_format(sub->owner, ast_channel_writeformat(sub->owner));
 			}
@@ -5048,14 +5057,14 @@
 			return 0;
 		}
 	} else {
-		if (!(ast_format_cap_iscompatible(ast_channel_nativeformats(ast), &frame->subclass.format))) {
+		if (!(ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), frame->subclass.format))) {
 			char tmp[256];
 			ast_log(LOG_WARNING,
 					"Asked to transmit frame type %s, while native formats is %s (read/write = (%s/%s)\n",
-					ast_getformatname(&frame->subclass.format),
+					frame->subclass.format->codec->name,
 					ast_getformatname_multiple(tmp, sizeof(tmp), ast_channel_nativeformats(ast)),
-					ast_getformatname(ast_channel_readformat(ast)),
-					ast_getformatname(ast_channel_writeformat(ast)));
+					ast_channel_readformat(ast)->codec->name,
+					ast_channel_writeformat(ast)->codec->name);
 			return -1;
 		}
 	}
@@ -5532,9 +5541,10 @@
 /*      called from unistim_request (calls from the pbx ) */
 static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state, const char *linkedid)
 {
+	struct ast_format_cap *caps;
 	struct ast_channel *tmp;
 	struct unistim_line *l;
-	struct ast_format tmpfmt;
+	struct ast_format *tmpfmt;
 
 	if (!sub) {
 		ast_log(LOG_WARNING, "subchannel null in unistim_new\n");
@@ -5544,6 +5554,12 @@
 		ast_log(LOG_WARNING, "no line for subchannel %p\n", sub);
 		return NULL;
 	}
+
+	caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+	if (!caps) {
+		return NULL;
+	}
+
 	l = sub->parent;
 	tmp = ast_channel_alloc(1, state, l->cid_num, NULL, l->accountcode, l->exten,
 		l->parent->context, linkedid, l->amaflags, "USTM/%s@%s-%p", l->name, l->parent->name, sub);
@@ -5552,21 +5568,26 @@
 	}
 	if (!tmp) {
 		ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
+		ao2_ref(caps, -1);
 		return NULL;
 	}
 
 	ast_channel_stage_snapshot(tmp);
 
-	ast_format_cap_copy(ast_channel_nativeformats(tmp), l->cap);
-	if (ast_format_cap_is_empty(ast_channel_nativeformats(tmp))) {
-		ast_format_cap_copy(ast_channel_nativeformats(tmp), global_cap);
-	}
+	if (ast_format_cap_count(l->cap)) {
+		ast_format_cap_append_by_type(caps, l->cap, AST_MEDIA_TYPE_UNKNOWN);
+	} else {
+		ast_format_cap_append_by_type(caps, global_cap, AST_MEDIA_TYPE_UNKNOWN);
+	}
+	ast_channel_nativeformats_set(tmp, caps);
+	ao2_ref(caps, -1);
+
 	ast_best_codec(ast_channel_nativeformats(tmp), &tmpfmt);
 
 	if (unistimdebug) {
 		char tmp1[256], tmp2[256], tmp3[256];
 		ast_verb(0, "Best codec = %s from nativeformats %s (line cap=%s global=%s)\n",
-			ast_getformatname(&tmpfmt),
+			tmpfmt->codec->name,
 			ast_getformatname_multiple(tmp1, sizeof(tmp1), ast_channel_nativeformats(tmp)),
 			ast_getformatname_multiple(tmp2, sizeof(tmp2), l->cap),
 			ast_getformatname_multiple(tmp3, sizeof(tmp3), global_cap));
@@ -5587,10 +5608,13 @@
 		ast_channel_rings_set(tmp, 1);
 	}
 	ast_channel_adsicpe_set(tmp, AST_ADSI_UNAVAILABLE);
-	ast_format_copy(ast_channel_writeformat(tmp), &tmpfmt);
-	ast_format_copy(ast_channel_rawwriteformat(tmp), &tmpfmt);
-	ast_format_copy(ast_channel_readformat(tmp), &tmpfmt);
-	ast_format_copy(ast_channel_rawreadformat(tmp), &tmpfmt);
+
+	ast_channel_set_writeformat(tmp, tmpfmt);
+	ast_channel_set_rawwriteformat(tmp, tmpfmt);
+	ast_channel_set_readformat(tmp, tmpfmt);
+	ast_channel_set_rawreadformat(tmp, tmpfmt);
+	ao2_ref(tmpfmt, -1);
+
 	ast_channel_tech_pvt_set(tmp, sub);
 	ast_channel_tech_set(tmp, &unistim_tech);
 
@@ -5773,7 +5797,7 @@
 	char tmp[256];
 	char tmp2[256];
 
-	if (!(ast_format_cap_has_joint(cap, global_cap))) {
+	if (!(ast_format_cap_iscompatible(cap, global_cap))) {
 		ast_log(LOG_NOTICE,
 				"Asked to get a channel of unsupported format %s while capability is %s\n",
 				ast_getformatname_multiple(tmp2, sizeof(tmp2), cap), ast_getformatname_multiple(tmp, sizeof(tmp), global_cap));
@@ -5827,7 +5851,8 @@
 	}
 	sub->subtype = SUB_RING;
 	sub->softkey = -1;
-	ast_format_cap_copy(sub->parent->cap, cap);
+
+	ast_format_cap_append_by_type(sub->parent->cap, cap, AST_MEDIA_TYPE_UNKNOWN);
 	tmpc = unistim_new(sub, AST_STATE_DOWN, requestor ? ast_channel_linkedid(requestor) : NULL);
 	if (!tmpc) {
 		ast_log(LOG_WARNING, "Unable to make channel for '%s'\n", tmp);
@@ -6465,7 +6490,7 @@
 						ast_verb(3, "Setting mailbox '%s' on %s@%s\n", l->mailbox, d->name, l->name);
 					}
 				}
-				ast_format_cap_copy(l->cap, global_cap);
+				ast_format_cap_append_by_type(l->cap, global_cap, AST_MEDIA_TYPE_UNKNOWN);
 				l->parent = d;
 				linecnt++;
 				AST_LIST_LOCK(&d->lines);
@@ -6845,17 +6870,18 @@
 int load_module(void)
 {
 	int res;
-	struct ast_format tmpfmt;
-	if (!(global_cap = ast_format_cap_alloc(0))) {
+
+	if (!(global_cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
 		goto buff_failed;
 	}
-	if (!(unistim_tech.capabilities = ast_format_cap_alloc(0))) {
+	if (!(unistim_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
 		goto buff_failed;
 	}
 
-	ast_format_cap_add(global_cap, ast_format_set(&tmpfmt, AST_FORMAT_ULAW, 0));
-	ast_format_cap_add(global_cap, ast_format_set(&tmpfmt, AST_FORMAT_ALAW, 0));
-	ast_format_cap_copy(unistim_tech.capabilities, global_cap);
+	ast_format_cap_add(global_cap, ast_format_ulaw, 0);
+	ast_format_cap_add(global_cap, ast_format_alaw, 0);
+	ast_format_cap_append_by_type(unistim_tech.capabilities, global_cap, AST_MEDIA_TYPE_AUDIO);
+
 	if (!(buff = ast_malloc(SIZE_PAGE))) {
 		goto buff_failed;
 	}
@@ -6900,8 +6926,10 @@
 io_failed:
 	ast_free(buff);
 	buff = NULL;
-	global_cap = ast_format_cap_destroy(global_cap);
-	unistim_tech.capabilities = ast_format_cap_destroy(unistim_tech.capabilities);
+	ao2_cleanup(global_cap);
+	global_cap = NULL;
+	ao2_cleanup(unistim_tech.capabilities);
+	unistim_tech.capabilities = NULL;
 buff_failed:
 	return AST_MODULE_LOAD_FAILURE;
 }
@@ -6933,8 +6961,8 @@
 	if (unistimsock > -1) {
 		close(unistimsock);
 	}
-	global_cap = ast_format_cap_destroy(global_cap);
-	unistim_tech.capabilities = ast_format_cap_destroy(unistim_tech.capabilities);
+	ao2_ref(global_cap, -1);
+	ao2_ref(unistim_tech.capabilities, -1);
 
 	return 0;
 }




More information about the svn-commits mailing list