[svn-commits] file: branch file/rtp_engine r129107 - in /team/file/rtp_engine: include/aste...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jul 8 13:20:27 CDT 2008


Author: file
Date: Tue Jul  8 13:20:26 2008
New Revision: 129107

URL: http://svn.digium.com/view/asterisk?view=rev&rev=129107
Log:
Decouple payload and packetization stuff from the RTP instance so a full instance does not need to exist to do it.

Modified:
    team/file/rtp_engine/include/asterisk/rtp_engine.h
    team/file/rtp_engine/main/rtp_engine.c
    team/file/rtp_engine/res/res_rtp_asterisk.c

Modified: team/file/rtp_engine/include/asterisk/rtp_engine.h
URL: http://svn.digium.com/view/asterisk/team/file/rtp_engine/include/asterisk/rtp_engine.h?view=diff&rev=129107&r1=129106&r2=129107
==============================================================================
--- team/file/rtp_engine/include/asterisk/rtp_engine.h (original)
+++ team/file/rtp_engine/include/asterisk/rtp_engine.h Tue Jul  8 13:20:26 2008
@@ -89,15 +89,22 @@
 	AST_RWLIST_ENTRY(ast_rtp_engine) entry;                                                         /*!< Linked list information */
 };
 
+struct ast_rtp_codecs {
+	struct ast_codec_pref pref;                           /*!< Codec packetization preferences */
+	struct ast_rtp_payload_type payloads[AST_RTP_MAX_PT]; /*!< Payloads present */
+};
+
 struct ast_rtp_instance {
 	struct ast_rtp_engine *engine;                        /*!< Engine handling this RTP session instance */
 	struct ast_rtp_glue *glue;                            /*!< Glue that interfaces with the channel driver */
 	void *data;                                           /*!< Unique data for the RTP engine */
 	int properties[AST_RTP_PROPERTY_MAX];                 /*!< Properties and their values */
-	struct ast_codec_pref pref;                           /*!< Codec packetization preferences */
 	struct sockaddr_in local_address;                     /*!< The address we are expecting RTP to be received on */
 	struct sockaddr_in remote_address;                    /*!< The address we are sending RTP to */
-	struct ast_rtp_payload_type payloads[AST_RTP_MAX_PT]; /*!< Payloads present */
+	struct ast_rtp_codecs codecs;                         /*!< Codec information */
+	int timeout;                                          /*!< RTP timeout time (negative or zero means disabled, negative value means temporarily disabled) */
+	int holdtimeout;                                      /*!< RTP timeout when on hold (negative or zero means disabled, negative value means temporarily disabled). */
+	int keepalive;                                        /*!< Send RTP comfort noice packets for keepalive */
 };
 
 struct ast_rtp_glue {
@@ -180,38 +187,32 @@
  */
 void ast_rtp_instance_set_prop(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value);
 
-/*! \brief Clear payload information from an RTP instance
- *
- * \param instance The RTP instance to clear payload information from
- */
-void ast_rtp_instance_payloads_clear(struct ast_rtp_instance *instance);
-
-/*! \brief Set payload information on an RTP instance to the default
- *
- * \param instance The RTP instance to set default payload information on
- */
-void ast_rtp_instance_payloads_default(struct ast_rtp_instance *instance);
+/*! \brief Clear payload information from an RTP instance */
+void ast_rtp_codecs_payloads_clear(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance);
+
+/*! \brief Set payload information on an RTP instance to the default */
+void ast_rtp_codecs_payloads_default(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance);
 
 /*! \brief Copy payload information from one RTP instance to another */
-void ast_rtp_instance_payloads_copy(struct ast_rtp_instance *src, struct ast_rtp_instance *dest);
+void ast_rtp_codecs_payloads_copy(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance);
 
 /*! \brief Record payload information that was seen in an m= SDP line */
-void ast_rtp_instance_payloads_set_m_type(struct ast_rtp_instance *instance, int payload);
+void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload);
 
 /*! \brief Record payload information that was seen in an a=rtpmap: SDP line */
-int ast_rtp_instance_payloads_set_rtpmap_type(struct ast_rtp_instance *instance, int payload, const char *mimeType, const char *mimeSubtype, enum ast_rtp_options options);
+int ast_rtp_codecs_payloads_set_rtpmap_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload, const char *mimeType, const char *mimeSubtype, enum ast_rtp_options options);
 
 /*! \brief Remove payload information */
-void ast_rtp_instance_payloads_unset(struct ast_rtp_instance *instance, int payload);
+void ast_rtp_codecs_payloads_unset(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload);
 
 /*! \brief Retrieve payload information by payload */
-struct ast_rtp_payload_type ast_rtp_instance_payload_lookup(struct ast_rtp_instance *instance, int payload);
+struct ast_rtp_payload_type ast_rtp_codecs_payload_lookup(struct ast_rtp_codecs *codecs, int payload);
 
 /*! \brief Retrieve all formats that were found */
-void ast_rtp_instance_payload_formats(struct ast_rtp_instance *instance, int *AstFormats, int *nonAstFormats);
+void ast_rtp_codecs_payload_formats(struct ast_rtp_codecs *codecs, int *AstFormats, int *nonAstFormats);
 
 /*! \brief Retrieve a payload based on whether it is an Asterisk format and the code */
-int ast_rtp_instance_payload_code(struct ast_rtp_instance *instance, const int isAstFormat, const int code);
+int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, const int isAstFormat, const int code);
 
 /*! \brief Retrieve mime subtype information on a payload */
 const char *ast_rtp_lookup_mime_subtype(const int isAstFormat, const int code, enum ast_rtp_options options);
@@ -220,7 +221,7 @@
 char *ast_rtp_lookup_mime_multiple(char *buf, size_t size, const int capability, const int isAstFormat, enum ast_rtp_options options);
 
 /*! \brief Set codec packetization preferences */
-void ast_rtp_instance_packetization_set(struct ast_rtp_instance *instance, struct ast_codec_pref *prefs);
+void ast_rtp_codecs_packetization_set(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, struct ast_codec_pref *prefs);
 
 /*! \brief Begin sending a DTMF digit
  *

Modified: team/file/rtp_engine/main/rtp_engine.c
URL: http://svn.digium.com/view/asterisk/team/file/rtp_engine/main/rtp_engine.c?view=diff&rev=129107&r1=129106&r2=129107
==============================================================================
--- team/file/rtp_engine/main/rtp_engine.c (original)
+++ team/file/rtp_engine/main/rtp_engine.c Tue Jul  8 13:20:26 2008
@@ -269,14 +269,14 @@
 	return;
 }
 
-void ast_rtp_instance_payloads_clear(struct ast_rtp_instance *instance)
-{
-	int i;
-
-	for (i = 0; i < AST_RTP_MAX_PT; i++) {
-		instance->payloads[i].isAstFormat = 0;
-		instance->payloads[i].code = 0;
-		if (instance->engine && instance->engine->payload_set) {
+void ast_rtp_codecs_payloads_clear(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
+{
+	int i;
+
+	for (i = 0; i < AST_RTP_MAX_PT; i++) {
+		codecs->payloads[i].isAstFormat = 0;
+		codecs->payloads[i].code = 0;
+		if (instance && instance->engine && instance->engine->payload_set) {
 			instance->engine->payload_set(instance, i, 0, 0);
 		}
 	}
@@ -284,52 +284,52 @@
 	return;
 }
 
-void ast_rtp_instance_payloads_default(struct ast_rtp_instance *instance)
-{
-	int i;
-
-	for (i = 0; i < AST_RTP_MAX_PT; i++) {
-		instance->payloads[i].isAstFormat = static_RTP_PT[i].isAstFormat;
-		instance->payloads[i].code = static_RTP_PT[i].code;
-		if (instance->engine && instance->engine->payload_set) {
-			instance->engine->payload_set(instance, i, instance->payloads[i].isAstFormat, instance->payloads[i].code);
-		}
-	}
-
-	return;
-}
-
-void ast_rtp_instance_payloads_copy(struct ast_rtp_instance *src, struct ast_rtp_instance *dest)
+void ast_rtp_codecs_payloads_default(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
+{
+	int i;
+
+	for (i = 0; i < AST_RTP_MAX_PT; i++) {
+		codecs->payloads[i].isAstFormat = static_RTP_PT[i].isAstFormat;
+		codecs->payloads[i].code = static_RTP_PT[i].code;
+		if (instance && instance->engine && instance->engine->payload_set) {
+			instance->engine->payload_set(instance, i, codecs->payloads[i].isAstFormat, codecs->payloads[i].code);
+		}
+	}
+
+	return;
+}
+
+void ast_rtp_codecs_payloads_copy(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
 {
 	int i;
 
 	for (i = 0; i < AST_RTP_MAX_PT; i++) {
 		dest->payloads[i].isAstFormat = src->payloads[i].isAstFormat;
 		dest->payloads[i].code = src->payloads[i].code;
-		if (dest->engine && dest->engine->payload_set) {
-			dest->engine->payload_set(dest, i, dest->payloads[i].isAstFormat, dest->payloads[i].code);
-		}
-	}
-
-	return;
-}
-
-void ast_rtp_instance_payloads_set_m_type(struct ast_rtp_instance *instance, int payload)
+		if (instance && instance->engine && instance->engine->payload_set) {
+			instance->engine->payload_set(instance, i, dest->payloads[i].isAstFormat, dest->payloads[i].code);
+		}
+	}
+
+	return;
+}
+
+void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 {
 	if (payload < 0 || payload > AST_RTP_MAX_PT || !static_RTP_PT[payload].code) {
 		return;
 	}
 
-	instance->payloads[payload] = static_RTP_PT[payload];
-
-	if (instance->engine && instance->engine->payload_set) {
-		instance->engine->payload_set(instance, payload, instance->payloads[payload].isAstFormat, instance->payloads[payload].code);
-	}
-
-	return;
-}
-
-int ast_rtp_instance_payloads_set_rtpmap_type(struct ast_rtp_instance *instance, int payload, const char *mimeType, const char *mimeSubtype, enum ast_rtp_options options)
+	codecs->payloads[payload] = static_RTP_PT[payload];
+
+	if (instance && instance->engine && instance->engine->payload_set) {
+		instance->engine->payload_set(instance, payload, codecs->payloads[payload].isAstFormat, codecs->payloads[payload].code);
+	}
+
+	return;
+}
+
+int ast_rtp_codecs_payloads_set_rtpmap_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload, const char *mimeType, const char *mimeSubtype, enum ast_rtp_options options)
 {
 	int i;
 
@@ -339,9 +339,9 @@
 
 	for (i = 0; i < AST_RTP_MAX_PT; i++) {
 		if (!strcasecmp(mimeTypes[i].subtype, mimeSubtype) && !strcasecmp(mimeTypes[i].type, mimeType)) {
-			instance->payloads[i] = mimeTypes[i].payloadType;
-			if (instance->engine && instance->engine->payload_set) {
-				instance->engine->payload_set(instance, i, instance->payloads[i].isAstFormat, instance->payloads[i].code);
+			codecs->payloads[i] = mimeTypes[i].payloadType;
+			if (instance && instance->engine && instance->engine->payload_set) {
+				instance->engine->payload_set(instance, i, codecs->payloads[i].isAstFormat, codecs->payloads[i].code);
 			}
 			return 0;
 		}
@@ -350,23 +350,23 @@
 	return -1;
 }
 
-void ast_rtp_instance_payloads_unset(struct ast_rtp_instance *instance, int payload)
+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) {
 		return;
 	}
 
-	instance->payloads[payload].isAstFormat = 0;
-	instance->payloads[payload].code = 0;
-
-	if (instance->engine && instance->engine->payload_set) {
+	codecs->payloads[payload].isAstFormat = 0;
+	codecs->payloads[payload].code = 0;
+
+	if (instance && instance->engine && instance->engine->payload_set) {
 		instance->engine->payload_set(instance, payload, 0, 0);
 	}
 
 	return;
 }
 
-struct ast_rtp_payload_type ast_rtp_instance_payload_lookup(struct ast_rtp_instance *instance, int payload)
+struct ast_rtp_payload_type ast_rtp_codecs_payload_lookup(struct ast_rtp_codecs *codecs, int payload)
 {
 	struct ast_rtp_payload_type result = { .isAstFormat = 0, };
 
@@ -374,7 +374,7 @@
 		return result;
 	}
 
-	result = instance->payloads[payload];
+	result = codecs->payloads[payload];
 
 	if (!result.code) {
 		result = static_RTP_PT[payload];
@@ -383,29 +383,29 @@
 	return result;
 }
 
-void ast_rtp_instance_payload_formats(struct ast_rtp_instance *instance, int *AstFormats, int *nonAstFormats)
+void ast_rtp_codecs_payload_formats(struct ast_rtp_codecs *codecs, int *AstFormats, int *nonAstFormats)
 {
 	int i;
 
 	*AstFormats = *nonAstFormats = 0;
 
 	for (i = 0; i < AST_RTP_MAX_PT; i++) {
-		if (instance->payloads[i].isAstFormat) {
-			*AstFormats |= instance->payloads[i].code;
+		if (codecs->payloads[i].isAstFormat) {
+			*AstFormats |= codecs->payloads[i].code;
 		} else {
-			*nonAstFormats |= instance->payloads[i].code;
-		}
-	}
-
-	return;
-}
-
-int ast_rtp_instance_payload_code(struct ast_rtp_instance *instance, const int isAstFormat, const int code)
-{
-	int i;
-
-	for (i = 0; i < AST_RTP_MAX_PT; i++) {
-		if (instance->payloads[i].isAstFormat == isAstFormat && instance->payloads[i].code == code) {
+			*nonAstFormats |= codecs->payloads[i].code;
+		}
+	}
+
+	return;
+}
+
+int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, const int isAstFormat, const int code)
+{
+	int i;
+
+	for (i = 0; i < AST_RTP_MAX_PT; i++) {
+		if (codecs->payloads[i].isAstFormat == isAstFormat && codecs->payloads[i].code == code) {
 			return i;
 		}
 	}
@@ -473,17 +473,17 @@
 	return buf;
 }
 
-void ast_rtp_instance_packetization_set(struct ast_rtp_instance *instance, struct ast_codec_pref *prefs)
+void ast_rtp_codecs_packetization_set(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, struct ast_codec_pref *prefs)
 {
 	int i;
 
 	for (i = 0; i < 32; i++) {
-		instance->pref.order[i] = prefs->order[i];
-		instance->pref.framing[i] = prefs->framing[i];
-	}
-
-	if (instance->engine->packetization_set) {
-		instance->engine->packetization_set(instance, &instance->pref);
+		codecs->pref.order[i] = prefs->order[i];
+		codecs->pref.framing[i] = prefs->framing[i];
+	}
+
+	if (instance && instance->engine->packetization_set) {
+		instance->engine->packetization_set(instance, &instance->codecs.pref);
 	}
 
 	return;

Modified: team/file/rtp_engine/res/res_rtp_asterisk.c
URL: http://svn.digium.com/view/asterisk/team/file/rtp_engine/res/res_rtp_asterisk.c?view=diff&rev=129107&r1=129106&r2=129107
==============================================================================
--- team/file/rtp_engine/res/res_rtp_asterisk.c (original)
+++ team/file/rtp_engine/res/res_rtp_asterisk.c Tue Jul  8 13:20:26 2008
@@ -371,7 +371,7 @@
 	}
 
 	/* Grab the payload that they expect the RFC2833 packet to be received in */
-	payload = ast_rtp_instance_payload_code(instance, 0, AST_RTP_DTMF);
+	payload = ast_rtp_codecs_payload_code(&instance->codecs, 0, AST_RTP_DTMF);
 
 	/* Create the actual packet that we will be sending */
 	rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
@@ -655,7 +655,7 @@
 	if (frame->frametype == AST_FRAME_VIDEO) {
 		subclass &= ~0x1;
 	}
-	if ((codec = ast_rtp_instance_payload_code(instance, 1, subclass)) < 0) {
+	if ((codec = ast_rtp_codecs_payload_code(&instance->codecs, 1, subclass)) < 0) {
 		ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(frame->subclass));
 		return -1;
 	}
@@ -672,7 +672,7 @@
 
 	/* If no smoother is present see if we have to set one up */
 	if (!rtp->smoother && subclass != AST_FORMAT_SLINEAR && subclass != AST_FORMAT_G723_1) {
-		struct ast_format_list fmt = ast_codec_pref_getsize(&instance->pref, subclass);
+		struct ast_format_list fmt = ast_codec_pref_getsize(&instance->codecs.pref, subclass);
 		if (fmt.inc_ms) {
 			if (!(rtp->smoother = ast_smoother_new((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms))) {
 				ast_log(LOG_WARNING, "Unable to create smoother: format %d ms: %d len: %d\n", subclass, fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
@@ -838,7 +838,7 @@
 			    ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
 	}
 
-	payload = ast_rtp_instance_payload_lookup(instance, payloadtype);
+	payload = ast_rtp_codecs_payload_lookup(&instance->codecs, payloadtype);
 
 	/* If the payload is not actually an Asterisk one but a special one pass it off to the respective handler */
 	if (!payload.isAstFormat) {




More information about the svn-commits mailing list