diff options
author | Joshua Colp <jcolp@digium.com> | 2009-06-19 15:41:24 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2009-06-19 15:41:24 +0000 |
commit | e85296e24493709535857ae10e70d1067b9691ea (patch) | |
tree | ba2c013a77fabb40e732c6cda3198cdb67835304 | |
parent | ad0d1bfd9e531b8fd0a7c04238f69850c07824bd (diff) |
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
-rw-r--r-- | channels/chan_sip.c | 2 | ||||
-rw-r--r-- | include/asterisk/rtp_engine.h | 22 | ||||
-rw-r--r-- | main/rtp_engine.c | 12 |
3 files changed, 35 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 97168e7ee..c61db0cbf 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -5338,7 +5338,7 @@ static int sip_call(struct ast_channel *ast, char *dest, int timeout) return res; } 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; /* If there are no audio formats left to offer, punt */ diff --git a/include/asterisk/rtp_engine.h b/include/asterisk/rtp_engine.h index 3fcc12989..2baae32cf 100644 --- a/include/asterisk/rtp_engine.h +++ b/include/asterisk/rtp_engine.h @@ -353,6 +353,8 @@ struct ast_rtp_engine { int (*activate)(struct ast_rtp_instance *instance); /*! 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); + /*! Callback to get the transcodeable formats supported */ + int (*available_formats)(struct ast_rtp_instance *instance, int to_endpoint, int to_asterisk); /*! Linked list information */ 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); +/*! \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 * diff --git a/main/rtp_engine.c b/main/rtp_engine.c index cb4caafdd..ad8544c9a 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -37,6 +37,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/options.h" #include "asterisk/astobj2.h" #include "asterisk/pbx.h" +#include "asterisk/translate.h" /*! Structure that represents an RTP session (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; } +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) { return instance->engine->activate ? instance->engine->activate(instance) : 0; |