diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/rtp_engine.h | 6 | ||||
-rw-r--r-- | include/asterisk/sdp.h | 559 | ||||
-rw-r--r-- | include/asterisk/sdp_options.h | 390 | ||||
-rw-r--r-- | include/asterisk/sdp_priv.h | 130 | ||||
-rw-r--r-- | include/asterisk/sdp_state.h | 101 | ||||
-rw-r--r-- | include/asterisk/sdp_translator.h | 9 | ||||
-rw-r--r-- | include/asterisk/stream.h | 47 |
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 |