[svn-commits] file: branch group/media_formats r411576 - in /team/group/media_formats: chan...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Mar 31 09:08:44 CDT 2014


Author: file
Date: Mon Mar 31 09:08:32 2014
New Revision: 411576

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=411576
Log:
Begin to vectorize RTP reality.

Modified:
    team/group/media_formats/channels/chan_sip.c
    team/group/media_formats/include/asterisk/rtp_engine.h
    team/group/media_formats/main/rtp_engine.c

Modified: team/group/media_formats/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/channels/chan_sip.c?view=diff&rev=411576&r1=411575&r2=411576
==============================================================================
--- team/group/media_formats/channels/chan_sip.c (original)
+++ team/group/media_formats/channels/chan_sip.c Mon Mar 31 09:08:32 2014
@@ -10089,7 +10089,7 @@
 
 	int peernoncodeccapability = 0, vpeernoncodeccapability = 0, tpeernoncodeccapability = 0;
 
-	struct ast_rtp_codecs newaudiortp = { 0, }, newvideortp = { 0, }, newtextrtp = { 0, };
+	struct ast_rtp_codecs newaudiortp, newvideortp, newtextrtp;
 	struct ast_format_cap *newjointcapability = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT); /* Negotiated capability */
 	struct ast_format_cap *newpeercapability = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 	int newnoncodeccapability;

Modified: team/group/media_formats/include/asterisk/rtp_engine.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/include/asterisk/rtp_engine.h?view=diff&rev=411576&r1=411575&r2=411576
==============================================================================
--- team/group/media_formats/include/asterisk/rtp_engine.h (original)
+++ team/group/media_formats/include/asterisk/rtp_engine.h Mon Mar 31 09:08:32 2014
@@ -75,13 +75,7 @@
 #include "asterisk/sched.h"
 #include "asterisk/res_srtp.h"
 #include "asterisk/stasis.h"
-
-/* Maximum number of payloads supported */
-#if defined(LOW_MEMORY)
-#define AST_RTP_MAX_PT 128
-#else
-#define AST_RTP_MAX_PT 196
-#endif
+#include "asterisk/vector.h"
 
 /* Maximum number of generations */
 #define AST_RED_MAX_GENERATION 5
@@ -550,8 +544,12 @@
 
 /*! Structure that represents codec and packetization information */
 struct ast_rtp_codecs {
-	/*! Payloads present */
-	struct ao2_container *payloads;
+	/*! Vector of mappings from payload to format */
+	AST_VECTOR(, struct ast_format *) payload2format;
+	/*! Vector of mappings from format to payload */
+	AST_VECTOR(, unsigned int) format2payload;
+	/*! Vector of mappings from payload to non-Asterisk format */
+	AST_VECTOR(, unsigned int) payload2internalformat;
 };
 
 /*! Structure that represents the glue that binds an RTP instance to a channel */

Modified: team/group/media_formats/main/rtp_engine.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/rtp_engine.c?view=diff&rev=411576&r1=411575&r2=411576
==============================================================================
--- team/group/media_formats/main/rtp_engine.c (original)
+++ team/group/media_formats/main/rtp_engine.c Mon Mar 31 09:08:32 2014
@@ -526,119 +526,96 @@
 	return &instance->codecs;
 }
 
-static int rtp_payload_type_hash(const void *obj, const int flags)
-{
-	const struct ast_rtp_payload_type *type = obj;
-	const int *payload = obj;
-
-	return (flags & OBJ_KEY) ? *payload : type->payload;
-}
-
-static int rtp_payload_type_cmp(void *obj, void *arg, int flags)
-{
-	struct ast_rtp_payload_type *type1 = obj, *type2 = arg;
-	const int *payload = arg;
-
-	return (type1->payload == (OBJ_KEY ? *payload : type2->payload)) ? CMP_MATCH | CMP_STOP : 0;
-}
-
 int ast_rtp_codecs_payloads_initialize(struct ast_rtp_codecs *codecs)
 {
-	if (!(codecs->payloads = ao2_container_alloc(AST_RTP_MAX_PT, rtp_payload_type_hash, rtp_payload_type_cmp))) {
-		return -1;
-	}
+	AST_VECTOR_INIT(&codecs->payload2format, 0);
+	AST_VECTOR_INIT(&codecs->format2payload, 0);
+	AST_VECTOR_INIT(&codecs->payload2internalformat, 0);
 
 	return 0;
 }
 
 void ast_rtp_codecs_payloads_destroy(struct ast_rtp_codecs *codecs)
 {
-	ao2_cleanup(codecs->payloads);
+	int idx;
+
+	for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload2format); idx++) {
+		struct ast_format *format = AST_VECTOR_GET(&codecs->payload2format, idx);
+
+		ao2_cleanup(format);
+	}
+
+	AST_VECTOR_FREE(&codecs->payload2format);
+	AST_VECTOR_FREE(&codecs->format2payload);
+	AST_VECTOR_FREE(&codecs->payload2internalformat);
 }
 
 void ast_rtp_codecs_payloads_clear(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
 {
+	if (instance && instance->engine && instance->engine->payload_set) {
+		int idx;
+
+		for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload2format); idx++) {
+			if (AST_VECTOR_GET(&codecs->payload2format, idx)) {
+				instance->engine->payload_set(instance, idx, 0, NULL, 0);
+			}
+		}
+
+		for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload2internalformat); idx++) {
+			if (AST_VECTOR_GET(&codecs->payload2internalformat)) {
+				instance->engine->payload_set(instance, idx, 0, NULL, 0);
+			}
+		}
+	}
+
 	ast_rtp_codecs_payloads_destroy(codecs);
-
-	if (instance && instance->engine && instance->engine->payload_set) {
-		int i;
-		for (i = 0; i < AST_RTP_MAX_PT; i++) {
-			instance->engine->payload_set(instance, i, 0, NULL, 0);
-		}
-	}
-
 	ast_rtp_codecs_payloads_initialize(codecs);
 }
 
 void ast_rtp_codecs_payloads_default(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
 {
-	int i;
-
-	ast_rwlock_rdlock(&static_RTP_PT_lock);
-	for (i = 0; i < AST_RTP_MAX_PT; i++) {
-		if (static_RTP_PT[i].rtp_code || static_RTP_PT[i].asterisk_format) {
-			struct ast_rtp_payload_type *type;
-
-			if (!(type = ao2_alloc(sizeof(*type), NULL))) {
-				/* Unfortunately if this occurs the payloads container will not contain all possible default payloads
-				 * but we err on the side of doing what we can in the hopes that the extreme memory conditions which
-				 * caused this to occur will go away.
-				 */
-				continue;
-			}
-
-			type->payload = i;
-			type->asterisk_format = static_RTP_PT[i].asterisk_format;
-			type->rtp_code = static_RTP_PT[i].rtp_code;
-			ast_format_copy(&type->format, &static_RTP_PT[i].format);
-
-			ao2_link_flags(codecs->payloads, type, OBJ_NOLOCK);
-
-			if (instance && instance->engine && instance->engine->payload_set) {
-				instance->engine->payload_set(instance, i, type->asterisk_format, &type->format, type->rtp_code);
-			}
-
-			ao2_ref(type, -1);
-		}
-	}
-	ast_rwlock_unlock(&static_RTP_PT_lock);
+	/* Can this go away? */
 }
 
 void ast_rtp_codecs_payloads_copy(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
 {
-	int i;
-	struct ast_rtp_payload_type *type;
-
-	for (i = 0; i < AST_RTP_MAX_PT; i++) {
-		struct ast_rtp_payload_type *new_type;
-
-		if (!(type = ao2_find(src->payloads, &i, OBJ_KEY | OBJ_NOLOCK))) {
+	int idx;
+
+	for (idx = 0; idx < AST_VECTOR_SIZE(&src->payload2format); idx++) {
+		struct ast_format *format = AST_VECTOR_GET(&src->payload2format, idx);
+
+		if (!format) {
 			continue;
 		}
 
-		if (!(new_type = ao2_alloc(sizeof(*new_type), NULL))) {
+		ast_debug(2, "Copying payload %d from %p to %p\n", idx, src, dest);
+		AST_VECTOR_INSERT(&dest->payload2format, idx, ao2_bump(format));
+
+		if (instance && instance->engine && instance->engine->payload_set) {
+			instance->engine->payload_set(instance, idx, 0, format, idx);
+		}
+	}
+
+	for (idx = 0; idx < AST_VECTOR_SIZE(&src->payload2internalformat); idx++) {
+		if (!AST_VECTOR_GET(&src->payload2internalformat, idx)) {
 			continue;
 		}
 
-		ast_debug(2, "Copying payload %d from %p to %p\n", i, src, dest);
-
-		new_type->payload = i;
-		*new_type = *type;
-
-		ao2_link_flags(dest->payloads, new_type, OBJ_NOLOCK);
-
-		ao2_ref(new_type, -1);
+		ast_debug(2, "Copying payload %d from %p to %p\n", idx, src, dest);
+		AST_VECTOR_INSERT(&dest->payload2internalformat, idx, AST_VECTOR_GET(&src->payload2internalformat, idx));
 
 		if (instance && instance->engine && instance->engine->payload_set) {
-			instance->engine->payload_set(instance, i, type->asterisk_format, &type->format, type->rtp_code);
-		}
-
-		ao2_ref(type, -1);
+			instance->engine->payload_set(instance, idx, AST_VECTOR_GET(&src->payload2internalformat, idx), NULL, idx);
+		}
 	}
 }
 
 void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 {
+	if (payload < 0) {
+		return;
+	}
+
 	struct ast_rtp_payload_type *type;
 
 	ast_rwlock_rdlock(&static_RTP_PT_lock);
@@ -742,13 +719,19 @@
 
 void ast_rtp_codecs_payloads_unset(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 {
-	if (payload < 0 || payload >= AST_RTP_MAX_PT) {
+	struct ast_format *format;
+
+	if (payload < 0 || payload >= AST_VECTOR_SIZE(&codecs->payload2format)) {
 		return;
 	}
 
 	ast_debug(2, "Unsetting payload %d on %p\n", payload, codecs);
 
-	ao2_find(codecs->payloads, &payload, OBJ_KEY | OBJ_NOLOCK | OBJ_NODATA | OBJ_UNLINK);
+	format = AST_VECTOR_GET(&codecs->payload2format, payload);
+	if (format) {
+		ao2_cleanup(format);
+		AST_VECTOR_INSERT(&codecs->payload2format, payload, NULL);
+	}
 
 	if (instance && instance->engine && instance->engine->payload_set) {
 		instance->engine->payload_set(instance, payload, 0, NULL, 0);
@@ -780,22 +763,11 @@
 
 struct ast_format *ast_rtp_codecs_get_payload_format(struct ast_rtp_codecs *codecs, int payload)
 {
-	struct ast_rtp_payload_type *type;
-	struct ast_format *format;
-
-	if (payload < 0 || payload >= AST_RTP_MAX_PT) {
+	if ((payload < 0) || (payload >= AST_VECTOR_SIZE(&codecs->payload2format))) {
 		return NULL;
 	}
 
-	if (!(type = ao2_find(codecs->payloads, &payload, OBJ_KEY | OBJ_NOLOCK))) {
-		return NULL;
-	}
-
-	format = type->asterisk_format ? &type->format : NULL;
-
-	ao2_ref(type, -1);
-
-	return format;
+	return AST_VECTOR_GET(&codecs->payload2format, payload);
 }
 
 static int rtp_payload_type_add_ast(void *obj, void *arg, int flags)




More information about the svn-commits mailing list