diff options
Diffstat (limited to 'channels/iax2/include')
-rw-r--r-- | channels/iax2/include/codec_pref.h | 123 | ||||
-rw-r--r-- | channels/iax2/include/format_compatibility.h | 55 |
2 files changed, 178 insertions, 0 deletions
diff --git a/channels/iax2/include/codec_pref.h b/channels/iax2/include/codec_pref.h new file mode 100644 index 000000000..bfb889164 --- /dev/null +++ b/channels/iax2/include/codec_pref.h @@ -0,0 +1,123 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2014, Digium, Inc. + * + * Joshua Colp <jcolp@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 Media Format Bitfield Compatibility API + * + * \author Joshua Colp <jcolp@digium.com> + */ + +#ifndef _IAX2_CODEC_PREF_H_ +#define _IAX2_CODEC_PREF_H_ + +struct ast_format; +struct ast_codec; +struct ast_format_cap; + +#define IAX2_CODEC_PREF_SIZE 64 +struct iax2_codec_pref { + /*! This array is ordered by preference and contains the codec bitfield. */ + uint64_t order[IAX2_CODEC_PREF_SIZE]; + /*! Framing size of the codec */ + unsigned int framing[IAX2_CODEC_PREF_SIZE]; +}; + +/*! + * \brief Convert an iax2_codec_pref order value into a format bitfield + * + * \param order_value value being converted + * + * \return the bitfield value of the order_value format + */ +uint64_t iax2_codec_pref_order_value_to_format_bitfield(uint64_t order_value); + +/*! + * \brief Convert a format bitfield into an iax2_codec_pref order value + * + * \param bitfield value being converted + * + * \return the iax2_codec_pref order value of the most significant format + * in the bitfield. + * + * \note This is really meant to be used on single format bitfields. + * It will work with multiformat bitfields, but it can only return the + * index of the most significant one if that is the case. + */ +uint64_t iax2_codec_pref_format_bitfield_to_order_value(uint64_t bitfield); + +/*! + * \brief Codec located at a particular place in the preference index. + * \param pref preference structure to get the codec out of + * \param index to retrieve from + * \param result ast_format structure to store the index value in + * \return pointer to input ast_format on success, NULL on failure +*/ +struct ast_format *iax2_codec_pref_index(struct iax2_codec_pref *pref, int index, struct ast_format **result); + +/*! \brief Convert a preference structure to a capabilities structure */ +void iax2_codec_pref_to_cap(struct iax2_codec_pref *pref, struct ast_format_cap *cap); + +/*! \brief Removes format from the pref list that aren't in the bitfield */ +void iax2_codec_pref_remove_missing(struct iax2_codec_pref *pref, uint64_t bitfield); + +/*! + * \brief Dump audio codec preference list into a string + * + * \param pref preference structure to dump string representation of order for + * \param buf character buffer to put string into + * \param size size of the character buffer + * + * \return -1 on error. Otherwise returns the remaining spaaaaaace in the buffer. + * + * \note Format is (codec1|codec2|codec3|...) -- if the list is too long for the + * size of the buffer, codecs will be written until they exceed the length + * remaining in which case the list will be closed with '...)' after the last + * writable codec. + */ +int iax2_codec_pref_string(struct iax2_codec_pref *pref, char *buf, size_t size); + +/*! \brief Append a audio codec to a preference list, removing it first if it was already there +*/ +int iax2_codec_pref_append(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing); + +/*! \brief Prepend an audio codec to a preference list, removing it first if it was already there +*/ +void iax2_codec_pref_prepend(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing, + int only_if_existing); + +/*! \brief Get packet size for codec +*/ +unsigned int iax2_codec_pref_getsize(struct iax2_codec_pref *pref, int index); + +/*! \brief Set packet size for codec +*/ +int iax2_codec_pref_setsize(struct iax2_codec_pref *pref, struct ast_format *format, int framems); + +/*! \brief Shift an audio codec preference list up or down 65 bytes so that it becomes an ASCII string + * \note Due to a misunderstanding in how codec preferences are stored, this + * list starts at 'B', not 'A'. For backwards compatibility reasons, this + * cannot change. + * \param pref A codec preference list structure + * \param buf A string denoting codec preference, appropriate for use in line transmission + * \param size Size of \a buf + * \param right Boolean: if 0, convert from \a buf to \a pref; if 1, convert from \a pref to \a buf. + */ +void iax2_codec_pref_convert(struct iax2_codec_pref *pref, char *buf, size_t size, int right); + +#endif /* _IAX2_CODEC_PREF_H_ */ diff --git a/channels/iax2/include/format_compatibility.h b/channels/iax2/include/format_compatibility.h new file mode 100644 index 000000000..aa29cfa2c --- /dev/null +++ b/channels/iax2/include/format_compatibility.h @@ -0,0 +1,55 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2014, Digium, Inc. + * + * Joshua Colp <jcolp@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 Media Format Bitfield Compatibility API + * + * \author Joshua Colp <jcolp@digium.com> + */ + +#ifndef _IAX2_FORMAT_COMPATIBILITY_H_ +#define _IAX2_FORMAT_COMPATIBILITY_H_ + +struct ast_format; +struct ast_format_cap; + +/*! + * \brief Convert a format capabilities structure to a bitfield + * + * \param cap Capabilities structure containing formats + * + * \retval non-zero success + * \retval zero no formats present or no formats supported + */ +uint64_t iax2_format_compatibility_cap2bitfield(const struct ast_format_cap *cap); + +/*! + * \brief Convert a bitfield to a format capabilities structure + * + * \param bitfield The bitfield for the media formats + * \param cap Capabilities structure to place formats into + * + * \retval non-NULL success + * \retval NULL failure + * + * \note If failure occurs the capabilities structure may contain a partial set of formats + */ +int iax2_format_compatibility_bitfield2cap(uint64_t bitfield, struct ast_format_cap *cap); + +#endif /* _IAX2_FORMAT_COMPATIBILITY_H */ |