codec_pref.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Asterisk -- An open source telephony toolkit.
  3. *
  4. * Copyright (C) 2014, Digium, Inc.
  5. *
  6. * Joshua Colp <jcolp@digium.com>
  7. *
  8. * See http://www.asterisk.org for more information about
  9. * the Asterisk project. Please do not directly contact
  10. * any of the maintainers of this project for assistance;
  11. * the project provides a web site, mailing lists and IRC
  12. * channels for your use.
  13. *
  14. * This program is free software, distributed under the terms of
  15. * the GNU General Public License Version 2. See the LICENSE file
  16. * at the top of the source tree.
  17. */
  18. /*!
  19. * \file
  20. * \brief Media Format Bitfield Compatibility API
  21. *
  22. * \author Joshua Colp <jcolp@digium.com>
  23. */
  24. #ifndef _IAX2_CODEC_PREF_H_
  25. #define _IAX2_CODEC_PREF_H_
  26. struct ast_format;
  27. struct ast_codec;
  28. struct ast_format_cap;
  29. #define IAX2_CODEC_PREF_SIZE 64
  30. struct iax2_codec_pref {
  31. /*! Array is ordered by preference. Contains the iax2_supported_formats[] index + 1. */
  32. char order[IAX2_CODEC_PREF_SIZE];
  33. /*! Framing size of the codec */
  34. unsigned int framing[IAX2_CODEC_PREF_SIZE];
  35. };
  36. /*!
  37. * \brief Convert an iax2_codec_pref order value into a format bitfield
  38. *
  39. * \param order_value value being converted
  40. *
  41. * \return the bitfield value of the order_value format
  42. */
  43. uint64_t iax2_codec_pref_order_value_to_format_bitfield(int order_value);
  44. /*!
  45. * \brief Convert a format bitfield into an iax2_codec_pref order value
  46. *
  47. * \param bitfield value being converted
  48. *
  49. * \return the iax2_codec_pref order value of the most significant format
  50. * in the bitfield.
  51. *
  52. * \note This is really meant to be used on single format bitfields.
  53. * It will work with multiformat bitfields, but it can only return the
  54. * index of the most significant one if that is the case.
  55. */
  56. int iax2_codec_pref_format_bitfield_to_order_value(uint64_t bitfield);
  57. /*!
  58. * \brief Codec located at a particular place in the preference index.
  59. * \param pref preference structure to get the codec out of
  60. * \param index to retrieve from
  61. * \param result ast_format structure to store the index value in
  62. * \return pointer to input ast_format on success, NULL on failure
  63. */
  64. struct ast_format *iax2_codec_pref_index(struct iax2_codec_pref *pref, int index, struct ast_format **result);
  65. /*!
  66. * \brief Convert a preference structure to a capabilities structure.
  67. *
  68. * \param pref Formats in preference order to build the capabilities.
  69. * \param cap Capabilities structure to place formats into
  70. *
  71. * \retval 0 on success.
  72. * \retval -1 on error.
  73. *
  74. * \note If failure occurs the capabilities structure may contain a partial set of formats
  75. */
  76. int iax2_codec_pref_to_cap(struct iax2_codec_pref *pref, struct ast_format_cap *cap);
  77. /*!
  78. * \brief Convert a bitfield to a format capabilities structure in the "best" order.
  79. *
  80. * \param bitfield The bitfield for the media formats
  81. * \param prefs Format preference order to use as a guide. (May be NULL)
  82. * \param cap Capabilities structure to place formats into
  83. *
  84. * \retval 0 on success.
  85. * \retval -1 on error.
  86. *
  87. * \note If failure occurs the capabilities structure may contain a partial set of formats
  88. */
  89. int iax2_codec_pref_best_bitfield2cap(uint64_t bitfield, struct iax2_codec_pref *prefs, struct ast_format_cap *cap);
  90. /*! \brief Removes format from the pref list that aren't in the bitfield */
  91. void iax2_codec_pref_remove_missing(struct iax2_codec_pref *pref, uint64_t bitfield);
  92. /*!
  93. * \brief Dump audio codec preference list into a string
  94. *
  95. * \param pref preference structure to dump string representation of order for
  96. * \param buf character buffer to put string into
  97. * \param size size of the character buffer
  98. *
  99. * \return -1 on error. Otherwise returns the remaining spaaaaaace in the buffer.
  100. *
  101. * \note Format is (codec1|codec2|codec3|...) -- if the list is too long for the
  102. * size of the buffer, codecs will be written until they exceed the length
  103. * remaining in which case the list will be closed with '...)' after the last
  104. * writable codec.
  105. */
  106. int iax2_codec_pref_string(struct iax2_codec_pref *pref, char *buf, size_t size);
  107. /*! \brief Append a audio codec to a preference list, removing it first if it was already there
  108. */
  109. void iax2_codec_pref_append(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing);
  110. /*! \brief Prepend an audio codec to a preference list, removing it first if it was already there
  111. */
  112. void iax2_codec_pref_prepend(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing,
  113. int only_if_existing);
  114. /*! \brief Shift an audio codec preference list up or down 65 bytes so that it becomes an ASCII string
  115. * \note Due to a misunderstanding in how codec preferences are stored, this
  116. * list starts at 'B', not 'A'. For backwards compatibility reasons, this
  117. * cannot change.
  118. * \param pref A codec preference list structure
  119. * \param buf A string denoting codec preference, appropriate for use in line transmission
  120. * \param size Size of \a buf
  121. * \param right Boolean: if 0, convert from \a buf to \a pref; if 1, convert from \a pref to \a buf.
  122. */
  123. void iax2_codec_pref_convert(struct iax2_codec_pref *pref, char *buf, size_t size, int right);
  124. /*!
  125. * \brief Create codec preference list from the given bitfield formats.
  126. * \since 13.0.0
  127. *
  128. * \param pref Codec preference list to setup from the given bitfield.
  129. * \param bitfield Format bitfield to guide preference list creation.
  130. *
  131. * \return Updated bitfield with any bits not mapped to a format cleared.
  132. */
  133. uint64_t iax2_codec_pref_from_bitfield(struct iax2_codec_pref *pref, uint64_t bitfield);
  134. #endif /* _IAX2_CODEC_PREF_H_ */