diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/data_buffer.h | 144 | ||||
-rw-r--r-- | include/asterisk/frame.h | 2 | ||||
-rw-r--r-- | include/asterisk/module.h | 11 | ||||
-rw-r--r-- | include/asterisk/rtp_engine.h | 26 |
4 files changed, 182 insertions, 1 deletions
diff --git a/include/asterisk/data_buffer.h b/include/asterisk/data_buffer.h new file mode 100644 index 000000000..dacbaa5e4 --- /dev/null +++ b/include/asterisk/data_buffer.h @@ -0,0 +1,144 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2018, Digium, Inc. + * + * Joshua Colp <jcolp@digium.com> + * Ben Ford <bford@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. + */ + +/*! + * \file + * \brief Data Buffer API + * + * A data buffer acts as a ring buffer of data. It is given a fixed + * number of data packets to store (which may be dynamically changed). + * Given a number it will store a data packet at that position relative + * to the others. Given a number it will retrieve the given data packet + * if it is present. This is purposely a storage of arbitrary things so + * that it can be used for multiple things. + * + * \author Joshua Colp <jcolp@digium.com> + * \author Ben Ford <bford@digium.com> + */ + +#ifndef _AST_DATA_BUFFER_H_ +#define _AST_DATA_BUFFER_H_ + +/*! + * \brief A buffer of data payloads. + */ +struct ast_data_buffer; + +/*! + * \brief A callback function to free a data payload in a data buffer + * + * \param The data payload + */ +typedef void (*ast_data_buffer_free_callback)(void *data); + +/*! + * \brief Allocate a data buffer + * + * \param free_fn Callback function to free a data payload + * \param size The maximum number of data payloads to contain in the data buffer + * + * \retval non-NULL success + * \retval NULL failure + * + * \note free_fn can be NULL. It is up to the consumer of this API to ensure that memory is + * managed appropriately. + * + * \since 15.4.0 + */ +struct ast_data_buffer *ast_data_buffer_alloc(ast_data_buffer_free_callback free_fn, size_t size); + +/*! + * \brief Resize a data buffer + * + * \param buffer The data buffer + * \param size The new maximum size of the data buffer + * + * \note If the data buffer is shrunk any old data payloads will be freed using the configured callback. + * The data buffer is flexible and can be used for multiple purposes. Therefore it is up to the + * caller of the function to know whether or not a buffer should have its size changed. Increasing + * the size of the buffer may make sense in some scenarios, but shrinking should always be handled + * with caution since data can be lost. + * + * \since 15.4.0 + */ +void ast_data_buffer_resize(struct ast_data_buffer *buffer, size_t size); + +/*! + * \brief Place a data payload at a position in the data buffer + * + * \param buffer The data buffer + * \param pos The position of the data payload + * \param payload The data payload + * + * \retval 0 success + * \retval -1 failure + * + * \note It is up to the consumer of this API to ensure proper memory management of data payloads + * + * \since 15.4.0 + */ +int ast_data_buffer_put(struct ast_data_buffer *buffer, size_t pos, void *payload); + +/*! + * \brief Retrieve a data payload from the data buffer + * + * \param buffer The data buffer + * \param pos The position of the data payload + * + * \retval non-NULL success + * \retval NULL failure + * + * \note This does not remove the data payload from the data buffer. It will be removed when it is displaced. + * + * \since 15.4.0 + */ +void *ast_data_buffer_get(const struct ast_data_buffer *buffer, size_t pos); + +/*! + * \brief Free a data buffer (and all held data payloads) + * + * \param buffer The data buffer + * + * \since 15.4.0 + */ +void ast_data_buffer_free(struct ast_data_buffer *buffer); + +/*! + * \brief Return the number of payloads in a data buffer + * + * \param buffer The data buffer + * + * \retval the number of data payloads + * + * \since 15.4.0 + */ +size_t ast_data_buffer_count(const struct ast_data_buffer *buffer); + +/*! + * \brief Return the maximum number of payloads a data buffer can hold + * + * \param buffer The data buffer + * + * \retval the maximum number of data payloads + * + * \since 15.4.0 + */ +size_t ast_data_buffer_max(const struct ast_data_buffer *buffer); + +#endif /* _AST_DATA_BUFFER_H */ diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h index eb6a6479a..c3c0f8817 100644 --- a/include/asterisk/frame.h +++ b/include/asterisk/frame.h @@ -127,7 +127,7 @@ enum ast_frame_type { * directly into bridges. */ AST_FRAME_BRIDGE_ACTION_SYNC, - /*! RTCP feedback */ + /*! RTCP feedback (the subclass will contain the payload type) */ AST_FRAME_RTCP, }; #define AST_FRAME_DTMF AST_FRAME_DTMF_END diff --git a/include/asterisk/module.h b/include/asterisk/module.h index faa4f7f67..08b4c4317 100644 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -376,6 +376,13 @@ struct ast_module_info { */ const char *enhances; + /*! These reserved fields should be NULL, they exist to allow addition to this + * structure in a non-breaking way. */ + void *reserved1; + void *reserved2; + void *reserved3; + void *reserved4; + /*! The support level for the given module */ enum ast_module_support_level support_level; }; @@ -448,6 +455,10 @@ void __ast_module_unref(struct ast_module *mod, const char *file, int line, cons NULL, \ NULL, \ NULL, \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ support_level, \ }; \ static void __attribute__((constructor)) __reg_module(void) \ diff --git a/include/asterisk/rtp_engine.h b/include/asterisk/rtp_engine.h index 4e32d6b32..b552948d2 100644 --- a/include/asterisk/rtp_engine.h +++ b/include/asterisk/rtp_engine.h @@ -292,6 +292,14 @@ struct ast_rtp_payload_type { #define AST_RTP_RTCP_SR 200 /*! Receiver Report */ #define AST_RTP_RTCP_RR 201 +/*! Payload Specific Feed Back (From RFC4585 also RFC5104) */ +#define AST_RTP_RTCP_PSFB 206 + +/* Common RTCP feedback message types */ +/*! Full INTRA-frame Request (From RFC5104) */ +#define AST_RTP_RTCP_FMT_FIR 4 +/*! REMB Information (From draft-alvestrand-rmcat-remb-03) */ +#define AST_RTP_RTCP_FMT_REMB 15 /*! * \since 12 @@ -327,6 +335,24 @@ struct ast_rtp_rtcp_report { struct ast_rtp_rtcp_report_block *report_block[0]; }; +/*! + * \since 15.4.0 + * \brief A REMB feedback message (see draft-alvestrand-rmcat-remb-03 for details) */ +struct ast_rtp_rtcp_feedback_remb { + unsigned int br_exp; /*!< Exponential scaling of the mantissa for the maximum total media bit rate value */ + unsigned int br_mantissa; /*!< The mantissa of the maximum total media bit rate */ +}; + +/*! + * \since 15.4.0 + * \brief An object that represents data received in a feedback report */ +struct ast_rtp_rtcp_feedback { + unsigned int fmt; /*!< The feedback message type */ + union { + struct ast_rtp_rtcp_feedback_remb remb; /*!< REMB feedback information */ + }; +}; + /*! Structure that represents statistics from an RTP instance */ struct ast_rtp_instance_stats { /*! Number of packets transmitted */ |