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