Asterisk - The Open Source Telephony Project  18.5.0
channels/iax2/format_compatibility.c
Go to the documentation of this file.
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2014, Digium, Inc.
5  *
6  * Joshua Colp <[email protected]>
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  *
21  * \brief Media Format Bitfield Compatibility API
22  *
23  * \author Joshua Colp <[email protected]>
24  */
25 
26 /*** MODULEINFO
27  <support_level>core</support_level>
28  ***/
29 
30 #include "asterisk.h"
31 
32 #include "asterisk/logger.h"
33 #include "asterisk/astobj2.h"
34 #include "asterisk/codec.h"
35 #include "asterisk/format.h"
37 #include "asterisk/format_cache.h"
38 #include "asterisk/format_cap.h"
39 #include "asterisk/utils.h"
40 
42 
44 {
45  uint64_t bitfield = 0;
46  int x;
47 
48  for (x = 0; x < ast_format_cap_count(cap); x++) {
50 
51  bitfield |= ast_format_compatibility_format2bitfield(format);
52 
53  ao2_ref(format, -1);
54  }
55 
56  return bitfield;
57 }
58 
59 int iax2_format_compatibility_bitfield2cap(uint64_t bitfield, struct ast_format_cap *cap)
60 {
61  int bit;
62 
63  for (bit = 0; bit < 64; ++bit) {
64  uint64_t mask = (1ULL << bit);
65 
66  if (mask & bitfield) {
67  struct ast_format *format;
68 
70  if (format && ast_format_cap_append(cap, format, 0)) {
71  return -1;
72  }
73  }
74  }
75 
76  return 0;
77 }
78 
80 {
81  /*
82  * This just our opinion, expressed in code. We are
83  * asked to choose the best codec to use, given no
84  * information.
85  */
86  static const uint64_t best[] = {
87  /*! Okay, ulaw is used by all telephony equipment, so start with it */
89  /*! Unless of course, you're a silly European, so then prefer ALAW */
95  /*! G.722 is better then all below, but not as common as the above... so give ulaw and alaw priority */
97  /*! Okay, well, signed linear is easy to translate into other stuff */
100  /*! G.726 is standard ADPCM, in RFC3551 packing order */
102  /*! G.726 is standard ADPCM, in AAL2 packing order */
104  /*! ADPCM has great sound quality and is still pretty easy to translate */
106  /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
107  translate and sounds pretty good */
109  /*! iLBC is not too bad */
111  /*! Speex is free, but computationally more expensive than GSM */
114  /*! Opus */
116  /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
117  to use it */
119  /*! G.729a is faster than 723 and slightly less expensive */
121  /*! Down to G.723.1 which is proprietary but at least designed for voice */
123  };
124  int idx;
125 
126  /* Find the first preferred codec in the format given */
127  for (idx = 0; idx < ARRAY_LEN(best); ++idx) {
128  if (formats & best[idx]) {
129  return best[idx];
130  }
131  }
132 
133  return 0;
134 }
uint64_t iax2_format_compatibility_cap2bitfield(const struct ast_format_cap *cap)
Convert a format capabilities structure to a bitfield.
Asterisk main include file. File version handling, generic pbx functions.
struct ast_format * ast_format_compatibility_bitfield2format(uint64_t bitfield)
Convert a bitfield to its respective format structure.
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
uint64_t ast_format_compatibility_format2bitfield(const struct ast_format *format)
Convert a format structure to its respective bitfield.
Media Format Bitfield Compatibility API.
Codec API.
Definition of a media format.
Definition: format.c:43
size_t ast_format_cap_count(const struct ast_format_cap *cap)
Get the number of formats present within the capabilities structure.
Definition: format_cap.c:395
int iax2_format_compatibility_bitfield2cap(uint64_t bitfield, struct ast_format_cap *cap)
Convert a bitfield to a format capabilities structure.
Utility functions.
Media Format API.
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
Format Capabilities API.
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Media Format Bitfield Compatibility API.
Definition: file.c:69
Support for logging to various files, console and syslog Configuration in file logger.conf.
uint64_t iax2_format_compatibility_best(uint64_t formats)
Pick the best format from the given bitfield formats.
struct ast_format * ast_format_cap_get_format(const struct ast_format_cap *cap, int position)
Get the format at a specific index.
Definition: format_cap.c:400
static snd_pcm_format_t format
Definition: chan_alsa.c:102
Media Format Cache API.