summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2015-08-03 08:43:50 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-08-03 08:43:50 -0500
commit20ee33e22e3724c35ab3078c5032b87af5b4920c (patch)
tree5ff17b8ac0c7e4fa448934ce312b42d45afd3c45
parente28fbebc575065461964f5aac8246a3e5cdb9a03 (diff)
parent89b21fd9a38bcd89402249440c1670ce48781f30 (diff)
Merge topic 'misc_rtp_tweaks' into 13
* changes: rtp_engine.h: No sense allowing payload types larger than RFC allows. rtp_engine.c: Minor tweaks. rtp_engine.h: Misc comment fixes. chan_sip.c: Tweak glue->update_peer() parameter nil value.
-rw-r--r--channels/chan_sip.c2
-rw-r--r--include/asterisk/rtp_engine.h18
-rw-r--r--main/rtp_engine.c40
3 files changed, 32 insertions, 28 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 1838bdaad..9ab429e83 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7350,7 +7350,7 @@ static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
redirect of both channels). Note that a channel can not be masqueraded *into*
a native bridge. So there is no danger that this breaks a native bridge that
should stay up. */
- sip_set_rtp_peer(newchan, NULL, NULL, 0, 0, 0);
+ sip_set_rtp_peer(newchan, NULL, NULL, NULL, NULL, 0);
ret = 0;
}
ast_debug(3, "SIP Fixup: New owner for dialogue %s: %s (Old parent: %s)\n", p->callid, ast_channel_name(p->owner), ast_channel_name(oldchan));
diff --git a/include/asterisk/rtp_engine.h b/include/asterisk/rtp_engine.h
index b7ac2a149..80183ede7 100644
--- a/include/asterisk/rtp_engine.h
+++ b/include/asterisk/rtp_engine.h
@@ -1,4 +1,4 @@
- /*
+/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2009, Digium, Inc.
@@ -78,14 +78,13 @@ extern "C" {
#include "asterisk/stasis.h"
#include "asterisk/vector.h"
-/* Maximum number of payloads supported */
-#if defined(LOW_MEMORY)
+/*! Maximum number of payload types RTP can support. */
#define AST_RTP_MAX_PT 128
-#else
-#define AST_RTP_MAX_PT 196
-#endif
-/* Maximum number of generations */
+/*! First dynamic RTP payload type */
+#define AST_RTP_PT_FIRST_DYNAMIC 96
+
+/*! Maximum number of generations */
#define AST_RED_MAX_GENERATION 5
/*!
@@ -625,7 +624,7 @@ struct ast_rtp_glue {
enum ast_rtp_glue_result (*get_trtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance);
/*! Callback for updating the destination that the remote side should send RTP to */
int (*update_peer)(struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_rtp_instance *vinstance, struct ast_rtp_instance *tinstance, const struct ast_format_cap *cap, int nat_active);
- /*! Callback for retrieving codecs that the channel can do. Result returned in result_cap*/
+ /*! Callback for retrieving codecs that the channel can do. Result returned in result_cap. */
void (*get_codec)(struct ast_channel *chan, struct ast_format_cap *result_cap);
/*! Linked list information */
AST_RWLIST_ENTRY(ast_rtp_glue) entry;
@@ -1418,7 +1417,7 @@ unsigned int ast_rtp_lookup_sample_rate2(int asterisk_format, struct ast_format
* \code
* struct ast_format_cap *astformats = ast_format_cap_alloc_nolock()
* int nonastformats;
- * ast_rtp_codecs_payload_formats(&codecs, &astformats, &nonastformats);
+ * ast_rtp_codecs_payload_formats(&codecs, astformats, &nonastformats);
* \endcode
*
* This retrieves all the formats known about in the codecs structure and puts the Asterisk ones in the integer
@@ -1449,6 +1448,7 @@ void ast_rtp_codecs_payload_formats(struct ast_rtp_codecs *codecs, struct ast_fo
* \since 1.8
*/
int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, int asterisk_format, const struct ast_format *format, int code);
+
/*!
* \brief Search for a payload code in the ast_rtp_codecs structure
*
diff --git a/main/rtp_engine.c b/main/rtp_engine.c
index 0fca0dded..296d84f2c 100644
--- a/main/rtp_engine.c
+++ b/main/rtp_engine.c
@@ -236,7 +236,10 @@ static ast_rwlock_t static_RTP_PT_lock;
static struct stasis_topic *rtp_topic;
-/*! \internal \brief Destructor for \c ast_rtp_payload_type */
+/*!
+ * \internal
+ * \brief Destructor for \c ast_rtp_payload_type
+ */
static void rtp_payload_type_dtor(void *obj)
{
struct ast_rtp_payload_type *payload = obj;
@@ -248,7 +251,8 @@ struct ast_rtp_payload_type *ast_rtp_engine_alloc_payload_type(void)
{
struct ast_rtp_payload_type *payload;
- payload = ao2_alloc(sizeof(*payload), rtp_payload_type_dtor);
+ payload = ao2_alloc_options(sizeof(*payload), rtp_payload_type_dtor,
+ AO2_ALLOC_OPT_LOCK_NOLOCK);
return payload;
}
@@ -644,17 +648,16 @@ void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct as
{
struct ast_rtp_payload_type *new_type;
- new_type = ast_rtp_engine_alloc_payload_type();
- if (!new_type) {
+ if (payload < 0 || payload >= AST_RTP_MAX_PT) {
return;
}
- ast_rwlock_rdlock(&static_RTP_PT_lock);
- if (payload < 0 || payload >= AST_RTP_MAX_PT) {
- ast_rwlock_unlock(&static_RTP_PT_lock);
+ new_type = ast_rtp_engine_alloc_payload_type();
+ if (!new_type) {
return;
}
+ ast_rwlock_rdlock(&static_RTP_PT_lock);
ast_rwlock_wrlock(&codecs->codecs_lock);
if (payload < AST_VECTOR_SIZE(&codecs->payloads)) {
ao2_t_cleanup(AST_VECTOR_GET(&codecs->payloads, payload), "cleaning up replaced payload type");
@@ -684,12 +687,11 @@ int ast_rtp_codecs_payloads_set_rtpmap_type_rate(struct ast_rtp_codecs *codecs,
unsigned int i;
int found = 0;
- ast_rwlock_rdlock(&mime_types_lock);
if (pt < 0 || pt >= AST_RTP_MAX_PT) {
- ast_rwlock_unlock(&mime_types_lock);
return -1; /* bogus payload type */
}
+ ast_rwlock_rdlock(&mime_types_lock);
ast_rwlock_wrlock(&codecs->codecs_lock);
for (i = 0; i < mime_types_len; ++i) {
const struct ast_rtp_mime_type *t = &ast_rtp_mime_types[i];
@@ -1738,22 +1740,24 @@ static void set_next_mime_type(struct ast_format *format, int rtp_code, const ch
static void add_static_payload(int map, struct ast_format *format, int rtp_code)
{
int x;
+
+ ast_assert(map < ARRAY_LEN(static_RTP_PT));
+
ast_rwlock_wrlock(&static_RTP_PT_lock);
if (map < 0) {
/* find next available dynamic payload slot */
- for (x = 96; x < 127; x++) {
+ for (x = AST_RTP_PT_FIRST_DYNAMIC; x < AST_RTP_MAX_PT; ++x) {
if (!static_RTP_PT[x].asterisk_format && !static_RTP_PT[x].rtp_code) {
map = x;
break;
}
}
- }
-
- if (map < 0) {
- ast_log(LOG_WARNING, "No Dynamic RTP mapping available for format %s\n",
- ast_format_get_name(format));
- ast_rwlock_unlock(&static_RTP_PT_lock);
- return;
+ if (map < 0) {
+ ast_log(LOG_WARNING, "No Dynamic RTP mapping available for format %s\n",
+ ast_format_get_name(format));
+ ast_rwlock_unlock(&static_RTP_PT_lock);
+ return;
+ }
}
if (format) {
@@ -2094,7 +2098,7 @@ static void rtp_engine_shutdown(void)
ast_rwlock_unlock(&mime_types_lock);
}
-int ast_rtp_engine_init()
+int ast_rtp_engine_init(void)
{
ast_rwlock_init(&mime_types_lock);
ast_rwlock_init(&static_RTP_PT_lock);