Add support for allowing an RTP engine to decide on whether it is possible for specific formats to be transcoded for an RTP instance.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@201902 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.6
Joshua Colp 17 years ago
parent ad0d1bfd9e
commit e85296e244

@ -5338,7 +5338,7 @@ static int sip_call(struct ast_channel *ast, char *dest, int timeout)
return res; return res;
} }
p->callingpres = ast->cid.cid_pres; p->callingpres = ast->cid.cid_pres;
p->jointcapability = ast_translate_available_formats(p->capability, p->prefcodec); p->jointcapability = ast_rtp_instance_available_formats(p->rtp, p->capability, p->prefcodec);
p->jointnoncodeccapability = p->noncodeccapability; p->jointnoncodeccapability = p->noncodeccapability;
/* If there are no audio formats left to offer, punt */ /* If there are no audio formats left to offer, punt */

@ -353,6 +353,8 @@ struct ast_rtp_engine {
int (*activate)(struct ast_rtp_instance *instance); int (*activate)(struct ast_rtp_instance *instance);
/*! Callback to request that the RTP engine send a STUN BIND request */ /*! Callback to request that the RTP engine send a STUN BIND request */
void (*stun_request)(struct ast_rtp_instance *instance, struct sockaddr_in *suggestion, const char *username); void (*stun_request)(struct ast_rtp_instance *instance, struct sockaddr_in *suggestion, const char *username);
/*! Callback to get the transcodeable formats supported */
int (*available_formats)(struct ast_rtp_instance *instance, int to_endpoint, int to_asterisk);
/*! Linked list information */ /*! Linked list information */
AST_RWLIST_ENTRY(ast_rtp_engine) entry; AST_RWLIST_ENTRY(ast_rtp_engine) entry;
}; };
@ -1497,6 +1499,26 @@ int ast_rtp_instance_set_write_format(struct ast_rtp_instance *instance, int for
*/ */
int ast_rtp_instance_make_compatible(struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_channel *peer); int ast_rtp_instance_make_compatible(struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_channel *peer);
/*! \brief Request the formats that can be transcoded
*
* \param instance The RTP instance
* \param to_endpoint Formats being sent/received towards the endpoint
* \param to_asterisk Formats being sent/received towards Asterisk
*
* \retval supported formats
*
* Example usage:
*
* \code
* ast_rtp_instance_available_formats(instance, AST_FORMAT_ULAW, AST_FORMAT_SLINEAR);
* \endcode
*
* This sees if it is possible to have ulaw communicated to the endpoint but signed linear received into Asterisk.
*
* \since 1.6.3
*/
int ast_rtp_instance_available_formats(struct ast_rtp_instance *instance, int to_endpoint, int to_asterisk);
/*! /*!
* \brief Indicate to the RTP engine that packets are now expected to be sent/received on the RTP instance * \brief Indicate to the RTP engine that packets are now expected to be sent/received on the RTP instance
* *

@ -37,6 +37,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/options.h" #include "asterisk/options.h"
#include "asterisk/astobj2.h" #include "asterisk/astobj2.h"
#include "asterisk/pbx.h" #include "asterisk/pbx.h"
#include "asterisk/translate.h"
/*! Structure that represents an RTP session (instance) */ /*! Structure that represents an RTP session (instance) */
struct ast_rtp_instance { struct ast_rtp_instance {
@ -1572,6 +1573,17 @@ int ast_rtp_instance_make_compatible(struct ast_channel *chan, struct ast_rtp_in
return res; return res;
} }
int ast_rtp_instance_available_formats(struct ast_rtp_instance *instance, int to_endpoint, int to_asterisk)
{
int formats;
if (instance->engine->available_formats && (formats = instance->engine->available_formats(instance, to_endpoint, to_asterisk))) {
return formats;
}
return ast_translate_available_formats(to_endpoint, to_asterisk);
}
int ast_rtp_instance_activate(struct ast_rtp_instance *instance) int ast_rtp_instance_activate(struct ast_rtp_instance *instance)
{ {
return instance->engine->activate ? instance->engine->activate(instance) : 0; return instance->engine->activate ? instance->engine->activate(instance) : 0;

Loading…
Cancel
Save