summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/asterisk/rtp_engine.h6
-rw-r--r--include/asterisk/sdp.h559
-rw-r--r--include/asterisk/sdp_options.h390
-rw-r--r--include/asterisk/sdp_priv.h130
-rw-r--r--include/asterisk/sdp_state.h101
-rw-r--r--include/asterisk/sdp_translator.h9
-rw-r--r--include/asterisk/stream.h47
7 files changed, 1025 insertions, 217 deletions
diff --git a/include/asterisk/rtp_engine.h b/include/asterisk/rtp_engine.h
index c0ae33155..c18e100b6 100644
--- a/include/asterisk/rtp_engine.h
+++ b/include/asterisk/rtp_engine.h
@@ -1432,7 +1432,8 @@ unsigned int ast_rtp_codecs_get_framing(struct ast_rtp_codecs *codecs);
*
* \since 1.8
*/
-unsigned int ast_rtp_lookup_sample_rate2(int asterisk_format, struct ast_format *format, int code);
+unsigned int ast_rtp_lookup_sample_rate2(int asterisk_format,
+ const struct ast_format *format, int code);
/*!
* \brief Retrieve all formats that were found
@@ -1537,7 +1538,8 @@ int ast_rtp_codecs_find_payload_code(struct ast_rtp_codecs *codecs, int payload)
*
* \since 1.8
*/
-const char *ast_rtp_lookup_mime_subtype2(const int asterisk_format, struct ast_format *format, int code, enum ast_rtp_options options);
+const char *ast_rtp_lookup_mime_subtype2(const int asterisk_format,
+ const struct ast_format *format, int code, enum ast_rtp_options options);
/*!
* \brief Convert formats into a string and put them into a buffer
diff --git a/include/asterisk/sdp.h b/include/asterisk/sdp.h
new file mode 100644
index 000000000..4d6d2fbb5
--- /dev/null
+++ b/include/asterisk/sdp.h
@@ -0,0 +1,559 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2017, Digium, Inc.
+ *
+ * Mark Michelson <mmichelson@digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/* NOTE: It is unlikely that you need to include this file. You probably will only need
+ * this if you are an SDP translator, or if you are an inner part of the SDP API
+ */
+
+#ifndef _SDP_PRIV_H
+#define _SDP_PRIV_H
+
+#include "asterisk/vector.h"
+#include "asterisk/format.h"
+#include "asterisk/sdp_state.h"
+#include "asterisk/stream.h"
+
+/*!
+ * \brief Structure representing an SDP Attribute
+ */
+struct ast_sdp_a_line {
+ /*! Attribute name */
+ char *name;
+ /*! Attribute value. For attributes that have no value, this will be an empty string */
+ char *value;
+};
+
+/*!
+ * \brief A collection of SDP Attributes
+ */
+AST_VECTOR(ast_sdp_a_lines, struct ast_sdp_a_line *);
+
+/*!
+ * \brief Structure representing an SDP Connection
+ */
+struct ast_sdp_c_line {
+ /* IP family string (e.g. IP4 or IP6) */
+ char *address_type;
+ /* Connection address. Can be an IP address or FQDN */
+ char *address;
+};
+
+/*!
+ * \brief Structre representing SDP Media Payloads
+ */
+struct ast_sdp_payload {
+ /* Media format description */
+ char *fmt;
+};
+
+/*!
+ * \brief A collection of SDP Media Payloads
+ */
+AST_VECTOR(ast_sdp_payloads, struct ast_sdp_payload *);
+
+/*!
+ * \brief Structure representing an SDP Media Stream
+ *
+ * This contains both the m line, as well as its
+ * constituent a lines.
+ */
+struct ast_sdp_m_line {
+ /*! Media type (e.g. "audio" or "video") */
+ char *type;
+ /*! RTP profile string (e.g. "RTP/AVP") */
+ char *proto;
+ /*! Port number in m line */
+ uint16_t port;
+ /*! Number of ports specified in m line */
+ uint16_t port_count;
+ /*! RTP payloads */
+ struct ast_sdp_payloads *payloads;
+ /*! Connection information for this media stream */
+ struct ast_sdp_c_line *c_line;
+ /*! The attributes for this media stream */
+ struct ast_sdp_a_lines *a_lines;
+};
+
+/*!
+ * \brief A collection of SDP Media Streams
+ */
+AST_VECTOR(ast_sdp_m_lines, struct ast_sdp_m_line *);
+
+/*!
+ * \brief Structure representing an SDP Origin
+ */
+struct ast_sdp_o_line {
+ /*! Origin user name */
+ char *username;
+ /*! Origin id */
+ uint64_t session_id;
+ /*! Origin version */
+ uint64_t session_version;
+ /*! Origin IP address type (e.g. "IP4" or "IP6") */
+ char *address_type;
+ /*! Origin address. Can be an IP address or FQDN */
+ char *address;
+};
+
+/*!
+ * \brief Structure representing an SDP Session Name
+ */
+struct ast_sdp_s_line {
+ /* Session Name */
+ char *session_name;
+};
+
+/*!
+ * \brief Structure representing SDP Timing
+ */
+struct ast_sdp_t_line {
+ /*! Session start time */
+ uint64_t start_time;
+ /*! Session end time */
+ uint64_t stop_time;
+};
+
+/*!
+ * \brief An SDP
+ */
+struct ast_sdp {
+ /*! SDP Origin line */
+ struct ast_sdp_o_line *o_line;
+ /*! SDP Session name */
+ struct ast_sdp_s_line *s_line;
+ /*! SDP top-level connection information */
+ struct ast_sdp_c_line *c_line;
+ /*! SDP timing information */
+ struct ast_sdp_t_line *t_line;
+ /*! SDP top-level attributes */
+ struct ast_sdp_a_lines *a_lines;
+ /*! SDP media streams */
+ struct ast_sdp_m_lines *m_lines;
+};
+
+/*!
+ * \brief Free an SDP Attribute
+ *
+ * \param a_line The attribute to free
+ *
+ * \since 15
+ */
+void ast_sdp_a_free(struct ast_sdp_a_line *a_line);
+
+/*!
+ * \brief Free an SDP Attribute collection
+ *
+ * \param a_lines The attribute collection to free
+ *
+ * \since 15
+ */
+void ast_sdp_a_lines_free(struct ast_sdp_a_lines *a_lines);
+
+/*!
+ * \brief Free SDP Connection Data
+ *
+ * \param c_line The connection data to free
+ *
+ * \since 15
+ */
+void ast_sdp_c_free(struct ast_sdp_c_line *c_line);
+
+/*!
+ * \brief Free an SDP Media Description Payload
+ *
+ * \param payload The payload to free
+ *
+ * \since 15
+ */
+void ast_sdp_payload_free(struct ast_sdp_payload *payload);
+
+/*!
+ * \brief Free an SDP Media Description Payload collection
+ *
+ * \param payloads collection to free
+ *
+ * \since 15
+ */
+void ast_sdp_payloads_free(struct ast_sdp_payloads *payloads);
+
+/*!
+ * \brief Free an SDP Media Description
+ * Frees the media description and all resources it contains
+ *
+ * \param m_line The media description to free
+ *
+ * \since 15
+ */
+void ast_sdp_m_free(struct ast_sdp_m_line *m_line);
+
+/*!
+ * \brief Free an SDP Media Description collection
+ *
+ * \param m_lines The collection description to free
+ *
+ * \since 15
+ */
+void ast_sdp_m_lines_free(struct ast_sdp_m_lines *m_lines);
+
+/*!
+ * \brief Free an SDP Origin
+ *
+ * \param o_line The origin description to free
+ *
+ * \since 15
+ */
+void ast_sdp_o_free(struct ast_sdp_o_line *o_line);
+
+/*!
+ * \brief Free an SDP Session
+ *
+ * \param s_line The session to free
+ *
+ * \since 15
+ */
+void ast_sdp_s_free(struct ast_sdp_s_line *s_line);
+
+/*!
+ * \brief Free SDP Timing
+ *
+ * \param t_line The timing description to free
+ *
+ * \since 15
+ */
+void ast_sdp_t_free(struct ast_sdp_t_line *t_line);
+
+/*!
+ * \brief Free an SDP
+ * Frees the sdp and all resources it contains
+ *
+ * \param sdp The sdp to free
+ *
+ * \since 15
+ */
+void ast_sdp_free(struct ast_sdp *sdp);
+
+/*!
+ * \brief Allocate an SDP Attribute
+ *
+ * \param name Attribute Name
+ * \param value Attribute Name
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_a_line *ast_sdp_a_alloc(const char *name, const char *value);
+
+/*!
+ * \brief Allocate an SDP Connection
+ *
+ * \param family Family ("IN", etc)
+ * \param addr Address
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_c_line *ast_sdp_c_alloc(const char *family, const char *addr);
+
+/*!
+ * \brief Allocate an SDP Media Description Payload
+ *
+ * \param fmt The media format description
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_payload *ast_sdp_payload_alloc(const char *fmt);
+
+/*!
+ * \brief Allocate an SDP Media Description
+ *
+ * \param type ("audio", "video", etc)
+ * \param port Starting port
+ * \param port_count Port pairs to allocate
+ * \param proto ("RTP/AVP", "RTP/SAVP", "udp")
+ * \param c_line Connection to add. May be NULL
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_m_line *ast_sdp_m_alloc(const char *type, uint16_t port,
+ uint16_t port_count, const char *proto, struct ast_sdp_c_line *c_line);
+
+/*!
+ * \brief Allocate an SDP Session
+ *
+ * \param session_name The session name
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_s_line *ast_sdp_s_alloc(const char *session_name);
+
+/*!
+ * \brief Allocate SDP Timing
+ *
+ * \param start_time (Seconds since 1900)
+ * \param end_time (Seconds since 1900)
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_t_line *ast_sdp_t_alloc(uint64_t start_time, uint64_t stop_time);
+
+/*!
+ * \brief Allocate an SDP Origin
+ *
+ * \param username User name
+ * \param sesison_id Session ID
+ * \param sesison_version Session Version
+ * \param address_type Address type ("IN4", "IN6", etc)
+ * \param address Unicast address
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_o_line *ast_sdp_o_alloc(const char *username, uint64_t session_id,
+ uint64_t session_version, const char *address_type, const char *address);
+
+/*!
+ * \brief Add an SDP Attribute to an SDP
+ *
+ * \param sdp SDP
+ * \param a_line Attribute
+ *
+ * \retval 0 Success
+ * \retval non-0 Failure
+ *
+ * \since 15
+ */
+int ast_sdp_add_a(struct ast_sdp *sdp, struct ast_sdp_a_line *a_line);
+
+/*!
+ * \brief Get the count of Attributes on an SDP
+ *
+ * \param sdp SDP
+ *
+ * \returns Number of Attributes
+ *
+ * \since 15
+ */
+int ast_sdp_get_a_count(const struct ast_sdp *sdp);
+
+/*!
+ * \brief Get an Attribute from an SDP
+ *
+ * \param sdp SDP
+ * \param index Attribute index
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_a_line *ast_sdp_get_a(const struct ast_sdp *sdp, int index);
+
+/*!
+ * \brief Add a Media Description to an SDP
+ *
+ * \param sdp SDP
+ * \param m_line Media Description
+ *
+ * \retval 0 Success
+ * \retval non-0 Failure
+ *
+ * \since 15
+ */
+int ast_sdp_add_m(struct ast_sdp *sdp, struct ast_sdp_m_line *m_line);
+
+/*!
+ * \brief Add a Media Description to an SDP
+ *
+ * \param sdp SDP
+ * \param options SDP Options
+ * \param rtp ast_rtp_instance
+ * \param stream stream
+ *
+ * \retval 0 Success
+ * \retval non-0 Failure
+ *
+ * \since 15
+ */
+int ast_sdp_add_m_from_stream(struct ast_sdp *sdp, const struct ast_sdp_options *options,
+ struct ast_rtp_instance *rtp, const struct ast_stream *stream);
+
+/*!
+ * \brief Get the count of Media Descriptions on an SDP
+ *
+ * \param sdp SDP
+ *
+ * \returns The number of Media Descriptions
+ *
+ * \since 15
+ */
+int ast_sdp_get_m_count(const struct ast_sdp *sdp);
+
+/*!
+ * \brief Get a Media Descriptions from an SDP
+ *
+ * \param sdp SDP
+ * \param index Media Description index
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_m_line *ast_sdp_get_m(const struct ast_sdp *sdp, int index);
+
+/*!
+ * \brief Add an SDP Attribute to a Media Description
+ *
+ * \param m_line Media Description
+ * \param a_line Attribute
+ *
+ * \retval 0 Success
+ * \retval non-0 Failure
+ *
+ * \since 15
+ */
+int ast_sdp_m_add_a(struct ast_sdp_m_line *m_line, struct ast_sdp_a_line *a_line);
+
+/*!
+ * \brief Get the count of Attributes on a Media Description
+ *
+ * \param m_line Media Description
+ *
+ * \returns Number of Attributes
+ *
+ * \since 15
+ */
+int ast_sdp_m_get_a_count(const struct ast_sdp_m_line *m_line);
+
+/*!
+ * \brief Get an Attribute from a Media Description
+ *
+ * \param m_line Media Description
+ * \param index Attribute index
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_a_line *ast_sdp_m_get_a(const struct ast_sdp_m_line *m_line, int index);
+
+/*!
+ * \brief Add a Payload to a Media Description
+ *
+ * \param m_line Media Description
+ * \param payload Payload
+ *
+ * \retval 0 Success
+ * \retval non-0 Failure
+ *
+ * \since 15
+ */
+int ast_sdp_m_add_payload(struct ast_sdp_m_line *m_line,
+ struct ast_sdp_payload *payload);
+
+/*!
+ * \brief Get the count of Payloads on a Media Description
+ *
+ * \param m_line Media Description
+ *
+ * \returns Number of Attributes
+ *
+ * \since 15
+ */
+int ast_sdp_m_get_payload_count(const struct ast_sdp_m_line *m_line);
+
+/*!
+ * \brief Get a Payload from a Media Description
+ *
+ * \param m_line Media Description
+ * \param index Payload index
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp_payload *ast_sdp_m_get_payload(const struct ast_sdp_m_line *m_line, int index);
+
+/*!
+ * \brief Add a Format to a Media Description
+ *
+ * \param m_line Media Description
+ * \param options SDP Options
+ * \param rtp_code rtp_code from ast_rtp_codecs_payload_code
+ * \param asterisk_format True if the value in format is to be used.
+ * \param format Format
+ * \param code from AST_RTP list
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+int ast_sdp_m_add_format(struct ast_sdp_m_line *m_line, const struct ast_sdp_options *options,
+ int rtp_code, int asterisk_format, const struct ast_format *format, int code);
+
+/*!
+ * \brief Create an SDP
+ *
+ * \param o_line Origin
+ * \param c_line Connection
+ * \param s_line Session
+ * \param t_line Timing
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp *ast_sdp_alloc(struct ast_sdp_o_line *o_line,
+ struct ast_sdp_c_line *c_line, struct ast_sdp_s_line *s_line,
+ struct ast_sdp_t_line *t_line);
+
+/*!
+ * \brief Create an SDP from an existing SDP State local topology
+ *
+ * \param sdp_state SDP State
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \since 15
+ */
+struct ast_sdp *ast_sdp_create_from_state(const struct ast_sdp_state *sdp_state);
+
+#endif /* _SDP_PRIV_H */
diff --git a/include/asterisk/sdp_options.h b/include/asterisk/sdp_options.h
index a5c2d084e..3995faf4a 100644
--- a/include/asterisk/sdp_options.h
+++ b/include/asterisk/sdp_options.h
@@ -22,6 +22,48 @@
struct ast_sdp_options;
/*!
+ * \brief ICE options
+ *
+ * This is an enum because it will support a TRICKLE-ICE option
+ * in the future.
+ */
+enum ast_sdp_options_ice {
+ /*! ICE is not enabled on this session */
+ AST_SDP_ICE_DISABLED,
+ /*! Standard ICE is enabled on this session */
+ AST_SDP_ICE_ENABLED_STANDARD,
+};
+
+/*!
+ * \brief Implementation of the SDP
+ *
+ * Users of the SDP API set the implementation based on what they
+ * natively handle. This indicates the type of SDP that the API expects
+ * when being given an SDP, and it indicates the type of SDP that the API
+ * returns when asked for one.
+ */
+enum ast_sdp_options_impl {
+ /*! SDP is represented as a string */
+ AST_SDP_IMPL_STRING,
+ /*! SDP is represented as a pjmedia_sdp_session */
+ AST_SDP_IMPL_PJMEDIA,
+ /*! End of the list */
+ AST_SDP_IMPL_END,
+};
+
+/*!
+ * \brief SDP encryption options
+ */
+enum ast_sdp_options_encryption {
+ /*! No encryption */
+ AST_SDP_ENCRYPTION_DISABLED,
+ /*! SRTP SDES encryption */
+ AST_SDP_ENCRYPTION_SRTP_SDES,
+ /*! DTLS encryption */
+ AST_SDP_ENCRYPTION_DTLS,
+};
+
+/*!
* \since 15.0.0
* \brief Allocate a new SDP options structure.
*
@@ -47,111 +89,343 @@ struct ast_sdp_options *ast_sdp_options_alloc(void);
void ast_sdp_options_free(struct ast_sdp_options *options);
/*!
- * \brief ICE options
+ * \since 15.0.0
+ * \brief Set SDP Options media_address
*
- * This is an enum because it is predicted that this eventually
- * support a TRICKLE-ICE option.
+ * \param options SDP Options
+ * \param media_address
*/
-enum ast_sdp_options_ice {
- /*! ICE is not enabled on this session */
- AST_SDP_ICE_DISABLED,
- /*! Standard ICE is enabled on this session */
- AST_SDP_ICE_ENABLED_STANDARD,
-};
+void ast_sdp_options_set_media_address(struct ast_sdp_options *options,
+ const char *media_address);
/*!
* \since 15.0.0
- * \brief Set ICE options
+ * \brief Get SDP Options media_address
+ *
+ * \param options SDP Options
*
- * The default is AST_SDP_ICE_DISABLED
+ * \returns media_address
*/
-int ast_sdp_options_set_ice(struct ast_sdp_options *options,
- enum ast_sdp_options_ice ice_setting);
+const char *ast_sdp_options_get_media_address(struct ast_sdp_options *options);
/*!
* \since 15.0.0
- * \brief Retrieve ICE options
+ * \brief Set SDP Options sdpowner
+ *
+ * \param options SDP Options
+ * \param sdpowner
*/
-enum ast_sdp_options_ice ast_sdp_options_get_ice(const struct ast_sdp_options *options);
+void ast_sdp_options_set_sdpowner(struct ast_sdp_options *options,
+ const char *sdpowner);
/*!
* \since 15.0.0
- * \brief Enable or disable telephone events.
+ * \brief Get SDP Options sdpowner
*
- * A non-zero value indicates telephone events are enabled.
- * A zero value indicates telephone events are disabled.
+ * \param options SDP Options
*
- * The default is 0
+ * \returns sdpowner
*/
-int ast_sdp_options_set_telephone_event(struct ast_sdp_options *options,
- int telephone_event_enabled);
+const char *ast_sdp_options_get_sdpowner(struct ast_sdp_options *options);
/*!
* \since 15.0.0
- * \brief Retrieve telephone event setting.
+ * \brief Set SDP Options sdpsession
*
- * \retval 0 Telephone events are currently disabled.
- * \retval non-zero Telephone events are currently enabled.
+ * \param options SDP Options
+ * \param sdpsession
*/
-int ast_sdp_options_get_telephone_event(const struct ast_sdp_options *options);
+void ast_sdp_options_set_sdpsession(struct ast_sdp_options *options,
+ const char *sdpsession);
/*!
- * \brief Representation of the SDP
+ * \since 15.0.0
+ * \brief Get SDP Options sdpsession
*
- * Users of the SDP API set the representation based on what they
- * natively handle. This indicates the type of SDP that the API expects
- * when being given an SDP, and it indicates the type of SDP that the API
- * returns when asked for one.
+ * \param options SDP Options
+ *
+ * \returns sdpsession
*/
-enum ast_sdp_options_repr {
- /*! SDP is represented as a string */
- AST_SDP_REPR_STRING,
- /*! SDP is represented as a pjmedia_sdp_session */
- AST_SDP_REPR_PJMEDIA,
- /*! End of the list */
- AST_SDP_REPR_END,
-};
+const char *ast_sdp_options_get_sdpsession(struct ast_sdp_options *options);
/*!
* \since 15.0.0
- * \brief Set the SDP representation
+ * \brief Set SDP Options rtp_engine
*
- * The default is AST_SDP_REPR_STRING
+ * \param options SDP Options
+ * \param rtp_engine
*/
-int ast_sdp_options_set_repr(struct ast_sdp_options *options,
- enum ast_sdp_options_repr repr);
+void ast_sdp_options_set_rtp_engine(struct ast_sdp_options *options,
+ const char *rtp_engine);
/*!
* \since 15.0.0
- * \brief Get the SDP representation
+ * \brief Get SDP Options rtp_engine
+ *
+ * \param options SDP Options
+ *
+ * \returns rtp_engine
*/
-enum ast_sdp_options_repr ast_sdp_options_get_repr(const struct ast_sdp_options *options);
+const char *ast_sdp_options_get_rtp_engine(struct ast_sdp_options *options);
/*!
- * \brief SDP encryption options
+ * \since 15.0.0
+ * \brief Set SDP Options bind_rtp_to_media_address
+ *
+ * \param options SDP Options
+ * \param bind_rtp_to_media_address
*/
-enum ast_sdp_options_encryption {
- /*! No encryption */
- AST_SDP_ENCRYPTION_DISABLED,
- /*! SRTP SDES encryption */
- AST_SDP_ENCRYPTION_SRTP_SDES,
- /*! DTLS encryption */
- AST_SDP_ENCRYPTION_DTLS,
-};
+void ast_sdp_options_set_bind_rtp_to_media_address(struct ast_sdp_options *options,
+ unsigned int bind_rtp_to_media_address);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options bind_rtp_to_media_address
+ *
+ * \param options SDP Options
+ *
+ * \returns bind_rtp_to_media_address
+ */
+unsigned int ast_sdp_options_get_bind_rtp_to_media_address(struct ast_sdp_options *options);
/*!
* \since 15.0.0
- * \brief Set the SDP encryption
+ * \brief Set SDP Options rtp_symmetric
*
- * The default is AST_SDP_ENCRYPTION_DISABLED
+ * \param options SDP Options
+ * \param rtp_symmetric
*/
-int ast_sdp_options_set_encryption(struct ast_sdp_options *options,
+void ast_sdp_options_set_rtp_symmetric(struct ast_sdp_options *options,
+ unsigned int rtp_symmetric);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options rtp_symmetric
+ *
+ * \param options SDP Options
+ *
+ * \returns rtp_symmetric
+ */
+unsigned int ast_sdp_options_get_rtp_symmetric(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options telephone_event
+ *
+ * \param options SDP Options
+ * \param telephone_event
+ */
+void ast_sdp_options_set_telephone_event(struct ast_sdp_options *options,
+ unsigned int telephone_event);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options telephone_event
+ *
+ * \param options SDP Options
+ *
+ * \returns telephone_event
+ */
+unsigned int ast_sdp_options_get_telephone_event(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options rtp_ipv6
+ *
+ * \param options SDP Options
+ * \param rtp_ipv6
+ */
+void ast_sdp_options_set_rtp_ipv6(struct ast_sdp_options *options,
+ unsigned int rtp_ipv6);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options rtp_ipv6
+ *
+ * \param options SDP Options
+ *
+ * \returns rtp_ipv6
+ */
+unsigned int ast_sdp_options_get_rtp_ipv6(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options g726_non_standard
+ *
+ * \param options SDP Options
+ * \param g726_non_standard
+ */
+void ast_sdp_options_set_g726_non_standard(struct ast_sdp_options *options,
+ unsigned int g726_non_standard);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options g726_non_standard
+ *
+ * \param options SDP Options
+ *
+ * \returns g726_non_standard
+ */
+unsigned int ast_sdp_options_get_g726_non_standard(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options locally_held
+ *
+ * \param options SDP Options
+ * \param locally_held
+ */
+void ast_sdp_options_set_locally_held(struct ast_sdp_options *options,
+ unsigned int locally_held);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options locally_held
+ *
+ * \param options SDP Options
+ *
+ * \returns locally_held
+ */
+unsigned int ast_sdp_options_get_locally_held(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options tos_audio
+ *
+ * \param options SDP Options
+ * \param tos_audio
+ */
+void ast_sdp_options_set_tos_audio(struct ast_sdp_options *options,
+ unsigned int tos_audio);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options tos_audio
+ *
+ * \param options SDP Options
+ *
+ * \returns tos_audio
+ */
+unsigned int ast_sdp_options_get_tos_audio(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options cos_audio
+ *
+ * \param options SDP Options
+ * \param cos_audio
+ */
+void ast_sdp_options_set_cos_audio(struct ast_sdp_options *options,
+ unsigned int cos_audio);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options cos_audio
+ *
+ * \param options SDP Options
+ *
+ * \returns cos_audio
+ */
+unsigned int ast_sdp_options_get_cos_audio(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options tos_video
+ *
+ * \param options SDP Options
+ * \param tos_video
+ */
+void ast_sdp_options_set_tos_video(struct ast_sdp_options *options,
+ unsigned int tos_video);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options tos_video
+ *
+ * \param options SDP Options
+ *
+ * \returns tos_video
+ */
+unsigned int ast_sdp_options_get_tos_video(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options cos_video
+ *
+ * \param options SDP Options
+ * \param cos_video
+ */
+void ast_sdp_options_set_cos_video(struct ast_sdp_options *options,
+ unsigned int cos_video);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options cos_video
+ *
+ * \param options SDP Options
+ *
+ * \returns cos_video
+ */
+unsigned int ast_sdp_options_get_cos_video(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options ice
+ *
+ * \param options SDP Options
+ * \param ice
+ */
+void ast_sdp_options_set_ice(struct ast_sdp_options *options,
+ enum ast_sdp_options_ice ice);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options ice
+ *
+ * \param options SDP Options
+ *
+ * \returns ice
+ */
+enum ast_sdp_options_ice ast_sdp_options_get_ice(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options impl
+ *
+ * \param options SDP Options
+ * \param impl
+ */
+void ast_sdp_options_set_impl(struct ast_sdp_options *options,
+ enum ast_sdp_options_impl impl);
+
+/*!
+ * \since 15.0.0
+ * \brief Get SDP Options impl
+ *
+ * \param options SDP Options
+ *
+ * \returns impl
+ */
+enum ast_sdp_options_impl ast_sdp_options_get_impl(struct ast_sdp_options *options);
+
+/*!
+ * \since 15.0.0
+ * \brief Set SDP Options encryption
+ *
+ * \param options SDP Options
+ * \param encryption
+ */
+void ast_sdp_options_set_encryption(struct ast_sdp_options *options,
enum ast_sdp_options_encryption encryption);
/*!
* \since 15.0.0
- * \brief Get the SDP encryption
+ * \brief Get SDP Options encryption
+ *
+ * \param options SDP Options
+ *
+ * \returns encryption
*/
-enum ast_sdp_options_encryption ast_sdp_options_get_encryption(const struct ast_sdp_options *options);
+enum ast_sdp_options_encryption ast_sdp_options_get_encryption(struct ast_sdp_options *options);
#endif /* _ASTERISK_SDP_OPTIONS_H */
diff --git a/include/asterisk/sdp_priv.h b/include/asterisk/sdp_priv.h
deleted file mode 100644
index 000d11143..000000000
--- a/include/asterisk/sdp_priv.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2017, Digium, Inc.
- *
- * Mark Michelson <mmichelson@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
-
-/* NOTE: It is unlikely that you need to include this file. You probably will only need
- * this if you are an SDP translator, or if you are an inner part of the SDP API
- */
-
-#ifndef _SDP_PRIV_H
-#define _SDP_PRIV_H
-
-#include "asterisk/vector.h"
-
-/*!
- * \brief Structure representing an SDP attribute
- */
-struct ast_sdp_a_line {
- /*! Attribute name */
- char *name;
- /*! Attribute value. For attributes that have no value, this will be an empty string */
- char *value;
-};
-
-/*!
- * \brief Structure representing an SDP connection
- */
-struct ast_sdp_c_line {
- /* IP family string (e.g. IP4 or IP6) */
- char *family;
- /* Connection address. Can be an IP address or FQDN */
- char *addr;
-};
-
-/*!
- * \brief A collection of SDP attributes
- */
-AST_VECTOR(ast_sdp_a_line_vector, struct ast_sdp_a_line);
-
-/*!
- * \brief An SDP media stream
- *
- * This contains both the m line, as well as its
- * constituent a lines.
- */
-struct ast_sdp_m_line {
- /*! Media type (e.g. "audio" or "video") */
- char *type;
- /*! Port number in m line */
- uint16_t port;
- /*! Number of ports specified in m line */
- uint16_t port_count;
- /*! RTP profile string (e.g. "RTP/AVP") */
- char *profile;
- /*! RTP payloads */
- AST_VECTOR(, char *) payloads;
- /*! Connection information for this media stream */
- struct ast_sdp_c_line c_line;
- /*! The attributes for this media stream */
- struct ast_sdp_a_line_vector a_lines;
-};
-
-/*!
- * \brief SDP time information
- */
-struct ast_sdp_t_line {
- /*! Session start time */
- uint32_t start;
- /*! Session end time */
- uint32_t end;
-};
-
-/*!
- * \brief An SDP
- */
-struct ast_sdp {
- /*! SDP Origin line */
- struct {
- /*! Origin user name */
- char *user;
- /*! Origin id */
- uint32_t id;
- /*! Origin version */
- uint32_t version;
- /*! Origin IP address family (e.g. "IP4" or "IP6") */
- char *family;
- /*! Origin address. Can be an IP address or FQDN */
- char *addr;
- } o_line;
- /*! SDP Session name */
- char *s_line;
- /*! SDP top-level connection information */
- struct ast_sdp_c_line c_line;
- /*! SDP timing information */
- struct ast_sdp_t_line t_line;
- /*! SDP top-level attributes */
- struct ast_sdp_a_line_vector a_lines;
- /*! SDP media streams */
- AST_VECTOR(, struct ast_sdp_m_line) m_lines;
-};
-
-/*!
- * \brief Allocate a new SDP.
- *
- * \note This does not perform any initialization.
- *
- * \retval NULL FAIL
- * \retval non-NULL New SDP
- */
-struct ast_sdp *ast_sdp_alloc(void);
-
-/*!
- * \brief Free an SDP and all its constituent parts
- */
-void ast_sdp_free(struct ast_sdp *dead);
-
-#endif /* _SDP_PRIV_H */
diff --git a/include/asterisk/sdp_state.h b/include/asterisk/sdp_state.h
index 14d3e7c04..e2f13eb61 100644
--- a/include/asterisk/sdp_state.h
+++ b/include/asterisk/sdp_state.h
@@ -19,9 +19,10 @@
#ifndef _ASTERISK_SDP_STATE_H
#define _ASTERISK_SDP_STATE_H
+#include "asterisk/stream.h"
+#include "asterisk/sdp_options.h"
+
struct ast_sdp_state;
-struct ast_sdp_options;
-struct ast_stream_topology;
/*!
* \brief Allocate a new SDP state
@@ -31,7 +32,8 @@ struct ast_stream_topology;
* Ownership of the SDP options is taken on by the SDP state.
* A good strategy is to call this during session creation.
*/
-struct ast_sdp_state *ast_sdp_state_alloc(struct ast_stream_topology *streams, struct ast_sdp_options *options);
+struct ast_sdp_state *ast_sdp_state_alloc(struct ast_stream_topology *streams,
+ struct ast_sdp_options *options);
/*!
* \brief Free the SDP state.
@@ -45,7 +47,8 @@ void ast_sdp_state_free(struct ast_sdp_state *sdp_state);
*
* Stream numbers correspond to the streams in the topology of the associated channel
*/
-struct ast_rtp_instance *ast_sdp_state_get_rtp_instance(struct ast_sdp_state *sdp_state, int stream_index);
+struct ast_rtp_instance *ast_sdp_state_get_rtp_instance(const struct ast_sdp_state *sdp_state,
+ int stream_index);
/*!
* \brief Get the joint negotiated streams based on local and remote capabilities.
@@ -53,44 +56,96 @@ struct ast_rtp_instance *ast_sdp_state_get_rtp_instance(struct ast_sdp_state *sd
* If this is called prior to receiving a remote SDP, then this will just mirror
* the local configured endpoint capabilities.
*/
-struct ast_stream_topology *ast_sdp_state_get_joint_topology(struct ast_sdp_state *sdp_state);
+const struct ast_stream_topology *ast_sdp_state_get_joint_topology(
+ const struct ast_sdp_state *sdp_state);
+
+/*!
+ * \brief Get the local topology
+ *
+ */
+const struct ast_stream_topology *ast_sdp_state_get_local_topology(
+ const struct ast_sdp_state *sdp_state);
+
+/*!
+ * \brief Get the sdp_state options
+ *
+ */
+const struct ast_sdp_options *ast_sdp_state_get_options(
+ const struct ast_sdp_state *sdp_state);
+
/*!
* \brief Get the local SDP.
*
- * If we have not received a remote SDP yet, this will be an SDP offer based
- * on known streams and options If we have received a remote SDP, this will
- * be the negotiated SDP based on the joint capabilities. The return type is
- * a void pointer because the representation of the SDP is going to be determined based
- * on the SDP options when allocating the SDP state.
+ * \param sdp_state
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \note
+ * This function will allocate a new SDP with RTP instances if it has not already
+ * been allocated.
+ *
+ */
+const struct ast_sdp *ast_sdp_state_get_local_sdp(struct ast_sdp_state *sdp_state);
+
+/*!
+ * \brief Get the local SDP Implementation.
+ *
+ * \param sdp_state
+ *
+ * \retval non-NULL Success
+ * \retval NULL Failure
+ *
+ * \note
+ * This function calls ast_sdp_state_get_local_sdp then translates it into
+ * the defined implementation.
+ *
+ * The return here is const. The use case for this is so that a channel can add
+ * the SDP to an outgoing message. The API user should not attempt to modify the SDP.
+ * SDP modification should only be done through the API.
+ *
+ * \since 15
+ */
+const void *ast_sdp_state_get_local_sdp_impl(struct ast_sdp_state *sdp_state);
+
+/*!
+ * \brief Set the remote SDP
*
- * This function will allocate RTP instances if RTP instances have not already
- * been allocated for the streams.
+ * \param sdp_state
+ * \param sdp
*
- * The return here is const. The use case for this is so that a channel can add the SDP to an outgoing
- * message. The API user should not attempt to modify the SDP. SDP modification should only be done through
- * the API.
+ * \since 15
*/
-const void *ast_sdp_state_get_local(struct ast_sdp_state *sdp_state);
+void ast_sdp_state_set_remote_sdp(struct ast_sdp_state *sdp_state, struct ast_sdp *sdp);
/*!
- * \brief Set the remote SDP.
+ * \brief Set the remote SDP from an Implementation
+ *
+ * \param sdp_state
+ * \param remote The implementation's representation of an SDP.
*
- * This can be used for either a remote offer or answer.
- * This can also be used whenever an UPDATE, re-INVITE, etc. arrives.
- * The type of the "remote" parameter is dictated by whatever SDP representation
- * was set in the ast_sdp_options used during ast_sdp_state allocation
+ * \retval 0 Success
+ * \retval non-0 Failure
*
- * This function will NOT allocate RTP instances.
+ * \since 15
*/
-int ast_sdp_state_set_remote(struct ast_sdp_state *sdp_state, void *remote);
+int ast_sdp_state_set_remote_sdp_from_impl(struct ast_sdp_state *sdp_state, void *remote);
/*!
* \brief Reset the SDP state and stream capabilities as if the SDP state had just been allocated.
*
+ * \param sdp_state
+ * \param remote The implementation's representation of an SDP.
+ *
+ * \retval 0 Success
+ *
+ * \note
* This is most useful for when a channel driver is sending a session refresh message
* and needs to re-advertise its initial capabilities instead of the previously-negotiated
* joint capabilities.
+ *
+ * \since 15
*/
int ast_sdp_state_reset(struct ast_sdp_state *sdp_state);
diff --git a/include/asterisk/sdp_translator.h b/include/asterisk/sdp_translator.h
index 62a875e0a..09901af2e 100644
--- a/include/asterisk/sdp_translator.h
+++ b/include/asterisk/sdp_translator.h
@@ -28,7 +28,7 @@ struct sdp;
*/
struct ast_sdp_translator_ops {
/*! The SDP representation on which this translator operates */
- enum ast_sdp_options_repr repr;
+ enum ast_sdp_options_impl repr;
/*! Allocate new translator private data for a translator */
void *(*translator_new)(void);
/*! Free translator private data */
@@ -36,7 +36,7 @@ struct ast_sdp_translator_ops {
/*! Convert the channel-native SDP into an internal Asterisk SDP */
struct ast_sdp *(*to_sdp)(void *repr_sdp, void *translator_priv);
/*! Convert an internal Asterisk SDP into a channel-native SDP */
- void *(*from_sdp)(struct ast_sdp *sdp, void *translator_priv);
+ void *(*from_sdp)(const struct ast_sdp *sdp, void *translator_priv);
};
/*!
@@ -72,7 +72,7 @@ void ast_sdp_unregister_translator(struct ast_sdp_translator_ops *ops);
* \retval NULL FAIL
* \retval non-NULL New SDP translator
*/
-struct ast_sdp_translator *ast_sdp_translator_new(enum ast_sdp_options_repr repr);
+struct ast_sdp_translator *ast_sdp_translator_new(enum ast_sdp_options_impl repr);
/*!
* \brief Free an SDP translator
@@ -97,6 +97,7 @@ struct ast_sdp *ast_sdp_translator_to_sdp(struct ast_sdp_translator *translator,
* \retval NULL FAIL
* \retval non-NULL The translated SDP
*/
-void *ast_sdp_translator_from_sdp(struct ast_sdp_translator *translator, struct ast_sdp *ast_sdp);
+void *ast_sdp_translator_from_sdp(struct ast_sdp_translator *translator,
+ const struct ast_sdp *ast_sdp);
#endif /* _ASTERISK_SDP_TRANSLATOR_H */
diff --git a/include/asterisk/stream.h b/include/asterisk/stream.h
index 48ee88322..1becae25a 100644
--- a/include/asterisk/stream.h
+++ b/include/asterisk/stream.h
@@ -43,6 +43,8 @@ struct ast_format_cap;
*/
struct ast_stream_topology;
+typedef void (*ast_stream_data_free_fn)(void *);
+
/*!
* \brief States that a stream may be in
*/
@@ -70,6 +72,20 @@ enum ast_stream_state {
};
/*!
+ * \brief Stream data slots
+ */
+enum ast_stream_data_slot {
+ /*!
+ * \brief Data slot for RTP instance
+ */
+ AST_STREAM_DATA_RTP_INSTANCE = 0,
+ /*!
+ * \brief Controls the size of the data pointer array
+ */
+ AST_STREAM_DATA_SLOT_MAX
+};
+
+/*!
* \brief Create a new media stream representation
*
* \param name A name for the stream
@@ -103,6 +119,9 @@ void ast_stream_free(struct ast_stream *stream);
* \retval non-NULL success
* \retval NULL failure
*
+ * \note Opaque data pointers set with ast_stream_set_data() are not part
+ * of the deep clone. The pointers are simply copied.
+ *
* \since 15
*/
struct ast_stream *ast_stream_clone(const struct ast_stream *stream);
@@ -202,6 +221,34 @@ void ast_stream_set_state(struct ast_stream *stream, enum ast_stream_state state
const char *ast_stream_state2str(enum ast_stream_state state);
/*!
+ * \brief Get the opaque stream data
+ *
+ * \param stream The media stream
+ * \param slot The data slot to retrieve
+ *
+ * \retval non-NULL success
+ * \retval NULL failure
+ *
+ * \since 15
+ */
+void *ast_stream_get_data(struct ast_stream *stream, enum ast_stream_data_slot slot);
+
+/*!
+ * \brief Set the opaque stream data
+ *
+ * \param stream The media stream
+ * \param slot The data slot to set
+ * \param data Opaque data
+ * \param data_free_fn Callback to free data when stream is freed. May be NULL for no action.
+ *
+ * \return data
+ *
+ * \since 15
+ */
+void *ast_stream_set_data(struct ast_stream *stream, enum ast_stream_data_slot slot,
+ void *data, ast_stream_data_free_fn data_free_fn);
+
+/*!
* \brief Get the position of the stream in the topology
*
* \param stream The media stream