summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2009-06-19 15:41:24 +0000
committerJoshua Colp <jcolp@digium.com>2009-06-19 15:41:24 +0000
commite85296e24493709535857ae10e70d1067b9691ea (patch)
treeba2c013a77fabb40e732c6cda3198cdb67835304
parentad0d1bfd9e531b8fd0a7c04238f69850c07824bd (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.c2
-rw-r--r--include/asterisk/rtp_engine.h22
-rw-r--r--main/rtp_engine.c12
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;