Merge "CLI: Remove special handling of 'core set verbose' from rasterisk."
[asterisk/asterisk.git] / main / format_compatibility.c
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  *
21  * \brief Media Format Bitfield Compatibility API
22  *
23  * \author Joshua Colp <jcolp@digium.com>
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"
36 #include "asterisk/format_compatibility.h"
37 #include "asterisk/format_cache.h"
38
39 uint64_t ast_format_compatibility_format2bitfield(const struct ast_format *format)
40 {
41         if (ast_format_cmp(format, ast_format_g723) == AST_FORMAT_CMP_EQUAL) {
42                 return AST_FORMAT_G723;
43         } else if (ast_format_cmp(format, ast_format_gsm) == AST_FORMAT_CMP_EQUAL) {
44                 return AST_FORMAT_GSM;
45         } else if (ast_format_cmp(format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
46                 return AST_FORMAT_ULAW;
47         } else if (ast_format_cmp(format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
48                 return AST_FORMAT_ALAW;
49         } else if (ast_format_cmp(format, ast_format_g726_aal2) == AST_FORMAT_CMP_EQUAL) {
50                 return AST_FORMAT_G726_AAL2;
51         } else if (ast_format_cmp(format, ast_format_adpcm) == AST_FORMAT_CMP_EQUAL) {
52                 return AST_FORMAT_ADPCM;
53         } else if (ast_format_cmp(format, ast_format_slin) == AST_FORMAT_CMP_EQUAL) {
54                 return AST_FORMAT_SLIN;
55         } else if (ast_format_cmp(format, ast_format_lpc10) == AST_FORMAT_CMP_EQUAL) {
56                 return AST_FORMAT_LPC10;
57         } else if (ast_format_cmp(format, ast_format_g729) == AST_FORMAT_CMP_EQUAL) {
58                 return AST_FORMAT_G729;
59         } else if (ast_format_cmp(format, ast_format_speex) == AST_FORMAT_CMP_EQUAL) {
60                 return AST_FORMAT_SPEEX;
61         } else if (ast_format_cmp(format, ast_format_ilbc) == AST_FORMAT_CMP_EQUAL) {
62                 return AST_FORMAT_ILBC;
63         } else if (ast_format_cmp(format, ast_format_g726) == AST_FORMAT_CMP_EQUAL) {
64                 return AST_FORMAT_G726;
65         } else if (ast_format_cmp(format, ast_format_g722) == AST_FORMAT_CMP_EQUAL) {
66                 return AST_FORMAT_G722;
67         } else if (ast_format_cmp(format, ast_format_siren7) == AST_FORMAT_CMP_EQUAL) {
68                 return AST_FORMAT_SIREN7;
69         } else if (ast_format_cmp(format, ast_format_siren14) == AST_FORMAT_CMP_EQUAL) {
70                 return AST_FORMAT_SIREN14;
71         } else if (ast_format_cmp(format, ast_format_slin16) == AST_FORMAT_CMP_EQUAL) {
72                 return AST_FORMAT_SLIN16;
73         } else if (ast_format_cmp(format, ast_format_g719) == AST_FORMAT_CMP_EQUAL) {
74                 return AST_FORMAT_G719;
75         } else if (ast_format_cmp(format, ast_format_speex16) == AST_FORMAT_CMP_EQUAL) {
76                 return AST_FORMAT_SPEEX16;
77         } else if (ast_format_cmp(format, ast_format_opus) == AST_FORMAT_CMP_EQUAL) {
78                 return AST_FORMAT_OPUS;
79         } else if (ast_format_cmp(format, ast_format_testlaw) == AST_FORMAT_CMP_EQUAL) {
80                 return AST_FORMAT_TESTLAW;
81         } else if (ast_format_cmp(format, ast_format_h261) == AST_FORMAT_CMP_EQUAL) {
82                 return AST_FORMAT_H261;
83         } else if (ast_format_cmp(format, ast_format_h263) == AST_FORMAT_CMP_EQUAL) {
84                 return AST_FORMAT_H263;
85         } else if (ast_format_cmp(format, ast_format_h263p) == AST_FORMAT_CMP_EQUAL) {
86                 return AST_FORMAT_H263P;
87         } else if (ast_format_cmp(format, ast_format_h264) == AST_FORMAT_CMP_EQUAL) {
88                 return AST_FORMAT_H264;
89         } else if (ast_format_cmp(format, ast_format_mp4) == AST_FORMAT_CMP_EQUAL) {
90                 return AST_FORMAT_MP4;
91         } else if (ast_format_cmp(format, ast_format_vp8) == AST_FORMAT_CMP_EQUAL) {
92                 return AST_FORMAT_VP8;
93         } else if (ast_format_cmp(format, ast_format_jpeg) == AST_FORMAT_CMP_EQUAL) {
94                 return AST_FORMAT_JPEG;
95         } else if (ast_format_cmp(format, ast_format_png) == AST_FORMAT_CMP_EQUAL) {
96                 return AST_FORMAT_PNG;
97         } else if (ast_format_cmp(format, ast_format_t140_red) == AST_FORMAT_CMP_EQUAL) {
98                 return AST_FORMAT_T140_RED;
99         } else if (ast_format_cmp(format, ast_format_t140) == AST_FORMAT_CMP_EQUAL) {
100                 return AST_FORMAT_T140;
101         }
102
103         return 0;
104 }
105
106 uint64_t ast_format_compatibility_codec2bitfield(const struct ast_codec *codec)
107 {
108         if (codec->id == ast_format_get_codec_id(ast_format_g723)) {
109                 return AST_FORMAT_G723;
110         } else if (codec->id == ast_format_get_codec_id(ast_format_gsm)) {
111                 return AST_FORMAT_GSM;
112         } else if (codec->id == ast_format_get_codec_id(ast_format_ulaw)) {
113                 return AST_FORMAT_ULAW;
114         } else if (codec->id == ast_format_get_codec_id(ast_format_alaw)) {
115                 return AST_FORMAT_ALAW;
116         } else if (codec->id == ast_format_get_codec_id(ast_format_g726_aal2)) {
117                 return AST_FORMAT_G726_AAL2;
118         } else if (codec->id == ast_format_get_codec_id(ast_format_adpcm)) {
119                 return AST_FORMAT_ADPCM;
120         } else if (codec->id == ast_format_get_codec_id(ast_format_slin)) {
121                 return AST_FORMAT_SLIN;
122         } else if (codec->id == ast_format_get_codec_id(ast_format_lpc10)) {
123                 return AST_FORMAT_LPC10;
124         } else if (codec->id == ast_format_get_codec_id(ast_format_g729)) {
125                 return AST_FORMAT_G729;
126         } else if (codec->id == ast_format_get_codec_id(ast_format_speex)) {
127                 return AST_FORMAT_SPEEX;
128         } else if (codec->id == ast_format_get_codec_id(ast_format_ilbc)) {
129                 return AST_FORMAT_ILBC;
130         } else if (codec->id == ast_format_get_codec_id(ast_format_g726)) {
131                 return AST_FORMAT_G726;
132         } else if (codec->id == ast_format_get_codec_id(ast_format_g722)) {
133                 return AST_FORMAT_G722;
134         } else if (codec->id == ast_format_get_codec_id(ast_format_siren7)) {
135                 return AST_FORMAT_SIREN7;
136         } else if (codec->id == ast_format_get_codec_id(ast_format_siren14)) {
137                 return AST_FORMAT_SIREN14;
138         } else if (codec->id == ast_format_get_codec_id(ast_format_slin16)) {
139                 return AST_FORMAT_SLIN16;
140         } else if (codec->id == ast_format_get_codec_id(ast_format_g719)) {
141                 return AST_FORMAT_G719;
142         } else if (codec->id == ast_format_get_codec_id(ast_format_speex16)) {
143                 return AST_FORMAT_SPEEX16;
144         } else if (codec->id == ast_format_get_codec_id(ast_format_opus)) {
145                 return AST_FORMAT_OPUS;
146         } else if (codec->id == ast_format_get_codec_id(ast_format_testlaw)) {
147                 return AST_FORMAT_TESTLAW;
148         } else if (codec->id == ast_format_get_codec_id(ast_format_h261)) {
149                 return AST_FORMAT_H261;
150         } else if (codec->id == ast_format_get_codec_id(ast_format_h263)) {
151                 return AST_FORMAT_H263;
152         } else if (codec->id == ast_format_get_codec_id(ast_format_h263p)) {
153                 return AST_FORMAT_H263P;
154         } else if (codec->id == ast_format_get_codec_id(ast_format_h264)) {
155                 return AST_FORMAT_H264;
156         } else if (codec->id == ast_format_get_codec_id(ast_format_mp4)) {
157                 return AST_FORMAT_MP4;
158         } else if (codec->id == ast_format_get_codec_id(ast_format_vp8)) {
159                 return AST_FORMAT_VP8;
160         } else if (codec->id == ast_format_get_codec_id(ast_format_jpeg)) {
161                 return AST_FORMAT_JPEG;
162         } else if (codec->id == ast_format_get_codec_id(ast_format_png)) {
163                 return AST_FORMAT_PNG;
164         } else if (codec->id == ast_format_get_codec_id(ast_format_t140_red)) {
165                 return AST_FORMAT_T140_RED;
166         } else if (codec->id == ast_format_get_codec_id(ast_format_t140)) {
167                 return AST_FORMAT_T140;
168         }
169
170         return 0;
171 }
172
173 struct ast_format *ast_format_compatibility_bitfield2format(uint64_t bitfield)
174 {
175         switch (bitfield) {
176         /*! G.723.1 compression */
177         case AST_FORMAT_G723:
178                 return ast_format_g723;
179         /*! GSM compression */
180         case AST_FORMAT_GSM:
181                 return ast_format_gsm;
182         /*! Raw mu-law data (G.711) */
183         case AST_FORMAT_ULAW:
184                 return ast_format_ulaw;
185         /*! Raw A-law data (G.711) */
186         case AST_FORMAT_ALAW:
187                 return ast_format_alaw;
188         /*! ADPCM (G.726, 32kbps, AAL2 codeword packing) */
189         case AST_FORMAT_G726_AAL2:
190                 return ast_format_g726_aal2;
191         /*! ADPCM (IMA) */
192         case AST_FORMAT_ADPCM:
193                 return ast_format_adpcm;
194         /*! Raw 16-bit Signed Linear (8000 Hz) PCM */
195         case AST_FORMAT_SLIN:
196                 return ast_format_slin;
197         /*! LPC10, 180 samples/frame */
198         case AST_FORMAT_LPC10:
199                 return ast_format_lpc10;
200         /*! G.729A audio */
201         case AST_FORMAT_G729:
202                 return ast_format_g729;
203         /*! SpeeX Free Compression */
204         case AST_FORMAT_SPEEX:
205                 return ast_format_speex;
206         /*! iLBC Free Compression */
207         case AST_FORMAT_ILBC:
208                 return ast_format_ilbc;
209         /*! ADPCM (G.726, 32kbps, RFC3551 codeword packing) */
210         case AST_FORMAT_G726:
211                 return ast_format_g726;
212         /*! G.722 */
213         case AST_FORMAT_G722:
214                 return ast_format_g722;
215         /*! G.722.1 (also known as Siren7, 32kbps assumed) */
216         case AST_FORMAT_SIREN7:
217                 return ast_format_siren7;
218         /*! G.722.1 Annex C (also known as Siren14, 48kbps assumed) */
219         case AST_FORMAT_SIREN14:
220                 return ast_format_siren14;
221         /*! Raw 16-bit Signed Linear (16000 Hz) PCM */
222         case AST_FORMAT_SLIN16:
223                 return ast_format_slin16;
224         /*! G.719 (64 kbps assumed) */
225         case AST_FORMAT_G719:
226                 return ast_format_g719;
227         /*! SpeeX Wideband (16kHz) Free Compression */
228         case AST_FORMAT_SPEEX16:
229                 return ast_format_speex16;
230         /*! Opus audio (8kHz, 16kHz, 24kHz, 48Khz) */
231         case AST_FORMAT_OPUS:
232                 return ast_format_opus;
233         /*! Raw mu-law data (G.711) */
234         case AST_FORMAT_TESTLAW:
235                 return ast_format_testlaw;
236
237         /*! H.261 Video */
238         case AST_FORMAT_H261:
239                 return ast_format_h261;
240         /*! H.263 Video */
241         case AST_FORMAT_H263:
242                 return ast_format_h263;
243         /*! H.263+ Video */
244         case AST_FORMAT_H263P:
245                 return ast_format_h263p;
246         /*! H.264 Video */
247         case AST_FORMAT_H264:
248                 return ast_format_h264;
249         /*! MPEG4 Video */
250         case AST_FORMAT_MP4:
251                 return ast_format_mp4;
252         /*! VP8 Video */
253         case AST_FORMAT_VP8:
254                 return ast_format_vp8;
255
256         /*! JPEG Images */
257         case AST_FORMAT_JPEG:
258                 return ast_format_jpeg;
259         /*! PNG Images */
260         case AST_FORMAT_PNG:
261                 return ast_format_png;
262
263         /*! T.140 RED Text format RFC 4103 */
264         case AST_FORMAT_T140_RED:
265                 return ast_format_t140_red;
266         /*! T.140 Text format - ITU T.140, RFC 4103 */
267         case AST_FORMAT_T140:
268                 return ast_format_t140;
269         }
270         return NULL;
271 }
272