Merge topic 'misc_rtp_tweaks'
* changes: rtp_engine.h: No sense allowing payload types larger than RFC allows. rtp_engine.c: Minor tweaks. rtp_engine.h: Misc comment fixes.
This commit is contained in:
commit
8eef7392c4
2 changed files with 31 additions and 27 deletions
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
||||
if (payload < 0 || payload >= AST_RTP_MAX_PT) {
|
||||
return;
|
||||
}
|
||||
|
||||
new_type = ast_rtp_engine_alloc_payload_type();
|
||||
if (!new_type) {
|
||||
return;
|
||||
}
|
||||
|
||||
ast_rwlock_rdlock(&static_RTP_PT_lock);
|
||||
if (payload < 0 || payload >= AST_RTP_MAX_PT) {
|
||||
ast_rwlock_unlock(&static_RTP_PT_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
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,23 +1740,25 @@ 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 (format) {
|
||||
static_RTP_PT[map].asterisk_format = 1;
|
||||
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue