summaryrefslogtreecommitdiff
path: root/channels/iax2/include/codec_pref.h
blob: bfb8891645e76f9c9f8d45a78a1472b51c853fee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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_ */