Mercurial > mplayer.hg
annotate libaf/format.c @ 36144:43bff9dd44be
Disable dangerous feature in ASX playlist parser.
author | reimar |
---|---|
date | Sun, 05 May 2013 17:02:30 +0000 |
parents | 389d43c448b3 |
children |
rev | line source |
---|---|
28229
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
1 /* |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
2 * Copyright (C) 2005 Alex Beregszaszi |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
3 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
4 * This file is part of MPlayer. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
5 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
9 * (at your option) any later version. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
10 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
14 * GNU General Public License for more details. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
15 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24890
diff
changeset
|
19 */ |
16115 | 20 |
14748 | 21 #include <stdio.h> |
22 #include <stdlib.h> | |
23 #include <string.h> | |
35903 | 24 #include <strings.h> |
14748 | 25 #include <inttypes.h> |
26 #include <limits.h> | |
27 | |
28 #include "af.h" | |
17863 | 29 #include "help_mp.h" |
14748 | 30 |
31 // Convert from string to format | |
19108
5e767cabf4cd
marks several read-only string parameters and function return-values which can only be used read-only as const. Patch by Stefan Huehner, stefan _AT huener-org
reynaldo
parents:
17876
diff
changeset
|
32 int af_str2fmt(const char* str) |
14748 | 33 { |
34 int format=0; | |
24595 | 35 // Scan for endianness |
14748 | 36 if(strstr(str,"be") || strstr(str,"BE")) |
37 format |= AF_FORMAT_BE; | |
38 else if(strstr(str,"le") || strstr(str,"LE")) | |
39 format |= AF_FORMAT_LE; | |
40 else | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
41 format |= AF_FORMAT_NE; |
14748 | 42 |
43 // Scan for special formats | |
44 if(strstr(str,"mulaw") || strstr(str,"MULAW")){ | |
45 format |= AF_FORMAT_MU_LAW; return format; | |
46 } | |
47 if(strstr(str,"alaw") || strstr(str,"ALAW")){ | |
48 format |= AF_FORMAT_A_LAW; return format; | |
49 } | |
50 if(strstr(str,"ac3") || strstr(str,"AC3")){ | |
30241
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30236
diff
changeset
|
51 format |= AF_FORMAT_AC3 | AF_FORMAT_16BIT; return format; |
14748 | 52 } |
53 if(strstr(str,"mpeg2") || strstr(str,"MPEG2")){ | |
54 format |= AF_FORMAT_MPEG2; return format; | |
55 } | |
34103 | 56 if(strstr(str,"iec61937") || strstr(str,"IEC61937")){ |
57 format |= AF_FORMAT_IEC61937 | AF_FORMAT_16BIT; return format; | |
58 } | |
14748 | 59 if(strstr(str,"imaadpcm") || strstr(str,"IMAADPCM")){ |
60 format |= AF_FORMAT_IMA_ADPCM; return format; | |
61 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
62 |
14748 | 63 // Scan for int/float |
64 if(strstr(str,"float") || strstr(str,"FLOAT")){ | |
65 format |= AF_FORMAT_F; return format; | |
66 } | |
67 else | |
68 format |= AF_FORMAT_I; | |
69 | |
70 // Scan for signed/unsigned | |
71 if(strstr(str,"unsigned") || strstr(str,"UNSIGNED")) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
72 format |= AF_FORMAT_US; |
14748 | 73 else |
74 format |= AF_FORMAT_SI; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
75 |
14748 | 76 return format; |
77 } | |
78 | |
24890 | 79 int af_fmt2bits(int format) |
14748 | 80 { |
30236
cb2e10d85c04
Add a hack to af_fmt2bits to recognize AC3 as a 16-bit format, since this
reimar
parents:
29263
diff
changeset
|
81 if (AF_FORMAT_IS_AC3(format)) return 16; |
14748 | 82 return (format & AF_FORMAT_BITS_MASK)+8; |
83 // return (((format & AF_FORMAT_BITS_MASK)>>3)+1) * 8; | |
84 #if 0 | |
85 switch(format & AF_FORMAT_BITS_MASK) | |
86 { | |
87 case AF_FORMAT_8BIT: return 8; | |
88 case AF_FORMAT_16BIT: return 16; | |
89 case AF_FORMAT_24BIT: return 24; | |
90 case AF_FORMAT_32BIT: return 32; | |
91 case AF_FORMAT_48BIT: return 48; | |
92 } | |
93 #endif | |
94 return -1; | |
95 } | |
96 | |
24890 | 97 int af_bits2fmt(int bits) |
14748 | 98 { |
99 return (bits/8 - 1) << 3; | |
100 } | |
101 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
102 /* Convert format to str input str is a buffer for the |
14748 | 103 converted string, size is the size of the buffer */ |
104 char* af_fmt2str(int format, char* str, int size) | |
105 { | |
106 int i=0; | |
107 | |
108 if (size < 1) | |
109 return NULL; | |
110 size--; // reserve one for terminating 0 | |
111 | |
24595 | 112 // Endianness |
14748 | 113 if(AF_FORMAT_LE == (format & AF_FORMAT_END_MASK)) |
114 i+=snprintf(str,size-i,"little-endian "); | |
115 else | |
116 i+=snprintf(str,size-i,"big-endian "); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
117 |
14748 | 118 if(format & AF_FORMAT_SPECIAL_MASK){ |
119 switch(format & AF_FORMAT_SPECIAL_MASK){ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
120 case(AF_FORMAT_MU_LAW): |
14748 | 121 i+=snprintf(&str[i],size-i,"mu-law "); break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
122 case(AF_FORMAT_A_LAW): |
14748 | 123 i+=snprintf(&str[i],size-i,"A-law "); break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
124 case(AF_FORMAT_MPEG2): |
14748 | 125 i+=snprintf(&str[i],size-i,"MPEG-2 "); break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
126 case(AF_FORMAT_AC3): |
14748 | 127 i+=snprintf(&str[i],size-i,"AC3 "); break; |
34103 | 128 case(AF_FORMAT_IEC61937): |
129 i+=snprintf(&str[i],size-i,"IEC61937 "); break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
130 case(AF_FORMAT_IMA_ADPCM): |
14748 | 131 i+=snprintf(&str[i],size-i,"IMA-ADPCM "); break; |
132 default: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
133 i+=snprintf(&str[i],size-i,MSGTR_AF_FORMAT_UnknownFormat); |
14748 | 134 } |
135 } | |
136 else{ | |
137 // Bits | |
138 i+=snprintf(&str[i],size-i,"%d-bit ", af_fmt2bits(format)); | |
139 | |
140 // Point | |
141 if(AF_FORMAT_F == (format & AF_FORMAT_POINT_MASK)) | |
142 i+=snprintf(&str[i],size-i,"float "); | |
143 else{ | |
144 // Sign | |
145 if(AF_FORMAT_US == (format & AF_FORMAT_SIGN_MASK)) | |
146 i+=snprintf(&str[i],size-i,"unsigned "); | |
147 else | |
148 i+=snprintf(&str[i],size-i,"signed "); | |
149 | |
150 i+=snprintf(&str[i],size-i,"int "); | |
151 } | |
152 } | |
153 // remove trailing space | |
154 if (i > 0 && str[i - 1] == ' ') | |
155 i--; | |
156 str[i] = 0; // make sure it is 0 terminated. | |
157 return str; | |
158 } | |
159 | |
16259
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
160 static struct { |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
161 const char *name; |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
162 const int format; |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
163 } af_fmtstr_table[] = { |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
164 { "mulaw", AF_FORMAT_MU_LAW }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
165 { "alaw", AF_FORMAT_A_LAW }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
166 { "mpeg2", AF_FORMAT_MPEG2 }, |
30241
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30236
diff
changeset
|
167 { "ac3le", AF_FORMAT_AC3_LE }, |
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30236
diff
changeset
|
168 { "ac3be", AF_FORMAT_AC3_BE }, |
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30236
diff
changeset
|
169 { "ac3ne", AF_FORMAT_AC3_NE }, |
34103 | 170 { "iec61937le", AF_FORMAT_IEC61937_LE }, |
171 { "iec61937be", AF_FORMAT_IEC61937_BE }, | |
172 { "iec61937ne", AF_FORMAT_IEC61937_NE }, | |
16259
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
173 { "imaadpcm", AF_FORMAT_IMA_ADPCM }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
174 |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
175 { "u8", AF_FORMAT_U8 }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
176 { "s8", AF_FORMAT_S8 }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
177 { "u16le", AF_FORMAT_U16_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
178 { "u16be", AF_FORMAT_U16_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
179 { "u16ne", AF_FORMAT_U16_NE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
180 { "s16le", AF_FORMAT_S16_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
181 { "s16be", AF_FORMAT_S16_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
182 { "s16ne", AF_FORMAT_S16_NE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
183 { "u24le", AF_FORMAT_U24_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
184 { "u24be", AF_FORMAT_U24_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
185 { "u24ne", AF_FORMAT_U24_NE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
186 { "s24le", AF_FORMAT_S24_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
187 { "s24be", AF_FORMAT_S24_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
188 { "s24ne", AF_FORMAT_S24_NE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
189 { "u32le", AF_FORMAT_U32_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
190 { "u32be", AF_FORMAT_U32_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
191 { "u32ne", AF_FORMAT_U32_NE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
192 { "s32le", AF_FORMAT_S32_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
193 { "s32be", AF_FORMAT_S32_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
194 { "s32ne", AF_FORMAT_S32_NE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
195 { "floatle", AF_FORMAT_FLOAT_LE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
196 { "floatbe", AF_FORMAT_FLOAT_BE }, |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
197 { "floatne", AF_FORMAT_FLOAT_NE }, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
198 |
16259
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
199 { NULL, 0 } |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
200 }; |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
201 |
19108
5e767cabf4cd
marks several read-only string parameters and function return-values which can only be used read-only as const. Patch by Stefan Huehner, stefan _AT huener-org
reynaldo
parents:
17876
diff
changeset
|
202 const char *af_fmt2str_short(int format) |
14748 | 203 { |
16259
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
204 int i; |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
205 |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
206 for (i = 0; af_fmtstr_table[i].name; i++) |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
207 if (af_fmtstr_table[i].format == format) |
19109
6e840952870d
Removes an unneeded cast. Patch by Stefan Huehner, stefan AT.. huehner.org
reynaldo
parents:
19108
diff
changeset
|
208 return af_fmtstr_table[i].name; |
16259
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
209 |
14748 | 210 return "??"; |
211 } | |
212 | |
19108
5e767cabf4cd
marks several read-only string parameters and function return-values which can only be used read-only as const. Patch by Stefan Huehner, stefan _AT huener-org
reynaldo
parents:
17876
diff
changeset
|
213 int af_str2fmt_short(const char* str) |
14748 | 214 { |
215 int i; | |
216 | |
16259
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
217 for (i = 0; af_fmtstr_table[i].name; i++) |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
218 if (!strcasecmp(str, af_fmtstr_table[i].name)) |
bf5ee9e17e00
code reduction and less error prone, use the same table
alex
parents:
16115
diff
changeset
|
219 return af_fmtstr_table[i].format; |
14748 | 220 |
221 return -1; | |
222 } |