/* * Asterisk -- An open source telephony toolkit. * * Copyright (C) 2017, Digium, Inc. * * Mark Michelson * * 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 */