Mercurial > mplayer.hg
comparison libaf/af_format.c @ 14335:8380694ba14f
af_bits2fmt and af_str2fmt_short, also removed the extra FORMAT_BPS control in format.c
author | alex |
---|---|
date | Mon, 03 Jan 2005 18:59:16 +0000 |
parents | 5a2473f37499 |
children | 1a882e2a419b |
comparison
equal
deleted
inserted
replaced
14334:8ba01beafb7e | 14335:8380694ba14f |
---|---|
106 case AF_FORMAT_32BIT: return 32; | 106 case AF_FORMAT_32BIT: return 32; |
107 case AF_FORMAT_48BIT: return 48; | 107 case AF_FORMAT_48BIT: return 48; |
108 } | 108 } |
109 #endif | 109 #endif |
110 return -1; | 110 return -1; |
111 } | |
112 | |
113 inline int af_bits2fmt(int bits) | |
114 { | |
115 return (bits/8 - 1) << 3; | |
111 } | 116 } |
112 | 117 |
113 /* Convert format to str input str is a buffer for the | 118 /* Convert format to str input str is a buffer for the |
114 converted string, size is the size of the buffer */ | 119 converted string, size is the size of the buffer */ |
115 char* af_fmt2str(int format, char* str, int size) | 120 char* af_fmt2str(int format, char* str, int size) |
192 case AF_FORMAT_FLOAT_BE: return "floatbe"; | 197 case AF_FORMAT_FLOAT_BE: return "floatbe"; |
193 } | 198 } |
194 return "??"; | 199 return "??"; |
195 } | 200 } |
196 | 201 |
202 int af_str2fmt_short(char* str) | |
203 { | |
204 int i; | |
205 static struct { | |
206 const char *name; | |
207 const int format; | |
208 } table[] = { | |
209 { "mulaw", AF_FORMAT_MU_LAW }, | |
210 { "alaw", AF_FORMAT_A_LAW }, | |
211 { "mpeg2", AF_FORMAT_MPEG2 }, | |
212 { "ac3", AF_FORMAT_AC3 }, | |
213 { "imaadpcm", AF_FORMAT_IMA_ADPCM }, | |
214 | |
215 { "u8", AF_FORMAT_U8 }, | |
216 { "s8", AF_FORMAT_S8 }, | |
217 { "u16le", AF_FORMAT_U16_LE }, | |
218 { "u16be", AF_FORMAT_U16_BE }, | |
219 { "u16ne", AF_FORMAT_U16_NE }, | |
220 { "s16le", AF_FORMAT_S16_LE }, | |
221 { "s16be", AF_FORMAT_S16_BE }, | |
222 { "s16ne", AF_FORMAT_S16_NE }, | |
223 { "u24le", AF_FORMAT_U24_LE }, | |
224 { "u24be", AF_FORMAT_U24_BE }, | |
225 { "u24ne", AF_FORMAT_U24_NE }, | |
226 { "s24le", AF_FORMAT_S24_LE }, | |
227 { "s24be", AF_FORMAT_S24_BE }, | |
228 { "s24ne", AF_FORMAT_S24_NE }, | |
229 { "u32le", AF_FORMAT_U32_LE }, | |
230 { "u32be", AF_FORMAT_U32_BE }, | |
231 { "u32ne", AF_FORMAT_U32_NE }, | |
232 { "s32le", AF_FORMAT_S32_LE }, | |
233 { "s32be", AF_FORMAT_S32_BE }, | |
234 { "s32ne", AF_FORMAT_S32_NE }, | |
235 { "floatle", AF_FORMAT_FLOAT_LE }, | |
236 { "floatbe", AF_FORMAT_FLOAT_BE }, | |
237 { "floatne", AF_FORMAT_FLOAT_NE }, | |
238 | |
239 { NULL, 0 } | |
240 }; | |
241 | |
242 for (i = 0; table[i].name; i++) | |
243 if (!strcasecmp(str, table[i].name)) | |
244 return table[i].format; | |
245 | |
246 return -1; | |
247 } | |
248 | |
197 // Helper functions to check sanity for input arguments | 249 // Helper functions to check sanity for input arguments |
198 | 250 |
199 // Sanity check for bytes per sample | 251 // Sanity check for bytes per sample |
200 static int check_bps(int bps) | 252 static int check_bps(int bps) |
201 { | 253 { |
210 // Check for unsupported formats | 262 // Check for unsupported formats |
211 static int check_format(int format) | 263 static int check_format(int format) |
212 { | 264 { |
213 char buf[256]; | 265 char buf[256]; |
214 switch(format & AF_FORMAT_SPECIAL_MASK){ | 266 switch(format & AF_FORMAT_SPECIAL_MASK){ |
267 case(AF_FORMAT_IMA_ADPCM): | |
215 case(AF_FORMAT_MPEG2): | 268 case(AF_FORMAT_MPEG2): |
216 case(AF_FORMAT_AC3): | 269 case(AF_FORMAT_AC3): |
217 af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n", | 270 af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n", |
218 af_fmt2str(format,buf,255)); | 271 af_fmt2str(format,buf,255)); |
219 return AF_ERROR; | 272 return AF_ERROR; |
277 af->play = play_s16_float; | 330 af->play = play_s16_float; |
278 } | 331 } |
279 return AF_OK; | 332 return AF_OK; |
280 } | 333 } |
281 case AF_CONTROL_COMMAND_LINE:{ | 334 case AF_CONTROL_COMMAND_LINE:{ |
282 int bps = 2; | 335 int format = af_str2fmt_short(arg); |
283 int format = AF_FORMAT_NE; | 336 if(AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format)) |
284 char str[256]; | |
285 str[0] = '\0'; | |
286 sscanf((char*)arg,"%i:%s",&bps,str); | |
287 // Convert string to format | |
288 format = af_str2fmt(str); | |
289 | |
290 // Automatic correction of errors | |
291 switch(format & AF_FORMAT_SPECIAL_MASK){ | |
292 case(AF_FORMAT_A_LAW): | |
293 case(AF_FORMAT_MU_LAW): | |
294 bps=1; break; | |
295 case(AF_FORMAT_AC3): | |
296 bps=4; break; // I think | |
297 } | |
298 if(AF_FORMAT_F == (format & AF_FORMAT_POINT_MASK)) | |
299 bps=4; | |
300 | |
301 // set appropriate AF_FORMAT_BITS | |
302 format |= (bps-1)<<3; // hack | |
303 | |
304 if((AF_OK != af->control(af,AF_CONTROL_FORMAT_BPS | AF_CONTROL_SET,&bps)) || | |
305 (AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format))) | |
306 return AF_ERROR; | 337 return AF_ERROR; |
307 return AF_OK; | 338 return AF_OK; |
308 } | 339 } |
309 case AF_CONTROL_FORMAT_BPS | AF_CONTROL_SET: | 340 case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET:{ |
310 // Reinit must be called after this function has been called | |
311 | |
312 // Check for errors in configuraton | |
313 if(AF_OK != check_bps(*(int*)arg)) | |
314 return AF_ERROR; | |
315 | |
316 af->data->bps = *(int*)arg; | |
317 return AF_OK; | |
318 case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET: | |
319 // Reinit must be called after this function has been called | |
320 | |
321 // Check for errors in configuraton | 341 // Check for errors in configuraton |
322 if(AF_OK != check_format(*(int*)arg)) | 342 if(AF_OK != check_format(*(int*)arg)) |
323 return AF_ERROR; | 343 return AF_ERROR; |
324 | 344 |
325 af->data->format = *(int*)arg; | 345 af->data->format = *(int*)arg; |
346 af->data->bps = af_fmt2bits(af->data->format)/8; | |
347 | |
326 return AF_OK; | 348 return AF_OK; |
349 } | |
327 } | 350 } |
328 return AF_UNKNOWN; | 351 return AF_UNKNOWN; |
329 } | 352 } |
330 | 353 |
331 // Deallocate memory | 354 // Deallocate memory |