[asterisk-commits] file: branch file/rtp_engine r131132 - in /team/file/rtp_engine: include/aste...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jul 15 19:00:16 CDT 2008


Author: file
Date: Tue Jul 15 19:00:15 2008
New Revision: 131132

URL: http://svn.digium.com/view/asterisk?view=rev&rev=131132
Log:
Add an API call which produces a string of various quality metrics.

Modified:
    team/file/rtp_engine/include/asterisk/rtp_engine.h
    team/file/rtp_engine/main/rtp_engine.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=131132&r1=131131&r2=131132
==============================================================================
--- team/file/rtp_engine/include/asterisk/rtp_engine.h (original)
+++ team/file/rtp_engine/include/asterisk/rtp_engine.h Tue Jul 15 19:00:15 2008
@@ -101,6 +101,18 @@
 	AST_RTP_GLUE_RESULT_REMOTE,
 	/*! Perform RTP engine level bridging if possible */
 	AST_RTP_GLUE_RESULT_LOCAL,
+};
+
+/*! Field statistics that can be retrieved from an RTP instance */
+enum ast_rtp_instance_stat_field {
+	/*! Retrieve quality information */
+	AST_RTP_INSTANCE_STAT_FIELD_QUALITY = 0,
+	/*! Retrieve quality information about jitter */
+	AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER,
+	/*! Retrieve quality information about packet loss */
+	AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS,
+	/*! Retrieve quality information about round trip time */
+	AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT,
 };
 
 /*! Statistics that can be retrieved from an RTP instance */
@@ -961,8 +973,8 @@
  * \param stats Structure to put results into
  * \param stat What statistic(s) to retrieve
  *
- * \retval 0 on success
- * \retval -1 on failure
+ * \retval 0 success
+ * \retval -1 failure
  *
  * Example usage:
  *
@@ -975,6 +987,27 @@
  * stats structure.
  */
 int ast_rtp_instance_get_stats(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat);
+
+/*! \brief Retrieve quality statistics about an RTP instance
+ *
+ * \param instance Instance to get statistics on
+ * \param field What quality statistic to retrieve
+ * \param buf What buffer to put the result into
+ * \param size Size of the above buffer
+ *
+ * \retval non-NULL success
+ * \retval NULL failure
+ *
+ * Example usage:
+ *
+ * \code
+ * char quality[AST_MAX_USER_FIELD];
+ * ast_rtp_instance_get_quality(instance, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, &buf, sizeof(buf));
+ * \endcode
+ *
+ * This retrieves general quality statistics and places a text representation into the buf pointed to by buf.
+ */
+char *ast_rtp_instance_get_quality(struct ast_rtp_instance *instance, enum ast_rtp_instance_stat_field field, char *buf, size_t size);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }

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=131132&r1=131131&r2=131132
==============================================================================
--- team/file/rtp_engine/main/rtp_engine.c (original)
+++ team/file/rtp_engine/main/rtp_engine.c Tue Jul 15 19:00:15 2008
@@ -26,6 +26,8 @@
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include <math.h>
 
 #include "asterisk/channel.h"
 #include "asterisk/frame.h"
@@ -1129,3 +1131,43 @@
 {
 	return instance->engine->get_stat ? instance->engine->get_stat(instance, stats, stat) : -1;
 }
+
+char *ast_rtp_instance_get_quality(struct ast_rtp_instance *instance, enum ast_rtp_instance_stat_field field, char *buf, size_t size)
+{
+	struct ast_rtp_instance_stats stats;
+	enum ast_rtp_instance_stat stat;
+
+	/* Determine what statistics we will need to retrieve based on field passed in */
+	if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY) {
+		stat = AST_RTP_INSTANCE_STAT_ALL;
+	} else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER) {
+		stat = AST_RTP_INSTANCE_STAT_COMBINED_JITTER;
+	} else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS) {
+		stat = AST_RTP_INSTANCE_STAT_COMBINED_LOSS;
+	} else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT) {
+		stat = AST_RTP_INSTANCE_STAT_COMBINED_RTT;
+	} else {
+		return NULL;
+	}
+
+	/* Attempt to actually retrieve the statistics we need to generate the quality string */
+	if (ast_rtp_instance_get_stats(instance, &stats, stat)) {
+		return NULL;
+	}
+
+	/* Now actually fill the buffer with the good information */
+	if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY) {
+		snprintf(buf, size, "ssrc=%i;themssrc=%u;lp=%u;rxjitter=%u;rxcount=%u;txjitter=%u;txcount=%u;rlp=%u;rtt=%u",
+			 stats.local_ssrc, stats.remote_ssrc, stats.rxploss, stats.txjitter, stats.rxcount, stats.rxjitter, stats.txcount, stats.txploss, stats.rtt);
+	} else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER) {
+		snprintf(buf, size, "minrxjitter=%f;maxrxjitter=%f;avgrxjitter=%f;stdevrxjitter=%f;reported_minjitter=%f;reported_maxjitter=%f;reported_avgjitter=%f;reported_stdevjitter=%f;",
+			 stats.local_minjitter, stats.local_maxjitter, stats.local_normdevjitter, sqrt(stats.local_stdevjitter), stats.remote_minjitter, stats.remote_maxjitter, stats.remote_normdevjitter, sqrt(stats.remote_stdevjitter));
+	} else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS) {
+		snprintf(buf, size, "minrxlost=%f;maxrxlost=%f;avgrxlost=%f;stdevrxlost=%f;reported_minlost=%f;reported_maxlost=%f;reported_avglost=%f;reported_stdevlost=%f;",
+			 stats.local_minrxploss, stats.local_maxrxploss, stats.local_normdevrxploss, sqrt(stats.local_stdevrxploss), stats.remote_minrxploss, stats.remote_maxrxploss, stats.remote_normdevrxploss, sqrt(stats.remote_stdevrxploss));
+	} else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT) {
+		snprintf(buf, size, "minrtt=%f;maxrtt=%f;avgrtt=%f;stdevrtt=%f;", stats.minrtt, stats.maxrtt, stats.normdevrtt, stats.stdevrtt);
+	}
+
+	return buf;
+}




More information about the asterisk-commits mailing list