Add support for allowing an RTP engine to decide on whether it is possible for specif...
authorJoshua Colp <jcolp@digium.com>
Fri, 19 Jun 2009 15:41:24 +0000 (15:41 +0000)
committerJoshua Colp <jcolp@digium.com>
Fri, 19 Jun 2009 15:41:24 +0000 (15:41 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@201902 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
include/asterisk/rtp_engine.h
main/rtp_engine.c

index 97168e7..c61db0c 100644 (file)
@@ -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 */
index 3fcc129..2baae32 100644 (file)
@@ -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
  *
index cb4caaf..ad8544c 100644 (file)
@@ -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;